霍夫变换(Hough Transform)原理简要介绍
📘 霍夫变换(Hough Transform)
参考1:OpenCV
参考2:bilibili,我觉得讲的蛮好
一、什么是霍夫变换?
霍夫变换是一种用于在图像中检测几何形状的经典算法。它最常用来检测直线,也可以扩展到检测圆、椭圆等其他形状。
它的核心思想是:
将图像空间中的点转换到参数空间中进行“投票”,找出最有可能存在的几何结构。
二、为什么用霍夫变换?
在图像中直接找直线并不容易,因为:
- 图像可能有噪声或断开的边缘
- 直线可能被遮挡或部分缺失
而霍夫变换通过统计所有边缘点对各种可能直线的“支持程度”,可以有效识别出图像中真实存在的直线。
三、直线检测的基本思路
1. 直线的数学表示
一条直线可以用多种方式表示:
- 斜截式:y = kx + b → 不适合垂直直线(k无穷大)
- 极坐标式:ρ = x cos(θ) + y sin(θ)
✅ 在霍夫变换中使用的是极坐标形式,其中:
- ρ 是原点到这条直线的垂直距离
- θ 是这条垂线与 x 轴之间的夹角
2. 参数空间(霍夫空间)
每条直线由两个参数决定:ρ 和 θ。我们可以建立一个二维空间来表示这些参数:
- 横轴:θ,范围通常是 0° 到 180°
- 纵轴:ρ,范围根据图像大小确定(如 -500 到 +500)
这个空间就叫做霍夫空间,或者参数空间。
四、霍夫变换的核心步骤
步骤 1:提取图像中的边缘点
首先使用边缘检测算法(如 Canny)得到图像中所有的边缘点。
- 这些点是我们要用来“投票”给潜在直线的关键点。
步骤 2:每个点都“投票”给所有可能经过它的直线
对于每一个边缘点 (x, y):
- 遍历角度 θ 的所有可能值(比如从 0° 到 180°,每次增加 1°)
- 对于每一个 θ,计算对应的 ρ
- 得到一组 (ρ, θ),代表一条可能经过该点的直线
- 在参数空间中,对这个位置“加 1 票”
每个点都会产生很多组 (ρ, θ),也就是在参数空间中留下很多“投票”。
步骤 3:参数空间中出现最多“票数”的位置就是图像中最可能的直线
在参数空间中:
哪些 (ρ, θ) 出现的次数最多?
这些位置就代表图像中最有可能存在的直线!
就像选举一样,得票最多的候选人胜出。
五、如何理解“每个点都要遍历 0°~180°”?
这是很多人疑惑的地方。
其实很简单:
- 每个点都可以属于无数条直线。
- 我们不可能穷尽所有角度,所以设定一个步长(如 1°),在这个范围内逐一尝试。
- 每次尝试一个角度,算出对应的半径 ρ,就得到了一组可能的直线参数。
- 然后在这个参数组合上加一票。
所以,每个点都会为 180 个不同的角度分别生成一个 ρ,并在参数空间中对应的位置“投票”。
六、累加器数组的作用
为了记录所有“投票”,我们使用一个二维数组,称为累加器(Accumulator)。
- 行表示 ρ
- 列表示 θ
- 数组中的数值表示有多少个点“认为”这条直线存在
最终,找到累加器中数值最高的几个位置,就找到了图像中最可能的几条直线。
七、精度问题:连续 vs 离散
虽然 ρ 和 θ 在数学上是连续的,但我们在实现时必须将其离散化:
- 角度 θ 通常按 1° 分辨率取值
- 半径 ρ 也按 1 像素为单位进行划分
这就会带来一定的误差,但我们可以通过调整分辨率来控制这种误差的影响。
- 类似于把一个光滑曲线画在方格纸上,虽然不能完全精确,但只要格子够小,就能非常接近真实结果。
八、总结一句话
霍夫变换的本质是:让图像中的每个边缘点为所有可能经过它的直线“投票”,最后找出得票最多的那几条直线。