多值连通区域标记算法的matlab实现
来源:互联网 发布:淘宝拒绝退款怎么办 编辑:程序博客网 时间:2024/04/30 15:51
今天在论坛上,问了一个问题如下(http://bbs.csdn.net/topics/390418066):
请问多值连通区域应该如何标记?用bwlabel只能求二值的连通区域标记。a=[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 2 2 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 11 1 1 1 1 2 2 1 1 1 1 1 2 1 1 1 1 3 3 1 1 1 1 11 1 1 1 1 2 2 1 1 1 1 1 2 1 1 1 1 3 3 1 1 1 1 11 1 1 1 1 2 2 1 1 1 1 1 2 1 1 1 1 3 3 1 1 1 1 11 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 3 3 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 11 1 1 1 4 4 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 11 1 1 1 4 4 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 11 1 1 1 4 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 4 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]我想把这样的矩阵做连通区域标记,应该如何进行?要注意的是,其中有一片被2包围的1要和其他的1标记不同。
按照一般来说可以使用bwlable来实现,如下
%I必须事先二值化[L, num] = bwlabel(I,8);MyRG=label2rgb(L);这样也许会有背景的问题,比如
I=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ]I的处理结果,就是
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ]
其关键在于,bwlable存在一个背景色的缘故,它把背景色当做一个整体,并不分拆。这样对于有一些场合就显得不合适了,针对这种问题的处理方法:
(1)在每个像素点的级别上
我参照博文《多值连通区域标记算法》(http://blog.csdn.net/ymqq1/article/details/8773484),写了一个matlab的多值连通区域标记算法,其算法思想很简单,就是并查集。
I=[ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 3 1 1 1 1 2 1 1 1 1 1 1 2 1 1 3 1 1 1 1 2 1 1 1 1 1 1 2 1 1 3 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ];[m,n]=size(I);for i=1:m for j=1:n root(i,j)=(i-1)*n+j; endendfor i=1:m for j=1:n if(i>1&&j<n) if(I(i-1,j+1)==I(i,j)) root(i,j)=root(i-1,j+1); end end if(j<n) if(I(i,j+1)==I(i,j)) root(i,j+1)=root(i,j); end end if(i<m) if(I(i+1,j)==I(i,j)) root(i+1,j)=root(i,j); end end if(i<m&&j<n) if(I(i+1,j+1)==I(i,j)) root(i+1,j+1)=root(i,j); end end endend
(2)针对相同像素集合的级别上
% a = [% 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1% 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1% 1 1 1 1 1 2 2 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 1% 1 1 1 1 1 2 2 1 1 1 1 1 2 1 1 1 1 3 3 1 1 1 1 1% 1 1 1 1 1 2 2 1 1 1 1 1 2 1 1 1 1 3 3 1 1 1 1 1% 1 1 1 1 1 2 2 1 1 1 1 1 2 1 1 1 1 3 3 1 1 1 1 1% 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 3 3 1 1 1 1 1% 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1% 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1% 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1% 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1% 1 1 1 1 4 4 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1% 1 1 1 1 4 4 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1% 1 1 1 1 4 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1% 1 1 1 1 4 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1% 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1% 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1% ];a = [ 1 2 2 2 3 1 2 1 2 1 1 2 2 2 1 1 4 1 1 1 1 1 1 1 1];maxa = max(a(:));mina = max(min(a(:)),1);result = zeros(size(a));curnum = 0;for i = mina : maxa curImg = bwlabel(a==i); for j = 1 : max(curImg(:)) curImg(curImg==j) = curnum+j; end curnum = curnum+length(unique(curImg))-1; result = result+curImg;endresult
(3)针对图像的特点
%以下代码貌似还有问题,我再改正一下
% 也可以这样,供参考I=[ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 2 1 1 1 1 1 1 2 3 3 3 1 1 1 1 2 1 1 1 1 1 1 2 3 1 3 1 1 1 1 2 1 1 1 1 1 1 2 3 3 3 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1];f=imfill(I,'holes');holes=f-I;l=bwlabel(holes)*(max(I(:)));r=I+l
PS:1、今天有点事,晚些时候再把注释加上去。
2、以上代码是8连通,如果想4连通修改也比较简单。
- 多值连通区域标记算法的matlab实现
- matlab多值连通区域标记
- 多值连通区域标记算法
- Matlab实现迭代法连通区域标记
- 连通区域快速标记的two-pass算法及其实现
- 连通区域的标记
- 二值的连通区域标记
- bwlabel(BW,n) matlab中标记二值图像中白色(1)的连通区域
- OpenCV删除面积小的区域 实现图像二值化分割 标记连通区域
- 二值图的连通区域标记
- 广度优先搜索写的连通区域标记算法
- 连通区域标记:c++版的bwlabel实现(基于opencv)
- OpeCV的连通区域标记-bwlabel方法实现
- OpenCV 基于轮廓提取的二值图像分析与连通区域标记算法
- 两种连通区域标记算法
- Matlab形态学图像处理:二值图像分割 标记连通区域和重心位置 删除连通区域
- 一种二值图像连通区域标记的新方法
- 区域标记-8连通与4连通算法
- vb.net--Label控件
- OpenCV显示图像的方法——否则程序运行好了都不知道图像怎么读取的
- Sql包中的Date转化为util包中的Date
- hive优化方式和使用技巧
- 优秀程序员的十个习惯
- 多值连通区域标记算法的matlab实现
- C++访问类中私有成员变量的方法
- vb.net-循环
- Linux磁盘同步技术中DRBD(Distributed Replicated Block Device)
- VB.NET多线程应用
- 禁用UIWebView中双击和手势缩放页面
- vb.net--常用函数
- AR/AP/GL标准请求
- linux Gsensor驱动(bma250为例子)