![a44fa9a5e6c20e7322d2ce470f7f795f.png](https://i-blog.csdnimg.cn/blog_migrate/eb06e9cac559d3485869ffee8b7de9ee.png)
连通域分析是非常常见的图像处理操作。连通区域分析一般是针对二值图像,将具有相同像素值且相邻的像素找出来并标记。例如针对上面的同心圆图像,将每个圆环完整的找出来并比标记上不同的颜色。这里涉及如何定义相邻,什么是连通区域,什么是连通区域分析几个概念。
连通区域分析简介
- 如何定义像素相邻
一般可以分4领域和8领域。分别如下图所示
![1cb18c8218a7c2eb81be47cfddbe069f.png](https://i-blog.csdnimg.cn/blog_migrate/18722d803d51bb67ff521cb387d3c2e1.jpeg)
- 连通区域 (connected component):图像中具有相同的像素值且相邻的区域
- 连通区域分析 (connected component analysis):将图像中的联通区域找出来并标记,也称为联通区域标记。
一般会先将图像二值化,将图像分为前景区域和背景区域。相当于是已经知道如何区提取有效像素值,然后进行连通域分析,而如何提取感兴趣的区域是一个非常的问题,这里不做讨论。有两种经典的连通区域分析算法:1、Two-Pass(两次遍历), 2、 Seed Filling(种子填充)。
连通域分析算法
连通域是相同像素值的相邻像素组成的集合,将每个连通域设置一个标记,就完成了连通域分析。这里主要的难点是如何确定一个像素属于哪个连通区域。
假设已经将图像二值化为0、1,也就是背景为0,,前景为1。需要做的工作是给相连通的像素值(等于1)设置一个标记。
Two-Pass(两次遍历)
two-pass算法,顾名思义需要两次遍历图像,第一次遍历给图像所有的像素设置一个标记,并记录各个标记属于哪个连通域,第二次遍历将每个像素标记为所属的连通域。
具体流程如下:
1、 第一次遍历图像
对所有感兴趣的像素(值为1)执行以下操作
- a 如果左领域和上领域都为0(假设是从上到下,从左至右遍历):
赋予像素一个新的label, 然后label ++。即 labelImg(x,y) = label++; - b 当前像素的label与领域像素相同
- 将领域像素所属的label中最小的赋值给当前像素
即: labelImg(x,y)= min(Neighbors) - 记录label所属的联通区域,也就是那些label是一个联通区域。
labelSet[i] = {label_n, ... , label_m}。可以采用不同的记录方式。
2、第二次遍历图像
第一遍已经给像素分配了一个label,同时知道每个label所属的联通区域。所以只需要把分配的label跟换为所属的联通区域。
第二遍遍历完成后具有相同label的像素组成了一个联通区域,可以对联通区域进行进一步分析,例如计算面积,计算外接矩形,计算质心等等。
如下动态展示two-pass算法的过程:
![8c517f158b405e5f29971fde0cda7880.gif](https://i-blog.csdnimg.cn/blog_migrate/195ceb1ed726e737aba95e71c90469c8.gif)
Seed-Filling(种子填充法)
种子填充法从一个种子开始向领域周围搜索,发现有相等的像素值则标记为相同的label,然后继续在领域搜索,直到周围都没有相同的像素值后就找到一个联通区域。然后再以其他的种子,继续搜索下一个联通区域。这里的种子就是一个感兴趣的像素(值大于1)。
具体流程如下
1、 遍历图像,如果像素值为1则执行以下操作:
a 将当前像素作为种子,并赋予一个新的label,然后将其所有领域的感兴趣的像素(值大于1)的位置加入栈中。
b