霍夫变换详细解释

霍夫变换

1.What
霍夫变换是一种特征提取手段,用来提取形状(直线,圆等)边界[1]。

2.Why
形状边界假设是直线,这条线是很多点组成的一个集合。处理这个集合,比处理一个点要复杂的多。简单讲,霍夫变换就是想把一条线(边界)用点来处理,这样就会更容易提取出边界。

3.How
前面提到把线换成点来处理,其实是通过空间变换来实现的,变换后的空间就是霍夫空间。
3.1霍夫空间
直角坐标系(x,y)空间中,每条直线y = mx + c可以由两个参数确认:
(1)斜率m
(2)Y轴上的截距c
如果将m,c看成是自变量,有c=-xm+y,这个(m,c)空间就是霍夫空间。
3.2霍夫变换
3.2.1概念
对于(x, y)空间上的某个点(x1, y1)有y1 = m*x1 + c,则c = -x1*m + y1,这也就是霍夫空间上的一条直线。
对于(x, y)空间上的某条直线有y = m1*x + c1,则c1 = -x*m1 + y,这也就是霍夫空间上的一个点(m1, c1)。
总结:(x, y)空间 -> (m, c)空间,点变成直线,直线变成点。

3.2.2特点
如下图,左边(x, y)空间,右边是(m, c)空间
p1,p2,p3,p4是(x, y)空间上4个点。对应(m, c)空间上4条直线l1,l2,l3,l4。l1和l2的焦点的值,(m1, c1),对应的是(x, y)空间上穿过p1和p2点的直线的斜率和截距。同理l3和l4的焦点的值,(m2, c2)对应的是(x, y)空间上穿过p3和p4点的直线的斜率和截距。明白这个道理,就已经掌握这个变换的整个过程了。

霍夫变换详细解释_第1张图片

3.2.3检测直线
检测(x, y)空间上直线:
(1)在霍夫空间中,统计直线的焦点次数,比如上图l1,l2,l3这三条直线的焦点,分别是l1,l2; l2,l3; l1,l3。因此次数是3。把这种统计焦点的次数称为投票。
(2)将统计好的点的次数,列表,如下

Points

No. of Votes

(m11, c81)

50

(m29, c36)

80

(m30, c70)

60

3个点分别是50,80,60次。这样就可以设定一个阈值,如果阈值为55,那么最终得到的点就是(29, 36), (30, 70)对应的是(x, y)空间上两条直线。
(3)准确度
准确度是由每次m和c的值增加的步幅来确定的,比如m和c的步幅为step1 = 1和step2 = 2,那么(m, c)在step1遍历的点比step2要多,因此准确度更高。
(4)问题
如果(x, y)空间上的直线是一个趋近于竖直的线,这时截距可能就是一个无限大的数,这个数要在(m, c)空间上怎么表示呢,在计算机中怎么处理呢?因此这个(m, c)空间不能够很好的处理这些“特殊”的直线。

3.3极坐标系下的霍夫空间
为解决3.2.3中(4)的问题,我们将霍夫空间换成极坐标表示。(x, y)空间上的直线在极坐标系中表示如下:r = x1cos(Θ)+y1sin(Θ),r是原点到直线的垂直距离,Θ是“距离”这个线段与x轴的夹角。如下图[2]

霍夫变换详细解释_第2张图片

Θ范围(-90,+90),

r范围(0,diagonal_length),diagonal_length是原图对角 线长度。

变换关系
(x, y)空间上的直线对应在(r, Θ)空间仍然是点,但是(x, y)空间上的点对应在(r, Θ)空间是正弦曲线。同样采用“投票”机制,(r, Θ)空间下,两条正弦曲线相交一个点,就把这个点被相交的次数+1的。这个交点就是对应(x, y)空间上穿过两条正弦曲线对应的点的直线。如下图

霍夫变换详细解释_第3张图片

为了记录这些“投票”结果,可以用一个二维矩阵作为累加器来实现,(Θ, r)作为矩阵的元素。对于每个(x, y)空间上的点,变换Θ来得到不同的r。把每个
得到的Θ, r的组合在二维矩阵中对应位置+1。如下表

Points

No. of Votes

(Θ51, r83)

100

(Θ29, r46)

80

(Θ30, r70)

60

得到三组值,第一组表示(Θ51, r83)对应的原图直线穿过了100个点,因此这条直线得到的投票很高,被提取效果应该比较好。
同样,可以设定阈值,比如75,那么只提取出第一组和第二组的两条直线。
准确度控制,可以用Θ的步幅来控制,比如1次增加1度要比一次增加5度提取出来的直线更加准确。

3.4补充
霍夫变换检测边缘只对边缘图片(经过canny或者sobe算子提取特征后的图片)有效,对一般的图片无效[3]。

参考文献
[1] Hough Transform
[2] https://homepages.inf.ed.ac.uk/rbf/HIPR2/hough.htm
[3] https://aishack.in/tutorials/hough-transform-normal/

你可能感兴趣的:(图像处理,python,开发语言)