【问题标题】:Remove segments from numpy array that have a total intensity below a certain threshold从 numpy 数组中删除总强度低于某个阈值的片段
【发布时间】:2020-04-15 18:19:43
【问题描述】:

我正在编写一个分段脚本,该脚本根据分段大小(面积)和每个分段内像素的总强度过滤分段。

按照这篇文章中的答案,我想出了如何根据区域删除细分:

Returning specific numpy label indices for an image

在脚本的最后部分,我想删除总强度低于某个阈值的片段。

希望这个例子展示了我想要完成的事情:

import numpy as np
from scipy import ndimage
A = np.array([

      [0, 0, 0, 0, 0, 0, 2, 2, 0, 0],
      [0, 2, 7, 3, 0, 0, 0, 0, 0, 0],
      [0, 0, 4, 2, 0, 0, 0, 0, 0, 0],
      [0, 0, 2, 0, 0, 0, 0, 1, 0, 0],
      [0, 0, 0, 0, 0, 0, 2, 3, 0, 0],
      [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
      [0, 0, 0, 5, 0, 0, 0, 0, 0, 0],
      [0, 0, 4, 9, 3, 0, 0, 4, 0, 0],
      [0, 0, 0, 6, 0, 0, 0, 5, 3, 0],
      [0, 3, 0, 0, 0, 0, 0, 0, 0, 0],
])

我可以使用以下方法获得每个段的总和:

label_A, nb_labels = ndimage.label(A)
seg_sum = ndimage.sum(A, label_A, range(nb_labels + 1))
seg_sum

Output: array([ 0.,  4., 20.,  7., 27., 12.,  3.])`

我希望能够将总和小于 10 的任何段转换为零。任何帮助深表感谢。 谢谢

【问题讨论】:

    标签: python arrays numpy scipy


    【解决方案1】:

    从seg_sum 开始,您可以检查哪些分量的总和小于10,并使用np.in1d 检查A 中哪些值设置为零:

    labels_to_zero = np.arange(1,len(seg_sum))[seg_sum[1:]>=10]
    # array([2, 4, 5])
    
    ix = np.in1d(label_A, labels_to_zero)
    
    np.where(ix, A.ravel(), 0).reshape(A.shape)
    
    array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 2, 7, 3, 0, 0, 0, 0, 0, 0],
           [0, 0, 4, 2, 0, 0, 0, 0, 0, 0],
           [0, 0, 2, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 5, 0, 0, 0, 0, 0, 0],
           [0, 0, 4, 9, 3, 0, 0, 4, 0, 0],
           [0, 0, 0, 6, 0, 0, 0, 5, 3, 0],
           [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
    

    【讨论】:

    • 谢谢!我认为这会奏效。由于某种原因,当对我要分析的图像上的实际段执行 seg_sum 命令时,它会将结果输出数组中的总和从小到大排序。我发布的示例没有这种行为。我不确定为什么会这样。然后,如果我继续您对实际细分的建议,它会删除前 3 个细分,无论它们的总和是多少。有任何想法吗?排序差异会是问题的根源吗?
    • 嗯不知道为什么会这样。我在文档中看不到对这种行为的任何引用。也许发布另一个失败的例子?虽然我会感到惊讶,但这似乎不太合乎逻辑@Landy
    猜你喜欢
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 2019-02-10
    • 2021-02-26
    相关资源
    最近更新 更多