这个只需要遍历一次图像就能够完全标记了。我主要参考了WIKI和这位兄弟的博客,这两个把原理基本上该介绍的都介绍过了,我也不多说什么了。一步法代码相比两步法真是清晰又好看,似乎真的比两步法要好很多。

  代码如下:

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;
queue_head=1;       %队列头
queue_tail=1;       %队列尾
neighbour=[-1 -1;-1 0;-1 1;0 -1;0 1;1 -1;1 0;1 1];  %和当前像素坐标相加得到八个邻域坐标for i=2:m-1for j=2:n-1if s(i,j)==1 && tmp(i,j) ==0           tmp(i,j)=label;q{queue_tail}=[i j];        %用元组模拟队列,当前坐标入列queue_tail=queue_tail+1;while queue_head~=queue_tailpix=q{queue_head};                for k=1:8               %8邻域搜索pix1=pix+neighbour(k,:);            if pix1(1)>=2 && pix1(1)<=m-1 && pix1(2) >=2 &&pix1(2)<=n-1if s(pix1(1),pix1(2)) == 1 && tmp(pix1(1),pix1(2)) ==0  %如果当前像素邻域像素为1并且标记图像的这个邻域像素没有被标记,那么标记tmp(pix1(1),pix1(2))=label;q{queue_tail}=[pix1(1) pix1(2)];queue_tail=queue_tail+1;end              end              endqueue_head=queue_head+1;endclear q;                %清空队列,为新的标记做准备label=label+1;queue_head=1;queue_tail=1;            endend
end
figure,imshow(mat2gray(tmp))

下面是效果图,就效果而言和上一篇没什么区别的。

原图

效果图

这两篇算是把二值图像连通标记给搞定了。

转载于:https://www.cnblogs.com/tiandsp/archive/2012/12/06/2805276.html

matlab练习程序(二值图像连通区域标记法,一步法)相关推荐

  1. 【机器视觉学习笔记】二值图像连通区域提取算法(C++)

    目录 原理 二值图像 连通区域(Connected Component) 连通区域分析(Connected Component Analysis,Connected Component Labelin ...

  2. matlab 求图像的连通区域的圆度并可视化

    代码 %% 圆度的计算 % 圆形需要是白色的,背景是黑色的,可以根据需要确定是否对图像进行反向 clc clear;close all; % %读取源图像 I = imread('1.bmp'); % ...

  3. 用matlab给图片标记区域,MATLAB二值图像连通区域标记(两步法)

    posted on2012-12-06 16:24Dsp Tian 两步法中第二步是比较麻烦的,其中用到了不相交集合的一些理论,尤其是不相交集合森林,这里的find_set函数就是参考<算法导论 ...

  4. matlab练习程序(图像区域分裂)

    图像区域分裂可以将图像中相似的区域归为一个子区域,否则这个区域分裂. 分裂的步骤还是很好理解的. 对一个图像而言,首先确定一个分裂准则,如果当前图像区域中有像素没有满足这个准则,那么本区域继续分裂,否 ...

  5. python 连通区域_二值图像连通区域标记

    原像素矩阵M为: 根据原像素矩阵M大小,初始化标记矩阵labelM: 算法流程 1.    首先要确定是标记8邻域连通还是4邻域连通,如果是8邻域连通,就用模板1,如果是4邻域连通,就用模板2.中间像 ...

  6. opencv笔记(十八)——连通区域分析

    本文主要介绍在CVPR和图像处理领域中较为常用的一种图像区域(Blob)提取的方法--连通性分析法(连通区域标记法).文中介绍了两种常见的连通性分析的算法:1)Two-pass:2)Seed-Fill ...

  7. c++连通区域处理 种子生成法

    OpenCV_连通区域分析(Connected Component Analysis-Labeling) OpenCV_连通区域分析(Connected Component Analysis/Labe ...

  8. matlab bfs函数,matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...

  9. c++读出像素矩阵_Python传numpy矩阵调c++(求3D图像连通区域)

    Python有很多种调c++的方法,有的复杂有的简单,有时使用的时候反而不知道到底该用哪一种比较好,其实没有最好的方法,只有适合不适合自己.本文从我所遇到的问题说起,然后讲述另一种比较简单的pytho ...

最新文章

  1. 对于PS和flash协作做过光字的一点心得
  2. 剑指offer:从尾到头打印链表
  3. WCF之元数据交换 (Metadata Exchange)
  4. jquery checked 操作多选
  5. 如何使用War包部署Tomcat
  6. idea 控制台程序的打包
  7. 经典视觉SLAM框架
  8. C#使用Newtonsoft.Json读写json、读写Base64图像
  9. unity3d赛车游戏视频教程
  10. php pos系统,Linux下的十大开源POS系统软件
  11. 微博第三方登录django+vue
  12. python123子字符串输出_【无为则无心Python基础】— 13.字符串的格式化输出(一)...
  13. char(10)和nchar(10)的区别
  14. git stash 贮藏你的修改
  15. mysql全局权限账户%登录不上ERROR 1045 (28000): Access denied for user 'zzq'@'localhost' (using password: YES)
  16. 核密度估计基础-Part I
  17. 三菱电梯最新调试软件,支持LEHY-PRO机型.
  18. 前端面试你需要知道的事情:技术面试流程
  19. 2016年我的读书计划
  20. 发生身份验证错误,要求的函数不受支持

热门文章

  1. apk私钥_获取APK证书MD5、SHA1、SHA256等秘钥
  2. 源码群友问:你这么多项目是怎么进行技术选型的?
  3. 要做PPT,一直找不到资源?
  4. javascript-高级用法
  5. 第五课 路由之初识路由
  6. Linux下编译安装Mysql简单步骤
  7. 深入剖析Redis系列(四) - Redis数据结构与全局命令概述
  8. Redis 集合处理
  9. 嵌入式linux面试题解析(二)——C语言部分三
  10. paper 17 : 机器学习算法思想简单梳理