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)