Python 删除三维阵列中低于阈值的连接组件

Python 删除三维阵列中低于阈值的连接组件,python,post-processing,numpy-ndarray,Python,Post Processing,Numpy Ndarray,我正在用python开发3-D numpy数组,希望对CNN输出的脑肿瘤分割图像进行后处理。我们得到一个三维(208x208x155)numpy阵列,每个像素的值为0/1/2/4。我想删除阈值小于1000的已连接组件以获得更好的结果 我尝试了腐蚀扩张,但没有得到好的结果。有人能帮我吗?好的,所以,正如你自己意识到的那样,收缩和增长不是解决这个问题的方法。您需要做的是,似乎有一种方法可以让您对nd图像这样做 我假设阈值小于1000表示连接组件中像素值的总和 下面是我将如何做的概要 from sci

我正在用python开发3-D numpy数组,希望对CNN输出的脑肿瘤分割图像进行后处理。我们得到一个三维(208x208x155)numpy阵列,每个像素的值为0/1/2/4。我想删除阈值小于1000的已连接组件以获得更好的结果


我尝试了腐蚀扩张,但没有得到好的结果。有人能帮我吗?

好的,所以,正如你自己意识到的那样,收缩和增长不是解决这个问题的方法。您需要做的是,似乎有一种方法可以让您对nd图像这样做

我假设阈值小于1000表示连接组件中像素值的总和

下面是我将如何做的概要

from scipy.ndimage import label

segmentation_mask = [...]  # This should be your 3D mask.

# Let us create a binary mask.
# It is 0 everywhere `segmentation_mask` is 0 and 1 everywhere else.
binary_mask = segmentation_mask.copy()
binary_mask[binary_mask != 0] = 1

# Now, we perform region labelling. This way, every connected component
# will have their own colour value.
labelled_mask, num_labels = label(binary_mask)

# Let us now remove all the too small regions.
refined_mask = segmentation_mask.copy()
minimum_cc_sum = 1000
for label in range(num_labels):
    if np.sum(refined_mask[labelled_mask == label]) < minimum_cc_sum:
        refined_mask[labelled_mask == label] = 0
来自scipy.ndimage导入标签
分段遮罩=[…]#这应该是你的3D遮罩。
#让我们创建一个二进制掩码。
#“segmentation_mask”在任何地方都是0,在其他地方都是1。
二进制掩码=分段掩码.copy()
二进制屏蔽[二进制屏蔽!=0]=1
#现在,我们执行区域标记。这样,每个连接的组件
#会有自己的色彩价值。
带标签的\u掩码,num\u labels=标签(二进制\u掩码)
#现在让我们删除所有太小的区域。
优化的屏蔽=分段屏蔽.copy()
最小值=1000
对于范围内的标签(num_标签):
如果np.sum(改进的屏蔽[Labeled\u mask==label])<最小屏蔽:
优化的\u掩码[已标记的\u掩码==标签]=0

嘿。所以我尝试了上面的实现,但是出现了一个错误:“tuple”对象没有“unique”属性。因此,我尝试将元组作为numpy数组传递,但出现了相同的错误。你能进一步帮助我吗?我的错,我忘记了撇除区域标签和scipy区域标签的工作原理有点不同。我现在已经编辑了代码。谢谢。我确实得到了另一个ValueError:“包含多个元素的数组的真值不明确。使用a.any()或a.all()。这是针对这一行的:“精制的屏蔽[labeled\u mask==label]