Hough变换检测圆
function[hough_space,hough_circle,para]=hough_circle(BW,step_r,step_angle,r_min,r_max,p)
%
%input
%BW:二值图像;
%step_r:检测的圆半径步长
%step_angle:角度步长,单位为弧度
%r_min:最小圆半径
%r_max:最大圆半径
%p:以p*hough_space的最大值为阈值,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)
fori=1:ecount
forr=1:size_r
fork=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&a0&b=max_para*p);
length=size(index);
hough_circle=false(m,n);
fori=1:ecount
fork=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)*step_r)^2-5)
hough_circle(rows(i),cols(i))=true;
end
end
end
%打印检测结果
fork=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%dradius%dn',par1,par2,par3);
para(:,k)=[par1,par2,par3];
end
这段程序中
%搜索超过阈值的聚集点
max_para=max(max(max(hough_space)));
index=find(hough_space>=max_para*p);
length=size(index);
hough_circle=false(m,n);
fori=1:ecount
fork=1:length
p