1、Hough 变换直线检测是直接按照hough 变换的定义来进行的, 算法如下:1) 对原始的图像进行二值化, 假设0代表背景, 1代表物体特征点;2) 在参数空间 , 里建立一个累加的数组 , 并且置数组 中的每HH一个元素的初值都为零; 对于二值图像中每个以1 表示的点 , 我们()xy让 取遍 轴上所有可能的值, 并根据式(3-3)计算对应的 ; 再根据与 的值(假设都已经取整) 对数组进行累加计算() ;,1H3) 然后对数组 进行局部的峰值检测, 得到被检测直线的参数 和 。上述的算法受直线中的间隙与噪声的影响较小, 鲁棒性比较强,但其具有运算量太大的缺点, 极端情况下, 它的运算复杂
2、度为 。3()n传统随机hough变换的具体算法如下:(a)构造一个边缘点集 , 然后初始化参数单元集 ,循环的次DPNUL数K = 0 ;(b)从D 中随机的选取3 个点;(c)由这3个点解特征的参数 ;p(d)在 中寻找一个 ,使它满足 ,如果找到则转(f);否则就Pcc转(e);(e)将 插入到 中,其对应的计数值变为1,转(g);p(f)将 所对应的计数的值加1,如果小于指定阈值 ,转(g);否则就转(h);c tN(g) ;如果 ,则结束;否则,转(b);1kmaxk(h) 是候选圆的特征参数,如果该参数对应圆上的边缘的点数cp,转(i);inM(i) 是真实的圆参数,把落在参数 对
3、应的特征上的点从 中去除,然c cpD后判断已经检测到的圆的数目是否已达到规定的数目,若是就结束,否则的话重置 , ,转(b)。PNUL0K其中 是规定的检测一个圆的过程中所允许采样的最大的循环次数。maxk为圆所必需的最小的点数, 通常设为 ,其中是一个固定系数, 是in 2rr候选圆的半径。 是参数空间中的参数单元的集合,它是一个动态的链表结构。是图像空间中落到了候选圆上的点数。pcM% p:阈值,0,1 之间的数% % output% hough_space:参数空间,h(a,b,r)表示圆心在(a,b)半径为 r 的圆上的点数% hough_circl:二值图像,检测到的圆% para
4、:检测到的圆的圆心、半径m,n = size(BW);size_r = round(r_max-r_min)/step_r)+1;size_angle = round(2*pi/step_angle);hough_space = zeros(m,n,size_r);rows,cols = find(BW);ecount = size(rows);% Hough 变换% 将图像空间(x,y)对应到参数空间(a,b,r)% a = x-r*cos(angle)% b = y-r*sin(angle)for i=1:ecountfor r=1:size_rfor k=1:size_anglea =
5、round(rows(i)-(r_min+(r-1)*step_r)*cos(k*step_angle);b = round(cols(i)-(r_min+(r-1)*step_r)*sin(k*step_angle);if(a0length = size(index);hough_circle = false(m,n);for i=1:ecountfor k=1:lengthpar3 = floor(index(k)/(m*n)+1;par2 = floor(index(k)-(par3-1)*(m*n)/m)+1;par1 = index(k)-(par3-1)*(m*n)-(par2-1
6、)*m;if(rows(i)-par1)2+(cols(i)-par2)2(r_min+(par3-1)*step_r)2-5)hough_circle(rows(i),cols(i) = true;endendend% 打印检测结果for k=1:lengthpar3 = floor(index(k)/(m*n)+1;par2 = floor(index(k)-(par3-1)*(m*n)/m)+1;par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m;par3 = r_min+(par3-1)*step_r;fprintf(1,Center %d %d radius %dn,par1,par2,par3);para(:,k) = par1,par2,par3;end