Как создать замкнутую область вокруг кластера пикселей? - PullRequest
0 голосов
/ 30 апреля 2019

Я делаю некоторую обработку изображений в Python 3.5.2. После некоторой работы я сегментировал и изображение, используя Машины опорных векторов (используется как задача классификации по пикселям). Как и ожидалось после тренировки, когда я пытаюсь предсказать новое изображение, я получаю несколько пикселей с ошибкой. У меня есть только классы для сегментации, поэтому результат будет работать как маска с 1 в нужном регионе и 0 в другом месте.

Пример предсказанной маски выглядит следующим образом:

one

EDIT : Вот ссылка на это изображение (сохранено с помощью cv2.imwrite()):

https://i.ibb.co/74nxLvZ/img.jpg


Как вы можете видеть, существует большая область с некоторыми дырами, что означает, что они являются False Negative (FN) пиксельными предсказаниями. Кроме того, есть несколько ложных положительных (FP) пикселей за пределами этой большой области.

Я хочу быть в состоянии получить маску для этого большого региона в одиночестве и заполненной. Поэтому я думал об использовании некоторого метода кластеризации, такого как DBSCAN или K-означает , чтобы создать кластеры на этих точках данных, надеясь получить кластер для большого региона. Есть ли у вас какие-либо предложения по этому вопросу?

Теперь предположим, что у меня есть эти кластеры. Как я могу заполнить дыры в большом регионе. Я хотел бы создать какую-то фигуру / многоугольник / Рой вокруг этой большой области, а затем получить все пиксели внутри. Может ли кто-нибудь пролить свет на то, как этого добиться?

Каким-то образом я бы хотел что-то вроде этого:

two

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

Заранее спасибо

1 Ответ

1 голос
/ 09 мая 2019

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

Затем вы можете получить контур области, которую хотите заполнить. В этом случае большая белая область с отверстиями.

# im_gray: is the binary image you have
cnt, _ = cv2.findContours(im_gray, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_NONE)

Вы можете просмотреть cnt, чтобы выбрать правильный контур. Затем, если вы «знаете» нужный контур, вы можете использовать функцию cv2.approxPolyDP() из OpenCV

взято из Учебник OpenCV

Он приближает форму контура к другой форме с меньшим количеством вершин. в зависимости от точности мы указываем. Это реализация Дугласа-Пекера алгоритм.

epsilon = 0.001
approxPoly= cv2.approxPolyDP(np.array(maxPoly), epsilon, closed=True)

epsilon - это параметр точности, это максимальное расстояние от контура до приблизительного контура. Как указано в документации (ссылка выше), вы можете использовать epsilon=0.1*cv2.arcLength(cnt,True). В этом случае я использовал значение 0.001.

Если у вас есть это, вы можете просто нарисовать его:

poligon_mask = np.zeros(im_gray.shape)
poligon_mask = cv2.drawContours(max_poligon_mask, [approxPoly], cv2.FILLED, (255), -1)

Надеюсь, это поможет.

...