logo资料库

Hough 变换直线检测.doc

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
Hough 变换直线检测是直接按照hough 变换的定义来进行的, 算法如下: 1) 对原始的图像进行二值化, 假设0代表背景, 1代表物体特征点; 2) 在参数空间, 里建立一个累加的数组  ,H  , 并且置数组 H 中的每  一个元素的初值都为零; 对于二值图像中每个以1 表示的点( , x y , 我们让 ) 取遍轴上所有可能的值, 并根据式(3-3)计算对应的; 再根据与 的值(假设都已经取整) 对数组进行累加计算( H    ,  H    , 1  ) ; 3) 然后对数组   ,H  进行局部的峰值检测, 得到被检测直线的参数和。 上述的算法受直线中的间隙与噪声的影响较小, 鲁棒性比较强,但其具有运 算量太大的缺点, 极端情况下, 它的运算复杂度为 3( )n 。 传统随机hough变换的具体算法如下: (a)构造一个边缘点集 D , 然后初始化参数单元集 P NULL  ,循环的次 数K = 0 ; (b)从D 中随机的选取3 个点; (c)由这3个点解特征的参数 p ; (d)在 P 中寻找一个 cp ,使它满足 p 转(e);  cp   ,如果找到则转(f);否则就 (e)将 p 插入到 P 中,其对应的计数值变为1,转(g); (f)将 cp 所对应的计数的值加1,如果小于指定阈值 tN ,转(g);否则就转 (h); k k  ;如果 1 (g) (h) cp 是候选圆的特征参数,如果该参数对应圆上的边缘的点数 ,则结束;否则,转(b); max k k (i) min M ,转(i); pcM cp 是真实的圆参数,把落在参数 cp 对应的特征上的点从 D 中去除,然 后判断已经检测到的圆的数目是否已达到规定的数目,若是就结束,否 则的话重置 P NULL 0K  ,转(b)。  , 其中 maxk 是规定的检测一个圆的过程中所允许采样的最大的循环次数。 minM 为圆所必需的最小的点数, 通常设为2 r ,其中λ是一个固定系数,r 是 候选圆的半径。 P 是参数空间中的参数单元的集合,它是一个动态的链表结构。 pcM 是图像空间中落到了候选圆上的点数。
% p:阈值,0,1 之间的数 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % output % hough_space:参数空间,h(a,b,r)表示圆心在(a,b)半径为 r 的圆上的点数 % hough_circl:二值图像,检测到的圆 % para:检测到的圆的圆心、半径 [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:ecount for r=1:size_r for k=1:size_angle round(rows(i)-(r_min+(r-1)*step_r)*cos(k*step_angle)); round(cols(i)-(r_min+(r-1)*step_r)*sin(k*step_angle)); if(a>0&a<=m&b>0&b<=n) a b = = hough_space(a,b,r) = hough_space(a,b,r)+1; end end end end % 搜索超过阈值的聚集点 max_para = max(max(max(hough_space))); index = find(hough_space>=max_para*p); length = size(index); hough_circle = false(m,n); for i=1:ecount for k=1:length par3 = 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; if((rows(i)-par1)^2+(cols(i)-par2)^2<(r_min+(par3-1)*s tep_r)^2+5&... in+(par3-1)*step_r)^2-5) (rows(i)-par1)^2+(cols(i)-par2)^2>(r_m
hough_circle(rows(i),cols(i)) = true; end end end % 打印检测结果 for k=1:length par3 = 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 %d\n',par1,par2,par3); para(:,k) = [par1,par2,par3]; end
分享到:
收藏