霍夫变换检测直线圆流程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Hough 变换直线检测是直接按照hough 变换的定义来进行的, 算法如下:
1) 对原始的图像进行二值化, 假设0代表背景, 1代表物体特征点;
2) 在参数空间ρ, θ里建立一个累加的数组[],H ρθ , 并且置数组H 中的每
一个元素的初值都为零; 对于二值图像中每个以1 表示的点(,)x y , 我们让θ取遍θ轴上所有可能的值, 并根据式(3-3)计算对应的ρ; 再根据ρ与θ的值(假设都已经取整) 对数组进行累加计算([][],,1H
H ρθρθ=+) ; 3) 然后对数组[],H ρθ 进行局部的峰值检测, 得到被检测直线的参数ρ和θ。
上述的算法受直线中的间隙与噪声的影响较小, 鲁棒性比较强,但其具有运算量太大的缺点, 极端情况下, 它的运算复杂度为3()n ο 。
传统随机hough 变换的具体算法如下:
(a)构造一个边缘点集D , 然后初始化参数单元集P NULL = ,循环的次
数K = 0 ;
(b)从D 中随机的选取3 个点;
(c)由这3个点解特征的参数p ;
(d)在P 中寻找一个c p ,使它满足p c p δ-≤,如果找到则转(f);否则就
转(e);
(e)将p 插入到P 中,其对应的计数值变为1,转(g);
(f)将c p 所对应的计数的值加1,如果小于指定阈值t N ,转(g);否则就转
(h);
(g)1k k =+;如果 max k k > ,则结束;否则,转(b);
(h)c p 是候选圆的特征参数,如果该参数对应圆上的边缘的点数
min pc M M >,转(i);
(i) c p 是真实的圆参数,把落在参数c p 对应的特征上的点从D 中去除,然
后判断已经检测到的圆的数目是否已达到规定的数目,若是就结束,否
则的话重置P NULL =,0K =,转(b)。
其中max k 是规定的检测一个圆的过程中所允许采样的最大的循环次数。min M 为圆所必需的最小的点数, 通常设为2r πλ,其中λ是一个固定系数,r 是候选圆的半径。P 是参数空间中的参数单元的集合,它是一个动态的链表结构。pc M 是图像空间中落到了候选圆上的点数。
% 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
a = 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(a>0&a<=m&b>0&b<=n)
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&...
(rows(i)-par1)^2+(cols(i)-par2)^2>(r_m in+(par3-1)*step_r)^2-5)
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