【摘要】

本文介绍在图像处理领域中较为常用的一种图像区域(Blob)提取的方法——连通性分析法(连通区域标记法)。

文中介绍了两种常见的连通性分析的算法:1)Two-pass;2)Seed-Filling种子填充,并给出了两个算法的基于OpenCV的C++实现代码。

【注释】

1、这里的扫描指的是按行或按列访问以便图像的所有像素,算法中采用的是按行扫描方式;

2、图像记为B,为二值图像:前景像素(pixel value = 1),背景像素(pixel value = 0);

3、label从2开始计数;

4、像素相邻关系有两种:4-领域、8-领域,本文算法采用4-邻域;

              图1(像素相邻关系图)

一、Two-pass算法

1、第一次扫描(Frist Pass)

  判断B(x,y)像素是否为前景像素(即B(x,y)==1),

   如果B(x,y)==1,判断B(x,y)的邻域像素点像素值是否为B(Neighbors)==0(注意这里指的是像素点的值,不是像素点的lable值),

    如果都为B(Neighbors)==0,那么B(x,y)==lable;lable加1;

    如果B(Neighbors)存在不为0的像素值(即邻域Neighbors中存在lable值),那么B(x,y)等于邻域中最小的lable值,(B(x,y)== min{Neighbors} ;),

    记录lable值产生变化的点(相等关系),并将变化lable值保存到某一列表中。(相等关系:如图1中所示,B(2,1)和B(1,1)、B(0,2)相邻,但是B(2,1)的lable==1,B(1,1)的lable==3,所以将lable值为1,3的像素视为相等。即连通)

                图2(相等关系演示图)

2、第二次扫描(Second Pass)

  访问当前像素B(x,y),如果B(x,y) > 1:

  找到与label = B(x,y)同属相等关系的一个最小label值,赋予给B(x,y);

  完成扫描后,图像中具有相同label值的像素就组成了同一个连通区域。

                     图3(Two-pass算法动态演示图)

Seed Filling(种子填充法)

  1、扫描图像,如果像素点B(x,y) == 1:

  那么将B(x,y)作为种子(像素位置),并赋予其一个label,然后将该种子相邻的所有前景像素都压入栈中(队列中);

  然后获取栈中的第一个像素,赋予其相同的label,然后再将与该像素相邻的所有前景像素都压入栈中;

  重复b步骤,直到栈为空;

   2、重复第(1)步,直到扫描结束;扫描结束后,就可以得到图像B中所有的连通区域;

            图4  Seed Filling(种子填充法)动态图演示

参考文章:

http://blog.csdn.net/cooelf/article/details/26581539

http://blog.csdn.net/icvpr/article/details/10259577

Opencv图像连通域的更多相关文章

  1. OpenCV: 图像连通域检测的递归算法

    序言:清除链接边缘,可以使用数组进行递归运算; 连通域检测的递归算法是定义级别的检测算法,且是无优化和无语义失误的. 同样可用于寻找连通域 void ClearEdge(CvMat* MM,CvPoi ...

  2. OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    这篇已经写得很好,真心给作者点个赞.题目都是直接转过来的,直接去看吧. Reference Link : http://blog.csdn.net/poem_qianmo/article/detail ...

  3. 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...

  4. Opencv 图像叠加 添加水印

    Opencv 图像叠加 添加水印 C++: void Mat::copyTo(OutputArray m) const C++: void Mat::copyTo(OutputArray m, Inp ...

  5. opencv图像读取-imread

    前言 图像的读取和保存一定要注意imread函数的各个参数及其意义,尽量不要使用默认参数,否则就像数据格式出现错误(here)一样,很难查找错误原因的: re: 1.opencv图像的读取与保存; 完

  6. 学习 opencv---(12)OpenCV 图像金字塔:高斯金字塔,拉普拉斯金字塔与图片尺寸缩放

    在这篇文章里,我们一起学习下 图像金字塔 的一些基本概念,如何使用OpenCV函数pyrUp和pyrDown 对图像进行向上和向下采样,以及了解专门用于缩放图像尺寸的resize函数的用法.此博文一共 ...

  7. [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget(第二部分)

    本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...

  8. [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget (第一部分)

    本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...

  9. 关于OpenCV图像操作的默认参数问题

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51559490 在使用OpenCV以及其 ...

随机推荐

  1. _tprintf(), printf(),wprintf() 与控制字符 %s 和 %S(Unicoe与GB2312))

    _tprintf() 是 printf() 和 wprintf() 的通用类型:如果定义了 _unicode,那么 _tprintf() 就会转换为 wprintf(),否则为 printf() . ...

  2. 第五章 Java中锁

    Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁).在Lock接口出现之前,Java程序 ...

  3. Centos 7.2 安装稳定版 nginx

    1. 创建适用于RHEL/CentOS系统的安装源文件,位置为: /etc/yum.repos.d/nginx.repo , 并写入以下内容: [nginx] name=nginx repo base ...

  4. LAMP 2.4 Apache访问控制

    通过查看日志发现有个IP 恶意攻击你的网址,可以控制这个IP的访问. 打开主配置文件复制模板. vim /usr/local/apache2/conf/httpd.conf 搜索 /Order 复制 ...

  5. linux命令-分区表fstab

    磁盘分区后需要格式化,挂载之后才能使用 我们有开机后自动挂载的需求,方法有两种 1.配置文件的形式,把mount写到配置文件里去 cat /etc/fstab 2.把挂载命令写到一个文件里 ls /e ...

  6. C语言学习笔记--数组参数和指针参数

    1. 数组参数退化为指针的意义 (1)C 语言中只会以值拷贝的方式传递参数,当向函数传递数组时,将整个数组拷贝一份传入函数导致执行效率低下,C 语言以高效作是最初的设计目标,所以这种方法是不可取的. ...

  7. 用原生JS和html5进行视频截图并保存到本地

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. Android WebView 捕捉点击的URL中的信息

    项目要求,在WebView中点击搜索关键字,加载其他Web页面时,需要在一个文本输入框中,实时显示关键字 事实上,这种点击,是WebView内的,并没有跳出这个WebView,Activity也没有经 ...

  9. 未找到与约束contractname Microsoft.VisualStudio.Utilities.IContentTypeRegistryService...匹配的导出

    ***以下操作后一定要重启VS,重启VS,重启VS重要的事情说三遍*** //************************************************************* ...

  10. ssh框架整合其他方式(没有hibernate核心配置文件)