В то время как Matlab bwdist
возвращает расстояния до ближайшей ненулевой ячейки, Python distance_transform_edt
возвращает расстояния «до ближайшего элемента фона». В документации SciPy не ясно, что он считает «фоном», за этим стоит механизм преобразования типов; на практике 0
- это фон, ненулевой - это передний план.
Итак, если у нас есть матрица a
:
>>> a = np.array(([0,1,0,0,0],
[1,0,0,0,0],
[0,0,0,0,1],
[0,0,0,0,0],
[0,0,1,0,0]))
затем для вычисления того же результата нам нужно заменить единицы на нули, а нули на единицы, например, рассмотрим матрицу 1-a
:
>>> a
array([[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0]])
>>> 1 - a
array([[1, 0, 1, 1, 1],
[0, 1, 1, 1, 1],
[1, 1, 1, 1, 0],
[1, 1, 1, 1, 1],
[1, 1, 0, 1, 1]])
В этом случае scipy.ndimage.morphology.distance_transform_edt
дает ожидаемые результаты:
>>> distance_transform_edt(1-a)
array([[ 1. , 0. , 1. , 2. , 2. ],
[ 0. , 1. , 1.41421356, 1.41421356, 1. ],
[ 1. , 1.41421356, 2. , 1. , 0. ],
[ 2. , 1.41421356, 1. , 1.41421356, 1. ],
[ 2. , 1. , 0. , 1. , 2. ]])