删除 3-d 数组中低于阈值的连接组件
Remove connected components below a threshold in a 3-d array
我正在 python 中处理 3-D numpy 数组,想对脑肿瘤分割图像的 CNN 输出进行 post 处理。我们得到一个 3-D (208x208x155) numpy 数组,每个像素的值为 0/1/2/4。我想删除阈值小于 1000 的连接组件以获得更好的结果。
我尝试了腐蚀膨胀,但没有得到好的结果。谁能帮帮我?
好的,正如您自己意识到的那样,收缩和增长并不是解决这个问题的方法。您需要做的是 region labelling, and it seems that Scipy 有一种方法可以让您对 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
我正在 python 中处理 3-D numpy 数组,想对脑肿瘤分割图像的 CNN 输出进行 post 处理。我们得到一个 3-D (208x208x155) numpy 数组,每个像素的值为 0/1/2/4。我想删除阈值小于 1000 的连接组件以获得更好的结果。
我尝试了腐蚀膨胀,但没有得到好的结果。谁能帮帮我?
好的,正如您自己意识到的那样,收缩和增长并不是解决这个问题的方法。您需要做的是 region labelling, and it seems that Scipy 有一种方法可以让您对 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