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

如何利用MATLAB实现哈夫变换检测圆,第1张

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('检测结果')

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)]


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8091575.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存