Как проверить, находятся ли координаты внутри метки или маски

Я пытаюсь проверить, какие точки в списке (массив numpy или pandas) находятся внутри данной логической маски (или помеченного изображения). Я нашел способ сравнить с полигонами, но не с маской

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

Маски / метки не будут прямоугольниками в моей реализации (в основном формами ячеек), я просто делаю это здесь, потому что это проще.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# import numpy as np

coords = np.random.rand(40, 2) *1024
mask = np.zeros((1024,1024))
mask[300:600,50:125] = 1
mask[700:800,400:650] = 2

plt.imshow(mask)
plt.scatter(coords[:,0],coords[:,1],color='red')

введите описание изображения здесь


person João Mamede    schedule 12.07.2021    source источник
comment
Вы можете проверить этот ответ.   -  person Abhi    schedule 12.07.2021
comment
Мои ярлыки не будут прямоугольными, извините, я не указал.   -  person João Mamede    schedule 12.07.2021
comment
Добавлен ответ с использованием shapely для рассмотрения любой формы.   -  person dufrmbgr    schedule 12.07.2021
comment
Я нашел способ преобразовать маски в многоугольники (cellpose.utils.masks_to_outlines).   -  person João Mamede    schedule 12.07.2021


Ответы (3)


Вы можете использовать NumPy индексацию маски с координатами после небольшого массажа.

coords_int = np.round(coords).astype(int)  # or np.floor, depends
values_at_coords = mask[tuple(coords_int.T)]
points_per_value = np.bincount(values_at_coords)

Теперь points_per_value содержит такой массив, что points_per_value[i] содержит количество координат, попавших в метку маски i. (документы для np.bincount)

Подробнее о второй строке вы можете прочитать об индексировании целочисленного массива NumPy в Документы NumPy.

person Juan    schedule 13.07.2021
comment
Это потрясающе. Надеюсь, Cupy тоже работает так. np.bincount не работал, но я исправил: values_at_coords = mask [tuple (coords_int.T)]. astype (np.int) values_at_coords достаточно, так как я могу добавить этот список как столбец в pandas lista (или список координат ). - person João Mamede; 13.07.2021

Вы можете использовать shapely, чтобы определить, находится ли точка внутри многоугольника или нет.

from shapely.geometry import Point
from shapely.geometry.polygon import Polygon

Ваша первая маска определяется следующим многоугольником.

polygon = Polygon([(300, 50), (300, 125), (600, 50), (600, 125)])

Тест на две точки выборки.

point1 = Point(315, 1200)
point2 = Point(315, 75)
print(polygon.contains(point1)) #False
print(polygon.contains(point2)) #True
person dufrmbgr    schedule 12.07.2021
comment
Результатом маскирования машинного обучения остаются маски. Я могу преобразовать каждую маску в многоугольник, но я пытаюсь найти эффективный способ прямо с меток. Спасибо за ваш ответ. - person João Mamede; 12.07.2021

person    schedule
comment
Этикетки не будут квадратами. Они были здесь просто для примера. Тай за ответ. - person João Mamede; 12.07.2021