rgb=imread('E:\毕设\图片\果1.jpg');
[m,n,d]=size(rgb);
%%阈值设置
level1=[255*0.3 255*0.3];%根据original直观得出的固定阈值
%level1=rgbyuzhiaverage(rgb); %调用rgbyuzhiaverage函数,计算大于固定阈值部分普通平均阈值
%level=graythresh(rgb);level1=[level level];%使用otsu确定灰度阈值
%level1=rgbyuzhixingquaverage(rgb);%调用rgbyuzhixingquaverage函数,计算兴趣区平均阈值
%level1=rgbyuzhixingqumin(rgb);%调用rgbyuzhixingqumin函数,计算兴趣区最小阈值
%levelr=rgbyuzhixingquaverage(rgb);levelf=rgbyuzhifeixingquaverage(rgb);level1=(levelr+levelf)/2;%前景与背景平均
%level1=rgbyuzhixingquqiwang(rgb);%根据前景平均值与背景平均值求总期望
%转换数据类型,图像输出类型只能是unit型
rgb = uint8(rgb);
%%剔除r-g<level1(1),r-g<level1(2)的部分
r = rgb;
for i=1:m
for j=1:n
if((rgb(i,j,1)-rgb(i,j,2))<level1(1)&&(rgb(i,j,1)-rgb(i,j,3))<level1(2))
r(i,j,1)=0;
r(i,j,2)=0;
r(i,j,3)=0;
end
end
end
figure;
subplot(2,2,1);imshow(rgb);title('原图像');
subplot(2,2,2);imshow(r);title('分割后');
%%%%将前景变为白色,伪二值图像
r2 = rgb;
for i=1:m
for j=1:n
if((rgb(i,j,1)-rgb(i,j,2))<level1(1)&&(rgb(i,j,1)-rgb(i,j,3))<level1(2))
r2(i,j,1)=0;
r2(i,j,2)=0;
r2(i,j,3)=0;
else
r2(i,j,1)=255;
r2(i,j,2)=255;
r2(i,j,3)=255;
end
end
end
subplot(2,2,3);imshow(r2);title('伪二值图像');
gray=rgb2gray(r2);%转换为灰度图像
figure;
subplot(2,3,1);imshow(gray);title('灰度图');
%%均值滤波,平滑边缘部分
n = 3;
template = ones(n);
[height, width] = size(gray);
x1 = double(gray);
x2 = x1;
for i = 1:height-n+1
for j = 1:width-n+1
c = x1(i:i+n-1,j:j+n-1).*template;
s = sum(sum(c));
x2(i+(n-1)/2,j+(n-1)/2) = s/(n*n);
end
end
pgray = uint8(x2);
subplot(2,3,2);imshow(pgray);title('均值滤波后');
%二值图像
thresh=graythresh(pgray);
g=im2bw(pgray,thresh);
subplot(2,3,3);imshow(g);title('二值图像');
%%开运算,先腐蚀后膨胀,断开较窄的狭颈并消除细的突出物
se1=strel('disk',12); %采用半径为9的圆作为结构元素
o1=imopen(g,se1); %开启操作
subplot(2,3,4),imshow(o1);
title('开启运算后图像');
axis on; %显示坐标系
%%闭运算,先膨胀后腐蚀,弥合较窄的间断和细小的沟壑,消除小空洞,填补轮廓线中的断裂
se2=strel('disk',5); %采用半径为10的圆作为结构元素
o2=imclose(o1,se2); %闭合操作
subplot(2,3,5),imshow(o2);
title('闭合运算后图像');
axis on; %显示坐标系
%提取边缘
contour = edge(o2 ,'canny');
figure;
subplot(2,2,1);imshow(contour);title('边界');
contour2=bwareaopen(contour,35);%开操作
subplot(2,2,2);imshow(contour2);title('边缘');
imwrite(contour2,'E:\毕设\图片\s001.jpg');
%拟合圆
step_r = 1;
step_angle = 0.1;
minr = 50;
maxr = 300;
thresh = 0.75;
[hough_space,hough_circle,para] = hough_circle1(contour2,step_r,step_angle,minr,maxr,thresh);
%figure,imshow(I),title('原图')
figure,imshow(contour2),title('边缘')
figure,imshow(hough_circle),title('检测结果')
circleParaXYR=para;
%输出
fprintf(1,'\n---------------圆统计----------------\n');
[r,c]=size(circleParaXYR);%r=size(circleParaXYR,1);
fprintf(1,' 检测出%d个圆\n',r);%圆的个数
fprintf(1,' 圆心 半径\n');%圆的个数
for n=1:r
fprintf(1,'%d (%d,%d) %d\n',n,floor(circleParaXYR(n,1)),floor(circleParaXYR(n,2)),floor(circleParaXYR(n,3)));
end
%标出圆
figure,imshow(o2),title('检测出图中的圆')
hold on;
plot(circleParaXYR(:,2), circleParaXYR(:,1), 'r+');
for k = 1 : size(circleParaXYR, 1)
t=0:0.01*pi:2*pi;
x=cos(t).*circleParaXYR(k,3)+circleParaXYR(k,2);y=sin(t).*circleParaXYR(k,3)+circleParaXYR(k,1);
plot(x,y,'r-');
end
评论8