参考代码1:分割的效果不是太理想
clear all;
close all;
clc;
[fname,pname]=uigetfile('*.*','open');
fullname=strcat(pname,fname);
img_in=imread(fullname);
figure
subplot(3,3,1);imshow(img_in);title('彩图');
img_gray=rgb2gray(img_in);subplot(3,3,2);imshow(img_gray);title('灰度图');
img1=img_gray(85:205,177:380);subplot(3,3,3);imshow(img1);title('局部灰度图');
%img1=img_gray(105:185,170:380);img1(:,1:7)=255;subplot(3,3,3);imshow(img1);title('局部灰度图');
%img1=img_gray(50:400,180:380);subplot(3,3,3);imshow(img1);title('局部灰度图');
img1=im2bw(img1,graythresh(img1));subplot(3,3,4);imshow(img1);title('二值图');
img_before=~img1;
subplot(3,3,5);imshow(img_before);title('待处理二值图');
%为了保证做极限腐蚀时不受边界突变凹坑的影响,先对整幅图像做一个边缘的光滑处理。
%这里使用膨胀。这样做的话极限腐蚀后最终腐蚀的区域数只有三个,消去了由于边界不光
%滑造成的影响。
img=imdilate(img_before,ones(8,8));%使用膨胀法进行边界平滑。
subplot(3,3,6);imshow(img);title('平滑结果');
%
[m,n]=size(img);
imgn=zeros(m,n);
preimg=imgn;
%
se=strel('square',3);%stricture element.
%开始
while sum(sum(preimg-img))~=0
preimg=img;
img=img>0;
[img label]=bwlabel(img); %标记不同区域,label是区域个数
imgn=imerode(img,se);
%腐蚀之后是否有哪个被标记的区域消失了
Hist=zeros(1,label);
for i=1:m
for j=1:n
if imgn(i,j)~=0
Hist(imgn(i,j))=imgn(i,j);
end
end
end
%统计消失区域的标号
H=[];
for i=1:label
if Hist(i)==0
H=[H i];
end
end
%如果这个区域消失了,那么再把这个区域恢复过来
if ~isempty(H)
l=length(H);
for i=1:m
for j=1:n
for k=1:l
if img(i,j)==H(k)
imgn(i,j)=img(i,j);
end
end
end
end
end
img=imgn;
end
a=label %输出区域数量
%^^^^^^^^^^^^^^^^^^^
subplot(3,3,7);imshow(img);title('最终腐蚀结果——“核”')
%…………………………………………………………
%此处先实验基于条件一的极限膨胀:不要超过原边界。
mask=img_before;
img1=img;
[m,n]=size(img1);
imgn1=zeros(m,n);
preimg=imgn1;
while sum(sum(preimg-img1))~=0
preimg=img1;
for i=2:m-1
for j=2:n-1
if mask(i,j)==1
imgn1(i,j)=max(max(img1(i-1:i+1,j-1:j+1)));
end
end
end
img1=imgn1;
end
% figure;
% imshow(img1);
% title('不超过边界膨胀')
%…………………………………………………………
%此处实验第二个规则:膨胀互不侵犯。
img2=img;%拷贝“核”,这些核是被标记过得。
% img22=img22>0;
% img222=imdilate(img22,ones(3,3));
% img222=imdilate(img22,ones(3,3));
% img222=imdilate(img22,ones(3,3));
%
% [img2,num]=bwlabel(img222);
% a=num
% img2=zeros(m,n);%将核的形状改成正方形
% for i=1:label
%
% [r,c]=find(img==i);
% rbar=mean(r);
% cbar=mean(c);
% img2(round(rbar),round(cbar))=i;
% end
[m,n]=size(img2);
subplot(3,3,8);imshow(img2);title('用于膨胀的目标区域');
imgn2=zeros(m,n);
preimg2=imgn2;
%对mask进行一下开运算,去除内部空洞的影响。
mask1=imclose(mask,ones(3,3));
while sum(sum(preimg2-img2))~=0 %判断是否膨胀完全
preimg2=img2;
for i=2:m-1
for j=2:n-1
if img2(i,j)==0 && mask1(i,j)==1
% if img2(i,j)==0
flag=0;
tmp=img2(i-1:i+1,j-1:j+1);%3*3区域
ma=max(tmp(:));%tmp(:)把tmp的各列串成一列。
mi=min(tmp(:));
for k=1:9
if tmp(k)~=ma && tmp(k)~=mi;
flag=1;
break;
end
end
if flag==0
imgn2(i,j)=ma;
end
end
end
end
img2=imgn2;
end
% for i=2:m-1
% for j=2:n-1
% if img2(i,j)==0
% imgn2(i,j)=max(max(img(i-1:i+1,j-1:j+1)));
% end
% end
% end
subplot(3,3,9);
imshow(imgn2);title('互不侵犯膨胀结果')
参考代码2:
I=imread('C:\Users\xiaomao\Desktop\water_coins.jpg');
II=rgb2gray(I);
th=graythresh(II);
I=1-im2bw(II, th);
R=separate1(I, 40);
figure; imshow(R);
function R=separate1(I,h)
I=1-I;
D=bwdist(I);
%figure; imshow(max(D(:))-D, []);
D=uint8(floor(D*255/max(D(:)) + 0.5));
%figure; imshow(D);
im = imreconstruct(D-h, D);
%figure; imshow(im, []);
dome=D-im;
dome=im2bw(dome, graythresh(dome));
dome=bwareaopen(dome,floor(h/2));
gradmag2=imimposemin(255-D,dome);
gradmag2(find(I==1))=0;
DL=watershed(gradmag2);
I(DL==0)=1;
R=bwareaopen(1-I, 10);
end