霍夫变换
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 = mx1 + c,则c = -x1m + y1,这也就是霍夫空间上的一条直线。
对于(x,y)空间上的某条直线有y = m1x + c1,则c 1= -xm1 + 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和p3点的直线的斜率和截距。明白这个道理,就已经掌握这个变换的整个过程了。

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

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

|
Points |
No. of Votes |
|
(Θ51, r83) |
100 |
|
(Θ29, r46) |
80 |
|
(Θ30, r70) |
60 |
3.4补充
霍夫变换检测边缘只对边缘图片(经过canny或者sobe算子提取特征后的图片)有效,对一般的图片无效[3]。
参考文献
[1] https://jayrambhia.com/blog/hough-transform
[2] https://homepages.inf.ed.ac.uk/rbf/HIPR2/hough.htm
[3] https://aishack.in/tutorials/hough-transform-normal/
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223105.html原文链接:https://javaforall.net
