Hough 变换检测直线、圆

1. Hough变换检测直线

记图像空间坐标系为X-Y,则图像空间中所有共线点的直线方程表示为:
y=mx+c      (1)
其中m为直线的斜率,c为截距,将公式(1)改写为:
c=-xm+y      (2)
可以将公式(2)理解为参数空间坐标系为M-C中的一条直线方程,其中斜率为-x,截距为y。

Hough 变换检测直线、圆_第1张图片
                  图1
图1(a)为图像空间,对于直线上任意一点按照公式(2)变换后在参数空间得到一直线;反过来,也可以理解为参数空间中的一条直线对应着图像空间中的一个点,这就是对点线对偶关系的解释。不难看出,图(a)中5个共线点经公式(2)变换后在参数空间中必交于一点,该点坐标即为图像空间中共线点所在直线方程参数。Hough变换把在图像空间中直线检测问题,转为将直线上的每一点按照公式(2)变换,然后看是否会在参数空间中相交到一点,方法就是对参数空间的像素进行简单累加统计来解决问题。  

在实际应用中,y=kx+b形式的直线方程没有办法表示x=c形式的直线(这时候,直线的斜率为无穷大)。所以实际应用中,是采用参数方程p=x*cos(theta)+y*sin(theta)。这样,图像平面上的一个点就对应到参数p—theta平面上的一条正弦曲线上,所有共线点的正弦曲线在参数空间交为一点,该点即为图像空间中直线参数。

2.Hough变换检测圆

记圆心为 ,半径为r,边缘点集合为 的圆周在图像空间中的方程为:
(xi-a)^2+(yi-b)^2 = r^2   (3)
将(3)改为
(a-xi)^2+(b-yi)^2 = r^2     (4)
则公式(4)可以理解为图像边缘点(x,y)在参数空间(a,b,r)中的方程,显然它是一个三维锥面。则对于图像空间中任意边缘点经过公式(4)变换后在参数空间中都有一个三维锥面与之对应,对于圆周上的所有边缘点集合,变换后的三维锥面形成了一个锥面簇,所有锥面将相交于参数空间中的某一点(a0,b0,r0),该点则对应于图像空间中这些共圆边缘点所在圆的圆心位置。如图2所示。 
Hough 变换检测直线、圆_第2张图片  
               图2
传统的Hough 变换在图像中寻找半径已知的圆的圆心时,对整个图像进行遍历, 寻找边缘点需要两重循环。遍历到每个边缘点时, 求其在参数空间中的投影集合需要两重循环。所以传统的Hough 变换在检测半径已知圆时需要四重循环, 这在实际计算中是极其耗时的。

3.改进Hough变换检测圆算法:

a) 在原始图像中取一基准点( xbase , ybase ) , 以此点为圆心、R 为半径求在参数空间的投影, 得到坐标点集合Fbase , 将所得到的坐标点集合Fbase保存在一块内存区域base union 中。

b) 对图像进行遍历, 当遇到第一个边缘点( x1 , y1 ) 时, 将base union 中保存的集合Fbase中所有元素即所有坐标点的坐标分别加上x、y 方向的偏移量x1 - xbase、y1 - ybase , 得到一个新的坐标点集合F1 , 然后在参数空间中将集合F1 中所有坐标点元素对应的累加值进行累加。

c) 重复b) , 计算Fn( N≥n≥2) , 并将Fn 中所有坐标点元素对应的累加值进行累加, 直到所有边缘点均被遍历到并计算过。

d) 找出参数空间中累加值的极大值, 累加值极大值在参数空间中所对应的坐标便是圆在图像空间中的圆心坐标。

参考文献:
一种用Hough 变换检测圆的快速算法 . 夏磊.计算机应用研究, 2007.10 .

你可能感兴趣的:(vc++图像处理学习笔记)