目录
skimage 实现3D数组连通域处理
在一些计算机视觉任务中,需要对模型的输出做一些后处理以优化视觉效果,连通域就是一种常见的后处理方式。尤其对于分割任务,有时的输出mask会存在一些假阳(小的无用轮廓),通过3D连通域找出面积较小的独立轮廓并去除可以有效地提升视觉效果。skimage是python的一个图像处理库,功能强大并且使用方便。这里主要使用了skimage里的measure模块,官方也提供了相关方法的说明及使用。
1. 任务说明
模型输出了一个n*w*h
的三维数组,数组中包含了模型对某一类(或几类)的分割结果,从形态学角度看在3D上每一类分割结果都应该是连续的,因此可以使用3D连通域去除那些不连通的小区域。
1.1 连通域
连通域(Connected Component)指的是图像中具有相同像素值且位置相邻的前景像素点组成的图像区域(Region)。连通域一般有两种,分别为4连通和8连通,下面借用skimage的示意图。
1-connectivity 2-connectivity diagonal connection close-up
[ ] [ ] [ ] [ ] [ ]
| \ | / | <- hop 2
[ ]--[x]--[ ] [ ]--[x]--[ ] [x]--[ ]
| / | \ hop 1
[ ] [ ] [ ] [ ]
连通域的实现有两种方式,一是two-pass算法,通过并查集(union-find)实现;二是Seed-Filling 算法,基于图形学中的区域生长,可以递归实现。
1.2 measure方法
skimage.measure.label
- 函数功能:把输入的整数数组进行连通域标记
- 函数定义:skimage.measure.label(input, neighbors=None, background=None, return_num=False, connectivity=None)
- 参数说明:
input: int类型的ndarray,需要标记的图像;
neighbors: 废弃的参数,被connectivity替代;
background: int类型,可选,将像素为该值的视为背景并设置为0,默认为0;
return_num: bool,可选,是否返回标记的区域数量;
connectivity: int,可选,最大为输入的ndims,选择是几连通(对于输入为2D来说,1即为4连通,2为8连通)。
- 返回值:
labels: 形状和类型与input一致,连通的区域使用相同的整数标记
nums: 标签数,等于最大标签索引,仅在return_num为True时返