Opencv图像连通域

【摘要】

本文介绍在图像处理领域中较为常用的一种图像区域(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

posted @ 2018-03-21 10:46  扰扰  阅读(1159)  评论(0编辑  收藏  举报