scipy.ndimage.

distance_transform_cdt#

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

Преобразование расстояния для преобразований типа шампфера.

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

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

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

Входные данные. Значения 0 обрабатываются как фон.

метрика{‘chessboard’, ‘taxicab’} или array_like, опционально

The метрика определяет тип скругления, которое выполняется. Если метрика равно 'такси' (taxicab), структура генерируется с использованием generate_binary_structure с квадратом расстояния, равным 1. Если метрика равно 'chessboard', метрика генерируется с использованием generate_binary_structure с квадратом расстояния, равным размерности массива. Эти варианты соответствуют обычным интерпретациям метрик расстояния «такси» и «шахматной доски» в двух измерениях. Пользовательская метрика может быть предоставлена в виде матрицы, где каждое измерение имеет длину три. «cityblock» и «manhattan» также допустимы и соответствуют «такси». По умолчанию используется «шахматная доска».

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

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

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

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

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

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

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

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

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

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

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

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

Смотрите также

distance_transform_edt

Быстрое преобразование расстояния для евклидовой метрики

distance_transform_bf

Преобразование расстояния для различных метрик с использованием более медленного алгоритма полного перебора

Примеры

Импорт необходимых модулей.

>>> import numpy as np
>>> from scipy.ndimage import distance_transform_cdt
>>> import matplotlib.pyplot as plt
>>> from mpl_toolkits.axes_grid1 import ImageGrid

Сначала создадим тестовое бинарное изображение.

>>> def add_circle(center_x, center_y, radius, image, fillvalue=1):
...     # fill circular area with 1
...     xx, yy = np.mgrid[:image.shape[0], :image.shape[1]]
...     circle = (xx - center_x) ** 2 + (yy - center_y) ** 2
...     circle_shape = np.sqrt(circle) < radius
...     image[circle_shape] = fillvalue
...     return image
>>> image = np.zeros((100, 100), dtype=np.uint8)
>>> image[35:65, 20:80] = 1
>>> image = add_circle(28, 65, 10, image)
>>> image = add_circle(37, 30, 10, image)
>>> image = add_circle(70, 45, 20, image)
>>> image = add_circle(45, 80, 10, image)

Далее мы настраиваем рисунок.

>>> fig = plt.figure(figsize=(5, 15))
>>> grid = ImageGrid(fig, 111, nrows_ncols=(3, 1), axes_pad=(0.5, 0.3),
...                  label_mode="1", share_all=True,
...                  cbar_location="right", cbar_mode="each",
...                  cbar_size="7%", cbar_pad="2%")
>>> for ax in grid:
...     ax.axis('off')
>>> top, middle, bottom = grid
>>> colorbar_ticks = [0, 10, 20]

Верхнее изображение содержит исходное бинарное изображение.

>>> binary_image = top.imshow(image, cmap='gray')
>>> cbar_binary_image = top.cax.colorbar(binary_image)
>>> cbar_binary_image.set_ticks([0, 1])
>>> top.set_title("Binary image: foreground in white")

Среднее изображение содержит преобразование расстояния с использованием taxicab метрика.

>>> distance_taxicab = distance_transform_cdt(image, metric="taxicab")
>>> taxicab_transform = middle.imshow(distance_taxicab, cmap='gray')
>>> cbar_taxicab = middle.cax.colorbar(taxicab_transform)
>>> cbar_taxicab.set_ticks(colorbar_ticks)
>>> middle.set_title("Taxicab metric")

Нижнее изображение содержит преобразование расстояния с использованием chessboard метрика.

>>> distance_chessboard = distance_transform_cdt(image,
...                                              metric="chessboard")
>>> chessboard_transform = bottom.imshow(distance_chessboard, cmap='gray')
>>> cbar_chessboard = bottom.cax.colorbar(chessboard_transform)
>>> cbar_chessboard.set_ticks(colorbar_ticks)
>>> bottom.set_title("Chessboard metric")
>>> plt.tight_layout()
>>> plt.show()
../../_images/scipy-ndimage-distance_transform_cdt-1.png