霍夫变换,英文名称Hough Transform,作用是用来检测图像中的直线或者圆等几何图形的。
给定一张图像中的n个点,假设我们希望找到这些点中一个位于直线上的点集,一种可行的解决方法是,先找到所有由每对点确定的直线,然后寻找靠近特定直线的点的所有子集。这种方法涉及寻找n(n-1)/2~n^2 条直线,然后对每个点。与所有直线执行(n)(n(n-1))/2~n^3次比较。这种方法因为计算量太大基本上没有应用价值。
霍夫[Hough 1962]提出一种替代方法,通常称为霍夫变换。考虑xy平面上的一个点 ( x i , y i ) (x_i,y_i) (xi,yi)和斜截式形式为 y i = a x i + b y_i=ax_i+b yi=axi+b的一条直线。我们知道通过点 ( x i , y i ) (x_i,y_i) (xi,yi)的直线有无数条,且对于不同的a,b值,它们都满足方程 y i = a x i + b y_i=ax_i+b yi=axi+b。
然而,若我们将等式写为 b = − x i a + y i b=-x_ia+y_i b=−xia+yi,并考虑ab平面(也称为参数空间),将得到固定点 ( x i , y i ) (x_i,y_i) (xi,yi)的单条直线方程,该直线是唯一确定的。 v v v
此外,对于第二个点 ( x j , y j ) (x_j,y_j) (xj,yj)在参数空间中也有一条与之对应的直线,除非它们平行,否则这条直线会与 ( x i , y i ) (x_i,y_i) (xi,yi)对应的直线相较于点 ( a , b ) (a,b) (a,b)。其中a为斜率,b是包含xy平面中点 ( x i , y i ) (x_i,y_i) (xi,yi)和点 ( x j , y j ) (x_j,y_j) (xj,yj)的直线的截距。事实上,这条直线上的所有点在参数空间中都有相交于 ( a , b ) (a,b) (a,b)的直线。
下图形象的说明了霍夫变换的过程:
如上图所示,左边图中有四个点:(-2,-2),(1,1),(1,-1)以及(3,3)。要从这四个点中确定一条最可能的直线。假设直线方程为
y
=
m
x
+
b
y=mx+b
y=mx+b
将其转化为参数空间方程:
y
−
m
x
=
b
y-mx=b
y−mx=b
根据该参数空间中唯一确定的四条直线,可以直观的看出其中三条直线交于一个点,则说明这三个点实际上在一条直线上,直线的参数m以及b由参数空间交点确定。
m
=
1
,
b
=
0
m=1,b=0
m=1,b=0
由此可以确定左图中的直线方程为:
y
=
x
y=x
y=x
实际上根据左图我们确实可以看出直线方程与求解的结果是一样的。
理论上,可以画出对应于xy平面中所有点
(
x
k
,
y
k
)
(x_k,y_k)
(xk,yk)的参数空间直线,且空间中的主要直线可以在参数空间中通过确定的点来找到,参数空间中的大量线在此点处相交。但这种方法的一个问题是,当该直线逼近垂直方向时,a(直线的斜率)会趋向于无限大。解决该问题的方法之一是,使用一条直线的法线表示:
x
c
o
s
θ
+
y
s
i
n
θ
=
ρ
xcos\theta+ysin\theta=\rho
xcosθ+ysinθ=ρ
其中,ρ代表直线到原点的垂直距离,θ代表x轴到直线垂线的角度,取值范围为±90∘,如图所示。
与直角坐标类似,极坐标中的Hough变换也将图像坐标空间中的点变换到参数空间中。
更直观的,直角坐标系的三点共线,对应于 ρ − θ空间的多线共点。
在极坐标空间使用hough变换来检测直线的思想就是:为每一个点假设n个方向的直线,通常n=180,此时检测的直线的角度精度为1°,分别计算这n条直线的
(
ρ
,
θ
)
(\rho,\theta)
(ρ,θ)坐标,得到n个坐标点。如果要判断的点共有N个,最终得到的
(
ρ
,
θ
)
(\rho,\theta)
(ρ,θ)坐标有N * n个。有关这N * n个
(
ρ
,
θ
)
(\rho,\theta)
(ρ,θ)坐标,其中 θ是离散的角度,共有180个取值。
最重要的地方来了,如果多个点在一条直线上,那么必有这多个点在 θ =某个值 θ i \theta_{i} θi时,这多个点的 ρ \rho ρ 近似相等于 ρ i \rho_{i} ρi ,也就是说这多个点都在极坐标直线 ( ρ i , θ i ) (\rho_i,\theta_i) (ρi,θi)上。
换句话说,在极坐标表示下,原图像坐标空间中共线的点变换到参数空间中后,在参数空间都相交于同一点,此时所得到的 ρ \rho ρ、 θ \theta θ即为所求的直线的极坐标参数。与直角坐标不同的是,用极坐标表示时,图像坐标空间的共线的两点 ( x i , y i ) (x_i,y_i) (xi,yi)和 ( x j , y j ) (x_j,y_j) (xj,yj)映射到参数空间是两条正弦曲线或者参数空间的直线上,相交于点 ( ρ 0 , θ 0 ) (\rho_0,\theta_0) (ρ0,θ0)。
类似于这样一个例子:
这张图对应的是直角坐标系下的,但是原理上来说是一样的。对于每一根直角坐标系下的直线(极坐标系下的曲线),对其两个参数中的其中一个参数取整,求出另一个参数并取整,这样得到一系列离散的整数点。将这些整数点所在的网格+1,即得到每个网格被直线经过的次数。例如上图中两条直线经过一系列的格子并存在一个交点。则网格中被经过的点的值都被+1,而相交的点被进行了两次+1,所以该点变成了+2。在将所有直线经过的网格全部统计完成后,就可以看到哪个网格被直线经过的最多,该点也就是所有参数坐标系的交点。
霍夫变换的魅力就在于可将 ρ \rho ρ、 θ \theta θ参数空间划分为所谓的累加单元。坐标 ( i , j ) (i,j) (i,j)处的单元具有累加值 A ( i , j ) A(i,j) A(i,j)。最初,对于xy平面中的每个非背景点 ( x k , y k ) (x_k,y_k) (xk,yk),令 θ \theta θ等于 θ \theta θ轴上每个允许的细分值,同时使用方程 ρ = x k c o s θ + y k s i n θ \rho=x_kcos\theta+y_ksin\theta ρ=xkcosθ+yksinθ解出对应的 ρ \rho ρ。对得到的 ρ \rho ρ进行四舍五入,得到沿 ρ \rho ρ轴的最近接的允许单元值。若选择的一个 θ p \theta_p θp值得到解 ρ q \rho_q ρq,则令 A ( p , q ) = A ( p , q ) + 1 A(p,q)=A(p,q)+1 A(p,q)=A(p,q)+1。在这一过程结束后, A ( i , j ) A(i,j) A(i,j)中的值P将意味着xy平面中有P个点位于直线 x c o s θ j + y s i n θ j = ρ i xcos\theta_j+ysin\theta_j=\rho_i xcosθj+ysinθj=ρi上。 ρ \rho ρ、 θ \theta θ平面中的细分数量决定了这些点的共线精度。
虽然上述例子将霍夫变换应用于直线检测上,但实际上霍夫变换适用于形如
g
(
v
,
c
)
=
0
g(v,c)=0
g(v,c)=0的任何函数。其中
v
v
v是坐标向量,
c
c
c是系数向量。例如位于圆:
(
x
−
c
1
)
2
+
(
y
−
c
2
)
2
=
c
3
2
(x-c_1)^2+(y-c_2)^2=c_3^2
(x−c1)2+(y−c2)2=c32
上的点可以使用刚才的讨论方法来检测。不同之处是存在3个参数
(
c
1
,
c
2
,
c
3
)
(c_1,c_2,c_3)
(c1,c2,c3),在三维参数空间中,这三个参数导致了类似于立体的单元和形如
A
(
i
,
j
,
k
)
A(i,j,k)
A(i,j,k)的累加器。过程是,增加
c
1
和
c
2
c_1和c_2
c1和c2,求出满足上式的
c
3
c_3
c3,并更新与三元数组
(
c
1
,
c
2
,
c
3
)
(c_1,c_2,c_3)
(c1,c2,c3)相关联的累加单元。很明显,霍夫变换的复杂性取决于给定函数表达式中的坐标和系数数量。霍夫变换有可能进一步推广到检测无简单解析表达式的曲线,如变换为灰度级图像那样的应用。
参考文献:
1、https://blog.csdn.net/u010712012/article/details/86104053
2、https://blog.csdn.net/zzyczzyc/article/details/86104601
3、冈萨雷斯 数字图像处理第三版 PP:472-475