【问题标题】:Remove connected components below a threshold in a 3-d array在 3-d 数组中删除低于阈值的连接组件
【发布时间】:2018-04-25 06:32:20
【问题描述】:

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

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

【问题讨论】:

    标签: python post-processing numpy-ndarray


    【解决方案1】:

    好吧,正如您自己意识到的那样,收缩和增长并不是解决这个问题的方法。你需要做的是region labelling,而且似乎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
    

    【讨论】:

    • 嘿。所以我尝试了上面的实现,但是出现了一个错误:'tuple'对象没有属性'unique'。所以我尝试将元组作为 numpy 数组传递,但同样的错误出现了。您能提供更多帮助吗?
    • 我的错,我忘记了 skimage 区域标记和 scipy 区域标记的工作方式有点不同。我现在已经编辑了代码。
    • 谢谢。我确实得到了另一个 ValueError:'具有多个元素的数组的真值是不明确的。使用 a.any() 或 a.all()'。这是针对这一行的:'refined_mask[labelled_mask == label]
    • 这是我现在整理出来的又一个愚蠢的错误
    • 谢谢。这对我的项目有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    相关资源
    最近更新 更多