
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_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('检测结果')
clcclear all
A=input('请输入第一个坐标点的[x1,y1]:')
B=input('请输入第二个坐标点的[x2,y2]:')
C=input('请输入第三个坐标点的[x3,y3]:')
plot([A(1) B(1)],[A(2) B(2)],'b','linewidth',2)hold on
plot([A(1) C(1)],[A(2) C(2)],'b','linewidth',2)
plot([C(1) B(1)],[C(2) B(2)],'b','linewidth',2)
judge1=(B(1)-C(1)) (B(2)-A(2))-(B(1)-A(1)) (B(2)-C(2))
judge2=B(2)-A(2)
I1=0.5 (C(2)-A(2)) (B(2)-C(2))*(B(2)-A(2))
I2=0.5 (A(1) 2-B(1) 2) (B(2)-C(2))
I3 =0.5 (B(1) 2-C(1) 2) (B(2)-A(2))
if(judge1==0)
else
end
运行后按照图片所示的格式输入坐标:
向左转
|
向右转
[图片上传失败...(image-303586-1511877287198)]
然后可以得到效果图哦!!!
向左转
|
向右转
[图片上传失败...(image-81957c-1511877287197)]
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)