深度学习,分割后处理之连通成分分析-Connected-Components
程序员文章站
2024-01-17 11:59:52
...
背景:用深度学习方法得到的分割结果,会有一些假阳性区域。比如说做肾分割,大家都知道,肾只有左右两边有,如果分割结果出现了三个区域,则可以根据常识,去除那个假阳性区域。用到的方法就是连通成分分析Connected-Components。
我也是刚接触,只知道OpenCV提供了这样的一个函数
cv2.connectedComponents 以及 进阶版 cv2.connectedComponentsWithStats
1.cv2.connectedComponents
实例:
import cv2
import numpy as np
img = np.array([[0, 255, 0, 0],
[0, 0, 255, 255],
[0, 0, 0, 255],
[255, 0, 0, 0]], np.uint8)
res, labels = cv2.connectedComponents(img, connectivity=4)
res
Out[5]: 4
labels
Out[6]:
array([[0, 1, 0, 0],
[0, 0, 2, 2],
[0, 0, 0, 2],
[3, 0, 0, 0]], dtype=int32)
假设img是分割结果,值为255的是目标区域,可以发现,目标区域有3块。res代表区域的数量(0,1,2,3),labels为经过连通区域分析后的标记,把不同区域的相同值标记为不同的类别(有点绕口)。这样标记后,如果我们觉得3那个区域是假阳性,那我们就可以把3那个区域的值变为0, 其余区域的值标记为255, 这样就消除掉3这个区域的阳性值了。
label = np.where(labels > 2, 0, labels)
# 把labels中,大于2的值,赋值为0, 其余的就是labels原来的值。这样就剩下了两个区域
print(label)
结果如下:
[[0 1 0 0]
[0 0 2 2]
[0 0 0 2]
[0 0 0 0]]
上述例子例子中,参数connectivity =4 表示在4邻域(上下左右)范围内查找元素,也是可以改成8邻域对比一下
2. cv2.connectedComponentsWithStats
stats 是bounding box的信息,N*5的矩阵,行对应每个label,五列分别为[x0, y0, width, height, area]
以上内容参考 https://www.jianshu.com/p/a9cc11af270c
总结:该方法对二维图像去除假阳性区域很好用,但是无法对三维图像进行操作。