【问题标题】:How to compute a spatial distance matrix from a given value如何根据给定值计算空间距离矩阵
【发布时间】:2018-10-09 11:30:19
【问题描述】:

我一直在寻找一种方法来(有效地)根据目标值和输入矩阵计算距离矩阵。

如果您将输入数组视为:

[0 0 1 2 5 2 1]  
[0 0 2 3 5 2 1]  
[0 1 1 2 5 4 1]  
[1 1 1 2 5 4 0]

你如何计算与目标值 0 相关的空间距离矩阵?

即每个像素到最接近的 0 值的距离是多少?

提前致谢

【问题讨论】:

    标签: python numpy scipy distance scipy-spatial


    【解决方案1】:

    您正在寻找scipy.ndimage.morphology.distance_transform_edt。它对二进制数组进行操作,并计算每个TRUE 位置到最近背景FALSE 位置的欧几里得距离。在我们的例子中,因为我们想找出距离最近的 0 的距离,所以背景是0。现在,在后台,它将输入转换为假设背景为 0 的二进制数组,因此我们可以将其与默认参数一起使用。因此,它就像 -

    In [179]: a
    Out[179]: 
    array([[0, 0, 1, 2, 5, 2, 1],
           [0, 0, 2, 3, 5, 2, 1],
           [0, 1, 1, 2, 5, 4, 1],
           [1, 1, 1, 2, 5, 4, 0]])
    
    In [180]: from scipy import ndimage
    
    In [181]: ndimage.distance_transform_edt(a)
    Out[181]: 
    array([[0.  , 0.  , 1.  , 2.  , 3.  , 3.16, 3.  ],
           [0.  , 0.  , 1.  , 2.  , 2.83, 2.24, 2.  ],
           [0.  , 1.  , 1.41, 2.24, 2.24, 1.41, 1.  ],
           [1.  , 1.41, 2.24, 2.83, 2.  , 1.  , 0.  ]])
    

    解决一般情况

    现在,假设我们要找出距离最近的1s 的距离,那么它将是 -

    In [183]: background = 1 # element from which distances are to be computed
    
    # compare this with original array, a to verify
    In [184]: ndimage.distance_transform_edt(a!=background)
    Out[184]: 
    array([[2.  , 1.  , 0.  , 1.  , 2.  , 1.  , 0.  ],
           [1.41, 1.  , 1.  , 1.41, 2.  , 1.  , 0.  ],
           [1.  , 0.  , 0.  , 1.  , 2.  , 1.  , 0.  ],
           [0.  , 0.  , 0.  , 1.  , 2.  , 1.41, 1.  ]])
    

    【讨论】:

    • 完美,非常感谢,这正是我想要的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 2019-10-09
    相关资源
    最近更新 更多