博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
matlab练习程序(二值图像连通区域标记法,两步法)
阅读量:7043 次
发布时间:2019-06-28

本文共 2356 字,大约阅读时间需要 7 分钟。

  我几乎完全就是照着上的算法实现的,不过是用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:m for j=2:n-1 up_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; else t=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)~=0 tmp(i,j)=t(k); for w=k:4 link{
t(w)}=union(t(k:4),link{
t(w)}); %设置不相交集合 end break; end end end end endendfor i=1:m for j=1:n if s(i,j) ~=0 s(i,j)=find_set(link,tmp(i,j)); end endendfigure,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})); end re=i;end

下面是运行的结果:

原图

结果图

效果还不错吧。

转载地址:http://cwhal.baihongyu.com/

你可能感兴趣的文章
windows中如何在命令行启动启动程序
查看>>
布局文件Android ListView入门知识--各种Adapter配合使用
查看>>
项目文件跟Google学习Android开发-工具篇-Android Studio入门
查看>>
最火的Android开源项目(1)
查看>>
C#中winform窗体常用设置
查看>>
win8 sqlserver2008 附加数据库错误: 5120
查看>>
HTML <div> 标签的 align 属性
查看>>
SQL Server2008附加数据库之后显示为只读时解决方法 .
查看>>
Lazy Load, 延迟加载图片的 jQuery 插件【备忘】
查看>>
Linux下nagios网络监控与/proc/net/tcp文件详解
查看>>
JavaBean 基础概念、使用实例及代码分析
查看>>
(转)typedef 函数指针的用法
查看>>
谈Mysql索引
查看>>
锁标记
查看>>
HDUOJ-----A == B ?
查看>>
深入浅出学习Hibernate框架(二):JDBC基础操作
查看>>
面试题 Comparable、Comparator 比较
查看>>
js图片延迟加载
查看>>
asynDBCenter(不断跟新)
查看>>
STL--集和多集(set/multiset)
查看>>