直线检测之Hough变换(霍夫变换)

霍夫变换,英文名称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 ymx=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 (xc1)2+(yc2)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 c1c2,求出满足上式的 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一叶执念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值