今天回顾图像分割算法,拿区域生长算法练了练手。区域生长算法的原理非常简单:取一个种子点,将所有与种子点满足某种关系的邻域点都加入到种子点中,这一过程不断迭代,直到达到稳定。下面给出本人编写的两种版本的matlab实现程序(第一种调用了图像重建函数,第二种自己动手实现了种子生长的具体过程,可以在生长中改变参考值,如在迭代中更新种子点的均值和方差作为生长条件)。
第一种版本:
clear all;close all;clc;
img=imread('parrot.png');
figure,
subplot(2,2,1),
imshow(img);
seeds=[400,200;230,600;440,670];
hold on;
plot(seeds(:,2)',seeds(:,1)','gs','linewidth',1);
title('原始图像及种子位置');
ycc=double(rgb2ycbcr(img));
img=double(img);
R=img(:,:,1);
G=img(:,:,2);
B=img(:,:,3);
marker=zeros(size(img,1),size(img,2));
for i=1:size(seeds,1)
marker(seeds(i,1),seeds(i,2))=1;
end
thresh=[50 30 27];
maskMax=zeros(size(img,1),size(img,2));
for i=1:size(seeds,1)
absDiff=abs(ycc-ycc(seeds(i,1),seeds(i,2),:));
g=absDiff(:,:,1)<thresh(1) & absDiff(:,:,2)<thresh(2) & absDiff(:,:,3)<thresh(3);
maskMax=maskMax|g;
end
maskMax=double(maskMax);
subplot(2,2,2),
imshow(maskMax);
title('掩模上限');
maskR=imreconstruct(marker,maskMax);
[g,label]=bwlabel(maskR,8);
g=mat2gray(g);
subplot(2,2,4);
imshow(0.5*g+0.5);
title('掩模重建结果');
mask=cat(3,maskR,maskR,maskR);
sg=mask.*img;
subplot(2,2,3),imshow(uint8(sg));
title('分割结果');
运行结果:
![](https://img-blog.csdnimg.cn/20200717154308447.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQyMzAzNjA=,size_16,color_FFFFFF,t_70)
第二种版本:
clear all;close all;clc;
img=imread('parrot.png');
figure;
subplot(3,1,1),
imshow(img);
[m,n,~]=size(img);
seeds=[400,200,1;230,600,2;440,670,3]; %第3列为label
newSeeds=seeds;
hold on;
plot(seeds(:,2)',seeds(:,1)','gs','linewidth',1);
title('原始图像及种子位置');
ycc=double(rgb2ycbcr(img));
img=double(img);
mask=zeros(m,n);
for i=1:size(seeds,1)
mask(seeds(i,1),seeds(i,2))=1;
end
th=[50,30,27];
flag=1;
while(flag)
temp=[];
for i=1:size(newSeeds,1)
rowS=newSeeds(i,1);
colS=newSeeds(i,2);
label=newSeeds(i,3);
rlow=max(1,rowS-1);
rhigh=min(m,rowS+1);
clow=max(1,colS-1);
chigh=min(n,colS+1);
for row=rlow:rhigh
for col=clow:chigh
if mask(row,col)==1 %已经添加过的排除掉
continue;
end
diffycc=reshape(ycc(row,col,:),1,3)-reshape(ycc(seeds(label,1),seeds(label,2),:),1,3);
judge=abs(diffycc)<th;
if sum(judge)==3 % 三个通道的条件均满足
temp=[temp;row,col,label];
mask(row,col)=1;
end
end
end
end
newSeeds=temp;
seeds=[seeds;newSeeds];
if isempty(temp)
flag=0;
end
end
imlabel=zeros(m,n);
for i=1:size(seeds,1)
imlabel(seeds(i,1),seeds(i,2))=seeds(i,3);
end
mask=cat(3,mask,mask,mask);
sgImg=mask.*img;
imlabel=0.5*mat2gray(imlabel)+0.5;
subplot(3,1,2);
imshow(uint8(sgImg));
title('分割结果');
subplot(3,1,3);
imshow(imlabel);
title('种子点生长获得的掩模');
运行结果:
![](https://img-blog.csdnimg.cn/20200717154540427.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQyMzAzNjA=,size_16,color_FFFFFF,t_70)
可以看出,两种方法分割和结果是一致的。