永发信息网

如何利用MATLAB实现哈夫变换检测圆

答案:2  悬赏:0  手机版
解决时间 2021-01-31 18:08
如何利用MATLAB实现哈夫变换检测圆
最佳答案
clc,clear all
I = imread('yuan.tif');
[m,n,l] = size(I);
if l>1
I = rgb2gray(I);
end
BW = edge(I,'sobel');
step_r = 1;
step_angle = 0.1;
r_min = 20;
r_max = 30;
thresh = 0.7;
% %%%%%%%%%%%%%%%%%%%%%%%%%%
% input
% BW:二值图像;
% step_r:检测的圆半径步长
% step_angle:角度步长,单位为弧度
% r_min:最小圆半径
% r_max:最大圆半径
% 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*thresh );
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)*step_r)^2+5&...
(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

% 打印检测结果
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
subplot(221),imshow(I),title('原图')
subplot(222),imshow(BW),title('边缘')
subplot(223),imshow(hough_circle),title('检测结果')
全部回答
clc clear close %bw=imread('d:\picture\9dafa605d53eea243812bb29.jpg'); rgb=imread('lena.jpg'); bw=rgb2gray(rgb); thresh=[0.01,0.17]; sigma=2;%定义高斯参数 f = edge(double(bw),'canny',thresh,sigma); figure(1), imshow(f,[]); title('canny 边缘检测'); [h, theta, rho]= hough(f,'rhoresolution', 0.5); axis on, axis normal xlabel('\theta'),ylabel('rho'); p=houghpeaks(h,5); hold on lines=houghlines(f,theta,rho,p); figure, imshow(f,[]), title('hough transform detect result'), hold on for k=1:length(lines) xy=[lines(k).point1;lines(k).point2]; plot(xy(:,1),xy(:,2),'linewidth',4,'color',[.6 .6 .6]); end
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
已知直线y=kx+b与直线y=3x-1交于y轴同一点,
单选题在经过十字路口时,刚好红灯亮着,虽然
我睡觉老喜欢摸老婆的乳房睡觉,对老婆身体有
qq炫舞安装要多久
两个男的再搞一个女的受不了怎么办
解答题阅读材料,结合所学知识回答问题。材料
右转绿灯左转红灯路上没有导流标志开车过了停
第一次科学革命为什么没有出现在中国
20分银行借支卡到哪里办要什么条件可借支多少
天河城百货和友谊商店最近有打折吗?
闪银好又贷逾期了会有电话轰炸吗
iphone se和iphone7哪个好,iphone se和iphon
女人勤一点还是懒一点好
巨蟹座和水瓶座最配
脑部蛛网膜下腔出血术后一年半可以坐飞机吗
推荐资讯
hp v2626 AU 可以升级吗?可以达到什么样的性
煮汤什么时候放盐好?
南昌徐坊客运站到南昌西站有多远
Win8输入什么命令提示符重置电脑
中东指哪些国家
湘潭县民生人寿保险公司(湘潭县营销部)在哪里
一项工程,甲、乙合作可30天完成,甲独做24天后
用了蒂花之秀洗面奶咋那么汤呢
水压试验时二氧化碳灭火器钢瓶的残余变形率不
承重梁多高为标准
铁布的意思是什么啊?知道的请说下!
法士特8档变速箱副箱里的齿轮要不要像发动机
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?