程序的源代码如下所示:
clc;clear;close all;
im=imread('IMG_20170619_121931.jpg');
figure,imshow(im);
title('源图像');
%选取图像上的一个正方形的ROI区域;
im0 = imcrop(im,[1198 54 2210 2210]);
figure,
imshow(im0,'DisplayRange',[])
title('选取ROI后的图像');
%%%%%高斯滤波%%%%%
sigma = 1.6;
gausFilter = fspecial('gaussian',[5 5],sigma);
blur=imfilter(im0,gausFilter,'replicate');
figure,imshow(blur);
title('高斯滤波后的图像');
level = graythresh(blur); %%%ostu算法求阈值进行二值化
im1 = im2bw(blur,level);
figure,imshow(im1);
title('二值图像');
bw1=bwlabel(im1,8);
stats=regionprops(bw1,'Area');
bw2 = ismember(bw1, find([stats.Area]) == max([stats.Area])); %%找到面积最大的对象
figure,imshow(bw2);
title('二值图像');
[B L] = bwboundaries(bw2); %寻找边缘,不包括孔,L是标记矩阵
figure, %%%创建空白的图像
hold on
for k = 1:length(B)
boundary = B{k}; %B是一个胞元数组,所以是B{k}
plot(boundary(:,2), boundary(:,1), 'r', 'LineWidth', 2);%% 画出边缘
end%整个循环表示的是描边
%%
%%%%%寻找hough圆的圆心%%%%%%%
Rmin = 100;
Rmax = 200;
[centersBright, radiiBright] = imfindcircles(im1,[Rmin Rmax],'ObjectPolarity' ,'bright');
viscircles(centersBright,radiiBright,'EdgeColor','b');
hold on
plot(centersBright(1),centersBright(2),'*');
hold off;
%% 等分圆
R=1050; t=0:pi/20:2*pi;
x=R*cos(t);
y=R*sin(t);
axis equal
n=36;a=2*pi/n;
for k=0:n-1
hold on %%%%%其中(1077,1055)是半径,1090是半斤,即直线的长度
plot([1077-1090*cos(pi+k*a),1077+1090*cos(pi+k*a)],[1114-1090*sin(pi+k*a),1114+1090*sin(pi+k*a)])
end
其中原始图像为:
结果如图所示:
