874 字
4 分钟
[计算机视觉] 霍夫变换
霍夫变换是一种「投票」方法,记录每条可能线上每个边缘点的投票,寻找投票数最多的线段,用于实现线段检测、圆形检测等
对线的参数化
常见的直线表示方式:
但它们都存在问题:
- 斜率-截距形式在垂直线时斜率趋于无穷大,无法表示垂直线
- 一般式存在无穷多解,无法唯一确定一条线
- 截距式在垂直线时截距趋于无穷大,无法表示垂直线
所以霍夫变换使用极坐标形式(法线式):
参数空间
霍夫变换使用了参数空间的概念,平常我们用(x, y)来表示图像空间中的点,而在霍夫变换中,我们用(θ, ρ)来表示参数空间中的点,因此参数空间中的每个点(θ, ρ)都对应图像空间中的一条线段,而图像空间中的每个点(x, y)都对应参数空间中的一条曲线(正余弦波)
当图像空间中有两个点时,它们在参数空间中对应的曲线会相交于一个点(θ, ρ),这个点就代表了图像空间中通过这两个点的线段的参数,因此我们可以通过统计参数空间中每个点(θ, ρ)的投票数,来找到图像空间中出现频率最高的线段,而那个线段就是图像中最可能存在的线段
写程序时通常以1度为步长在[0, 180)范围内枚举θ,计算对应的ρ
霍夫圆变换
对于圆的参数化,使用圆心坐标和半径:
然后会发现圆方程在两个空间内是对应的:
调换一下位置即得到了参数空间内的形式(会发现r的大小是固定的,所以不用参与到参数空间内),所以图像空间中的一个点在参数空间中对应一个圆,图像空间中的三个点在参数空间中就对应三个圆,这三个圆的交点就是图像空间中通过这三个点的圆的参数,因此我们可以通过统计参数空间中每个点(a, b)的投票数,来找到图像空间中出现频率最高的圆,而那个圆就是图像中最可能存在的圆
但如果未知,则需要在参数空间中增加一个维度来枚举,这样就会增加计算复杂度,所以通常会使用霍夫梯度法
霍夫梯度法检测圆形
这个反而更好理解,因为都没参数空间什么事了
步骤:
- 对图像进行边缘检测,得到边缘点
- 对每个边缘点,使用sobel算子计算其梯度方向(法线),得到一个单位向量
- 沿着梯度方向的反方向(因为圆心在边缘点的内侧),以不同的半径为步长,给经过的每一个点累加,每有一条线经过就+1
- 累加值最大的点就是圆心,计算圆心和边缘点之间的距离就是半径
[计算机视觉] 霍夫变换
https://alkaid114.github.io/posts/cv/hough/