Проверка, находится ли точка внутри помеченного объекта с помощью scipys ndi.label()

#python #matplotlib #scipy #scikit-image #ndimage

#python #matplotlib #сципи #scikit-изображение #изображение

Вопрос:

Помеченное изображение

Выше приведено изображение, которое было введено ndi.label() и отображено с помощью matplotlib, где каждая цветная область представляет отдельный объект. Поверх изображения нанесены красные точки, каждая из которых представляет пару координат. Все координаты сохраняются, и ndi.label возвращает количество объектов. Есть ли у skimage, scipy или ndimage функция, которая проверяет, находится ли данный набор координат внутри помеченного объекта?

Первоначально я намеревался использовать поле привязки (слева, справа, сверху, снизу) каждого объекта, но из-за того, что не все области являются четырехугольными, это не сработает.

код для создания изображения:

 image = io.import("image path")
labelledImage, featureNumber = ndi.label(image)
plt.imshow(labelledImage)

for i in range(len(list))
    y, x = list[i]
    plt.scatter(y,x, c='r', s=40)
 

Комментарии:

1. Как хранятся координаты? Является ли помеченное изображение массивом numpy? Можете ли вы показать код, который его генерирует?

2. @user13044086 Изображение представляет собой числовой массив, это значение по умолчанию через skimage. Координаты хранятся в расположении списка таким образом, что: для i пар координат: x, y = list[i]

3. Можете ли вы просто проверить, что все элементы labelledImage одинаковы для заданных координат? Вот так: [labelledImage[y, x] for x, y in list] а затем проверьте, совпадают ли элементы ell

Ответ №1:

Вы можете использовать ndi.map_coordinates , чтобы найти значение в определенной координате (или группе координат) на изображении:

 labels_at_coords = ndi.map_coordinates(
        labelledImage, np.transpose(list), order=0
        )
 

Примечания:

  • массив координат должен иметь форму (ndim, npoints) , а не иногда более интуитивную (npoints, ndim) , отсюда и транспонирование.
  • в идеале было бы лучше переименовать ваш список точек на что-то вроде points_list , чтобы вы не перезаписывали встроенную функцию Python list .