在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投票的过程,得票最高者为最终的直线参数。