matlab连通区边界_matlab练习程序(二值图像连通区域标记法,两步法)

我几乎完全就是照着WIKI百科上的算法实现的,不过是用Matlab而已。使用了两步法进行标记,一步法我还没怎么看。两步法中第二步是比较麻烦的,其中用到了不相交集合的一些理论,尤其是不相交集合森林,我这里的find_set函数就是参考《算法导论》311页的算法写的。如果用c++写,也许需要自己构造数据结构。

好吧,下面是我理解的算法过程:

1.首先要确定是标记8邻域连通还是4邻域连通,如果是8邻域连通,就用

的模板,如果是4邻域连通,就用

的模板。我这里用了是8连通。

2.用模板变量图像,类似卷积,不过不计算,只比较。比较当前像素和邻域4个或2个像素,如果都不相等,那么标记号加一,并且把这个标记号赋值给另一个标记空间中相同位置的像素,因为不能破坏当前图像的像素。如果有一个相等,那么就把这4个或2个像素中非背景像素中的最小值赋给另一个标记空间相同位置的像素,并且把这4个或2个像素同有相同当前位置像素值的集合取并集(ps:这个真的好难解释--!!)。遍历完会得到标记图像和有标记号那么多个的标记集合。

3.遍历标记图像,按标记图像的像素值索引标记集合,找到标记集合中代表当前集合最小的值赋值给原图像当前位置的像素(ps:这里最好看《算法导论》或这里)。

还是看代码吧,运行一下更好:

main.m

clear all;

close all;

clc;

img=imread('liantong.bmp');

imgn=img>128;

s=uint8(1-imgn);

%{s=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;

0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0; %这个矩阵是维基百科中的矩阵

0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 0;

0 0 0 1 1 1 1 0 0 0 1 1 1 1 0 0 0;

0 0 1 1 1 1 0 0 0 1 1 1 0 0 1 1 0;

0 1 1 1 0 0 1 1 0 0 0 1 1 1 0 0 0;

0 0 1 1 0 0 0 0 0 1 1 0 0 0 1 1 0;

0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0;

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];

%}imshow(mat2gray(s));

[m n]=size(s);

tmp=zeros(m,n);label=1; %第一遍遍历时标记的标签数量for i=2:mfor j=2:n-1up_left=s(i-1,j-1); %原图像当前像素周围四个像素

up=s(i-1,j);

up_right=s(i-1,j+1);

left=s(i,j-1);

cur=s(i,j);if cur==1

if cur~=up_left && cur~=up &&cur~=up_right &&cur~=left %当前和四周的都不一样,加新标签

tmp(i,j)=label;

link{label}=[];label=label+1;elset=sort([tmp(i,j-1) tmp(i-1,j-1) tmp(i-1,j) tmp(i-1,j+1)]); %标签图像当前像素周围四个像素并排序for k=1:4%寻找周围四个像素非零的最小值赋值给标签图像if t(k)~=0tmp(i,j)=t(k);for w=k:4link{t(w)}=union(t(k:4),link{t(w)}); %设置不相交集合end

break;end

end

end

end

end

end

for i=1:mfor j=1:n

if s(i,j) ~=0s(i,j)=find_set(link,tmp(i,j));end

end

endfigure,imshow(mat2gray(s))

find_set.m

function re=find_set(p,i) %不相交集合寻找代表当前集合的最小值,详见《算法导论》第21章if min(p{i}) ~=i

i=find_set(p,min(p{i}));endre=i;end

下面是运行的结果:

原图

结果图

效果还不错吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值