霍夫直线检测原理

在CV中,经常需要检测直线,用到霍夫变换算法。(感觉自己的语言表达能力有所欠缺,所以写下来)

在图像空间中,可以用y=mx+b表示一条直线。其中,x、y为变量,m、b为参数

对其进行变换,b=-mx+y。这样,就完成了图像空间到参数空间的转换

从图像空间到参数空间,一条直线变成了一个点(m,b)

对于图像空间中的一个点,图像空间中的每条经过该点的直线都对应着参数空间中的一个点(m,b),这些点在参数空间中构成一条直线

 * 当图像中有两个点时,他们在参数空间中对应着两条必相交的直线,直线的交点(m,b)对应着图像空间中过着两点的直线

* 当图像空间中有多个点时,参数空间中相应的会有多条直线;当图像空间中的点在一条直线上时,参数空间中的多条直线会相交于同一点(m,b),即为图像空间中直线的斜率和截距。霍夫直线检测算法就是基于该原理。

*  因此,霍夫直线检测算法总结如下:

1)参数空间量化

2)创建参数空间累加器A(m,b),并初始化为0

3)对于图像空间直线上的每个点:

         对应着参数空间中的一个直线,若参数空间的点(m,b)在该直线上,那么A(m,b)加1

4)找到A(m,b)的最大值,即为直线的斜率和截距

for point in image_lines:    #图像空间中的point对应参数空间的parameters_line(b=-xm+y)
    for m,b in A:
        if m,b in parameters_line:
            A[m,b]+=1

res=max(A(m,b))

* 然而,参数空间的范围太大了,因此使用极坐标:

  

  此时,图像空间和参数空间的对应关系如下:

  

  从图中可以看出,霍夫直线检测即为在参数空间中对rho和theta投票的过程,得票最高者为最终的直线参数。


版权声明:本文为qq_27060423原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。