Как вычислить матрицу пространственного расстояния из заданного значения
Я искал способ (эффективно) вычислить матрицу расстояний из целевого значения и входной матрицы.
Если вы рассматриваете входной массив как:
[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?
заранее спасибо
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. ]])