如何根据给定值计算空间距离矩阵
How to compute a spatial distance matrix from a given value
我一直在寻找一种方法(有效地)根据目标值和输入矩阵计算距离矩阵。
如果您将输入数组视为:
[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 值的距离是多少?
提前致谢
您正在寻找 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. ]])
我一直在寻找一种方法(有效地)根据目标值和输入矩阵计算距离矩阵。
如果您将输入数组视为:
[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 值的距离是多少?
提前致谢
您正在寻找 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. ]])