您的位置:首页 > 其它

图像处理之区域标记

2017-11-10 20:28 211 查看
对应matlab函数:bwlabel,L = bwlabel(BW,n),其中BW为二值图像,而n有两种取值:4和8,分别对应4连通和8连通,默认是8连通;

1.使用栈来实现区域标记代码:

close all;clear all;clc;
I=imread('cameraman.tif');
s=im2bw(I);
L8=bwlabel(s,8);

[m n]=size(s);
tmp=zeros(m,n);

label=0;            %遍历时标记的标签数量
for i=1:m
for j=1:n
cur=s(i,j);
if cur==1&&tmp(i,j)==0             %只有还未遍历过的值为1的才可以进入
label=label+1;
tmp(i,j)=label;
k=1;
stack(k,1)=i;stack(k,2)=j;       %类似于栈的作用,遍历一个区块的,栈的每一个元素为两个,栈的长度未定
while(isempty(stack)==0)      %只有全部遍历完才退出栈,同时这些遍历过的元素不会再遍历
i1=stack(k,1);j1=stack(k,2);
stack(k,:)=[];
k=k-1;                   %k表示在栈中的位置,此处为弹出元素
if i1-1>0&&s(i1-1,j1)==1&&tmp(i1-1,j1)==0 %原图像当前像素上方元素
tmp(i1-1,j1)=label;
k=k+1;
stack(k,1)=i1-1;stack(k,2)=j1;
end
if i1+1<=m&&s(i1+1,j1)==1&&tmp(i1+1,j1)==0%原图像当前像素下方元素
tmp(i1+1,j1)=label;
k=k+1;               %此处为在栈中加入元素
stack(k,1)=i1+1;stack(k,2)=j1;
end
if j1-1>0&&s(i1,j1-1)==1&&tmp(i1,j1-1)==0%原图像当前像素左面元素
tmp(i1,j1-1)=label;
k=k+1;
stack(k,1)=i1;stack(k,2)=j1-1;
end
if j1+1<=n&&s(i1,j1+1)==1&&tmp(i1,j1+1)==0%原图像当前像素右面元素
tmp(i1,j1+1)=label;
k=k+1;
stack(k,1)=i1;stack(k,2)=j1+1;
end
%左上元素
if i1-1>0&&j1-1>0&&s(i1-1,j1-1)==1&&tmp(i1-1,j1-1)==0
tmp(i1-1,j1-1)=label;
k=k+1;
stack(k,1)=i1-1;stack(k,2)=j1-1;
end
%右上元素
if i1-1>0&&j1+1<=n&&s(i1-1,j1+1)==1&&tmp(i1-1,j1+1)==0
tmp(i1-1,j1+1)=label;
k=k+1;
stack(k,1)=i1-1;stack(k,2)=j1+1;
end
%左下元素
if i1+1<=m&&j1-1>0&&s(i1+1,j1-1)==1&&tmp(i1+1,j1-1)==0
tmp(i1+1,j1-1)=label;
k=k+1;
stack(k,1)=i1+1;stack(k,2)=j1-1;
end
%右下元素
if i1+1<=m&&j1+1<=n&&s(i1+1,j1+1)==1&&tmp(i1+1,j1+1)==0
tmp(i1+1,j1+1)=label;
k=k+1;
stack(k,1)=i1+1;stack(k,2)=j1+1;
end

end
end
end
end


2.使用递归的方式来实现:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: