【问题标题】:python/numpy: find edges of a 2D/3D maskpython/numpy:查找 2D/3D 蒙版的边缘
【发布时间】:2021-07-28 07:00:40
【问题描述】:

这个问题与this question 非常相似,但我不确定如何将答案应用于 2D 或 3D 数组。

举个简单的例子,使用以下形状为 (5,5) 的二维数组:

In [158]: a                                                                                                                                                                      
Out[158]: 
array([[0, 0, 0, 0, 0],
       [0, 1, 1, 1, 0],
       [0, 1, 1, 1, 0],
       [0, 1, 1, 1, 0],
       [0, 0, 0, 0, 0]])

我想获取边缘的索引。对于这种情况:

(array([1, 1, 1, 2, 2, 3, 3, 3]), array([1, 2, 3, 1, 3, 1, 2, 3]))

现在我在两个方向/轴上移动数组,与原始数组进行比较并识别具有不同值的单元格:

In [230]: np.nonzero(a!= np.roll(a,shift=(1,1),axis=(0,1)))                                                                                                                      
Out[230]: (array([1, 1, 1, 2, 2, 3, 3, 4, 4, 4]), array([1, 2, 3, 1, 4, 1, 4, 2, 3, 4]))

有些索引是正确的,但有些则不是。我想由于我应用的转变,4s 应该变成 3s,但我不确定如何纠正这个问题,因为我计划将它应用于更复杂(和更大)的掩码数组。我的最终目标是将其应用于 3D 数组。

我正在使用 Python 3.7.1

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    您可以使用边缘检测过滤器convolve您的阵列

    import numpy as np
    from scipy.ndimage import convolve
    
    x = np.array(
          [[0, 0, 0, 0, 0],
           [0, 1, 1, 1, 0],
           [0, 1, 1, 1, 0],
           [0, 1, 1, 1, 0],
           [0, 0, 0, 0, 0]])
    
    fil = [[-1,-1,-1],
           [-1, 8,-1],
           [-1,-1,-1]]
    
    np.where(convolve(x,fil, mode='constant') > 1)
    

    输出:

    (array([1, 1, 1, 2, 2, 3, 3, 3]), array([1, 2, 3, 1, 3, 1, 2, 3]))
    

    卷积的结果

    convolve(x,fil, mode='constant')
    

    输出:

    [[-1 -2 -3 -2 -1]
     [-2  5  3  5 -2]
     [-3  3  0  3 -3]
     [-2  5  3  5 -2]
     [-1 -2 -3 -2 -1]]
    

    【讨论】:

    • 谢谢!如果我想处理三维数组,是否只需将 fil 数组更改为 (3,3,3) 数组并使用 scipy.signal 中的 convolve 函数?
    • 我更新了我的答案以使用多维卷积,我阅读了你的最终目标。您必须对 3D 数组使用 3D 滤镜。
    • 不过3D边缘检测更多complicated
    • 这就是我所看到的,我会尝试看看我能做什么!!再次感谢
    猜你喜欢
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2011-04-08
    • 2014-01-06
    • 1970-01-01
    相关资源
    最近更新 更多