scipy.ndimage.

distance_transform_edt#

scipy.ndimage.distance_transform_edt(входные данные, выборка=None, return_distances=True, return_indices=False, расстояния=None, индексы=None)[источник]#

Точное преобразование евклидова расстояния.

Эта функция вычисляет преобразование расстояния входные данные, путём замены каждого элемента переднего плана (ненулевого) на его кратчайшее расстояние до фона (любого элемента с нулевым значением).

В дополнение к преобразованию расстояния можно вычислить преобразование признаков. В этом случае индекс ближайшего фонового элемента к каждому переднему элементу возвращается в отдельном массиве.

Параметры:
входные данныеarray_like

Входные данные для преобразования. Могут быть любого типа, но будут преобразованы в бинарные: 1 везде, где входные данные эквивалентны True, 0 в остальных случаях.

выборкаfloat, или последовательность float, опционально

Расстояние между элементами по каждому измерению. Если задана последовательность, она должна иметь длину, равную рангу входных данных; если задано одно число, оно используется для всех осей. Если не указано, подразумевается расстояние сетки, равное единице.

return_distancesbool, необязательно

Вычислять ли преобразование расстояния. По умолчанию True.

return_indicesbool, необязательно

Следует ли вычислять преобразование признаков. По умолчанию: False.

расстоянияfloat64 ndarray, опционально

Выходной массив для хранения вычисленного преобразования расстояния, вместо возврата его. return_distances должно быть True. Оно должно иметь ту же форму, что и входные данные.

индексыint32 ndarray, опционально

Выходной массив для хранения вычисленного преобразования признаков вместо его возврата. return_indicies должно быть True. Его форма должна быть (input.ndim,) + input.shape.

Возвращает:
расстоянияfloat64 ndarray, опционально

Рассчитанное преобразование расстояния. Возвращается только когда return_distances равно True и расстояния не предоставлен. Он будет иметь ту же форму, что и входной массив.

индексыint32 ndarray, опционально

Вычисленное преобразование признаков. Имеет массив формы ввода для каждого измерения ввода. См. пример ниже. Возвращается только когда return_indices равно True и индексы не предоставлен.

Примечания

Евклидово преобразование расстояния даёт значения евклидова расстояния:

              n
y_i = sqrt(sum (x[i]-b[i])**2)
              i

где b[i] — это точка фона (значение 0) с наименьшим евклидовым расстоянием до входных точек x[i], а n — это количество измерений.

Примеры

>>> from scipy import ndimage
>>> import numpy as np
>>> a = np.array(([0,1,1,1,1],
...               [0,0,1,1,1],
...               [0,1,1,1,1],
...               [0,1,1,1,0],
...               [0,1,1,0,0]))
>>> ndimage.distance_transform_edt(a)
array([[ 0.    ,  1.    ,  1.4142,  2.2361,  3.    ],
       [ 0.    ,  0.    ,  1.    ,  2.    ,  2.    ],
       [ 0.    ,  1.    ,  1.4142,  1.4142,  1.    ],
       [ 0.    ,  1.    ,  1.4142,  1.    ,  0.    ],
       [ 0.    ,  1.    ,  1.    ,  0.    ,  0.    ]])

С дискретизацией 2 единицы по x, 1 по y:

>>> ndimage.distance_transform_edt(a, sampling=[2,1])
array([[ 0.    ,  1.    ,  2.    ,  2.8284,  3.6056],
       [ 0.    ,  0.    ,  1.    ,  2.    ,  3.    ],
       [ 0.    ,  1.    ,  2.    ,  2.2361,  2.    ],
       [ 0.    ,  1.    ,  2.    ,  1.    ,  0.    ],
       [ 0.    ,  1.    ,  1.    ,  0.    ,  0.    ]])

Запрос индексов также:

>>> edt, inds = ndimage.distance_transform_edt(a, return_indices=True)
>>> inds
array([[[0, 0, 1, 1, 3],
        [1, 1, 1, 1, 3],
        [2, 2, 1, 3, 3],
        [3, 3, 4, 4, 3],
        [4, 4, 4, 4, 4]],
       [[0, 0, 1, 1, 4],
        [0, 1, 1, 1, 4],
        [0, 0, 1, 4, 4],
        [0, 0, 3, 3, 4],
        [0, 0, 3, 3, 4]]], dtype=int32)

С массивами, предоставленными для inplace-выводов:

>>> indices = np.zeros(((np.ndim(a),) + a.shape), dtype=np.int32)
>>> ndimage.distance_transform_edt(a, return_indices=True, indices=indices)
array([[ 0.    ,  1.    ,  1.4142,  2.2361,  3.    ],
       [ 0.    ,  0.    ,  1.    ,  2.    ,  2.    ],
       [ 0.    ,  1.    ,  1.4142,  1.4142,  1.    ],
       [ 0.    ,  1.    ,  1.4142,  1.    ,  0.    ],
       [ 0.    ,  1.    ,  1.    ,  0.    ,  0.    ]])
>>> indices
array([[[0, 0, 1, 1, 3],
        [1, 1, 1, 1, 3],
        [2, 2, 1, 3, 3],
        [3, 3, 4, 4, 3],
        [4, 4, 4, 4, 4]],
       [[0, 0, 1, 1, 4],
        [0, 1, 1, 1, 4],
        [0, 0, 1, 4, 4],
        [0, 0, 3, 3, 4],
        [0, 0, 3, 3, 4]]], dtype=int32)