Как вычислить матрицу пространственного расстояния из заданного значения - PullRequest
0 голосов
/ 09 октября 2018

Я искал способ (эффективно) вычислить матрицу расстояний из целевого значения и входной матрицы.

Если вы рассматриваете входной массив как:

[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 Ответ

0 голосов
/ 09 октября 2018

Вы ищете 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.  ]])
...