区域生长分割的两种实现方法

今天回顾图像分割算法,拿区域生长算法练了练手。区域生长算法的原理非常简单:取一个种子点,将所有与种子点满足某种关系的邻域点都加入到种子点中,这一过程不断迭代,直到达到稳定。下面给出本人编写的两种版本的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('分割结果');

运行结果:

fig1 第一种实现方法的运行结果

第二种版本:

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('种子点生长获得的掩模');

 运行结果:

fig2 第二种实现方法的运行结果

可以看出,两种方法分割和结果是一致的。

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值