scipy.ndimage.

distance_transform_bf#

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

Функция преобразования расстояния алгоритмом грубой силы.

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

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

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

Вход

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

‘cityblock’ и ‘manhattan’ также допустимы и соответствуют ‘taxicab’. По умолчанию используется ‘euclidean’.

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

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

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

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

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

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

расстоянияndarray, необязательно

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

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

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

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

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

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

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

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

distance_transform_cdt

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

distance_transform_edt

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

Примечания

Эта функция использует медленный алгоритм полного перебора. См. также функцию distance_transform_cdt для более эффективного такси [1] и алгоритмы шахматной доски [2].

Ссылки

[1]

Манхэттенское расстояние. Википедия, 2023. https://en.wikipedia.org/wiki/Taxicab_geometry

[2]

Расстояние шахматной доски. Wikipedia, 2023. https://en.wikipedia.org/wiki/Chebyshev_distance

Примеры

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

>>> import numpy as np
>>> from scipy.ndimage import distance_transform_bf
>>> 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=(8, 8))  # set up the figure structure
>>> grid = ImageGrid(fig, 111, nrows_ncols=(2, 2), axes_pad=(0.4, 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')  # remove axes from images

Изображение вверху слева — исходное бинарное изображение.

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

Преобразование расстояния вычисляет расстояние между пикселями переднего плана и фоном изображения в соответствии с метрикой расстояния. Доступные метрики в distance_transform_bf являются: euclidean (по умолчанию), taxicab и chessboard. Изображение в правом верхнем углу содержит преобразование расстояния на основе euclidean метрика.

>>> distance_transform_euclidean = distance_transform_bf(image)
>>> euclidean_transform = grid[1].imshow(distance_transform_euclidean,
...                                      cmap='gray')
>>> cbar_euclidean = grid.cbar_axes[1].colorbar(euclidean_transform)
>>> colorbar_ticks = [0, 10, 20]
>>> cbar_euclidean.set_ticks(colorbar_ticks)
>>> grid[1].set_title("Euclidean distance")

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

>>> distance_transform_taxicab = distance_transform_bf(image,
...                                                    metric='taxicab')
>>> taxicab_transformation = grid[2].imshow(distance_transform_taxicab,
...                                         cmap='gray')
>>> cbar_taxicab = grid.cbar_axes[2].colorbar(taxicab_transformation)
>>> cbar_taxicab.set_ticks(colorbar_ticks)
>>> grid[2].set_title("Taxicab distance")

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

>>> distance_transform_cb = distance_transform_bf(image,
...                                               metric='chessboard')
>>> chessboard_transformation = grid[3].imshow(distance_transform_cb,
...                                            cmap='gray')
>>> cbar_taxicab = grid.cbar_axes[3].colorbar(chessboard_transformation)
>>> cbar_taxicab.set_ticks(colorbar_ticks)
>>> grid[3].set_title("Chessboard distance")
>>> plt.show()
../../_images/scipy-ndimage-distance_transform_bf-1.png