874 字
4 分钟
[计算机视觉] 霍夫变换

霍夫变换是一种「投票」方法,记录每条可能线上每个边缘点的投票,寻找投票数最多的线段,用于实现线段检测、圆形检测等

对线的参数化#

常见的直线表示方式:

y=kx+b(斜率-截距形式)Ax+By+C=0(一般式)xa+yb=1(截距式)\begin{aligned} y = kx + b \quad \text{(斜率-截距形式)} \\ Ax + By + C = 0 \quad \text{(一般式)} \\ \frac{x}{a} + \frac{y}{b} = 1 \quad \text{(截距式)} \end{aligned}

但它们都存在问题:

  • 斜率-截距形式在垂直线时斜率趋于无穷大,无法表示垂直线
  • 一般式存在无穷多解,无法唯一确定一条线
  • 截距式在垂直线时截距趋于无穷大,无法表示垂直线

所以霍夫变换使用极坐标形式(法线式):

xcosθ+ysinθ=ρx \cos\theta + y \sin\theta = \rho

参数空间#

霍夫变换使用了参数空间的概念,平常我们用(x, y)来表示图像空间中的点,而在霍夫变换中,我们用(θ, ρ)来表示参数空间中的点,因此参数空间中的每个点(θ, ρ)都对应图像空间中的一条线段,而图像空间中的每个点(x, y)都对应参数空间中的一条曲线(正余弦波)

当图像空间中有两个点时,它们在参数空间中对应的曲线会相交于一个点(θ, ρ),这个点就代表了图像空间中通过这两个点的线段的参数,因此我们可以通过统计参数空间中每个点(θ, ρ)的投票数,来找到图像空间中出现频率最高的线段,而那个线段就是图像中最可能存在的线段

写程序时通常以1度为步长在[0, 180)范围内枚举θ,计算对应的ρ

霍夫圆变换#

对于圆的参数化,使用圆心坐标和半径:

(xa)2+(yb)2=r2(x - a)^2 + (y - b)^2 = r^2

然后会发现圆方程在两个空间内是对应的:

(ax)2+(by)2=r2(a - x)^2 + (b - y)^2 = r^2

调换一下位置即得到了参数空间内的形式(会发现r的大小是固定的,所以不用参与到参数空间内),所以图像空间中的一个点在参数空间中对应一个圆,图像空间中的三个点在参数空间中就对应三个圆,这三个圆的交点就是图像空间中通过这三个点的圆的参数,因此我们可以通过统计参数空间中每个点(a, b)的投票数,来找到图像空间中出现频率最高的圆,而那个圆就是图像中最可能存在的圆

但如果rr未知,则需要在参数空间中增加一个维度来枚举rr,这样就会增加计算复杂度,所以通常会使用霍夫梯度法

霍夫梯度法检测圆形#

这个反而更好理解,因为都没参数空间什么事了

步骤:

  1. 对图像进行边缘检测,得到边缘点
  2. 对每个边缘点,使用sobel算子计算其梯度方向(法线),得到一个单位向量
  3. 沿着梯度方向的反方向(因为圆心在边缘点的内侧),以不同的半径rr为步长,给经过的每一个点累加,每有一条线经过就+1
  4. 累加值最大的点就是圆心,计算圆心和边缘点之间的距离就是半径
[计算机视觉] 霍夫变换
https://alkaid114.github.io/posts/cv/hough/
作者
Alkaid114
发布于
2026-06-06
许可协议
CC BY-NC-SA 4.0