Как заполнить сложный граф в OpenCV

сценарий

Я пишу программу для обнаружения волос с кожи. Пока я сделал это...

  1. Загруженное исходное изображение и примененный захват для удаления фона

  1. Прикладное обнаружение кожи для получения кожи

  1. Выполнил ANDing для получения волос вместе с другими регионами

  1. Выполнение обнаружения контура для получения контура с максимальным размером

Imgproc.drawContours(mask, contours, maxAreaIndex, new Scalar(255,255,255),1);

проблема

Когда я пытаюсь заполнить маску, полученную при запуске findContour с использованием кода

Imgproc.drawContours(mask, contours, maxAreaIndex, new Scalar(255,255,255),Core.FILLED);

он заполняет контур как

Теперь я не могу использовать это как маску, так как это даст мой результат как

что не то, что я хочу.

Кто-нибудь может подсказать, как мне добиться закрашенного контура для этой проблемы?

1 ответ

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

ОДНАКО, этот метод предполагает, что вы обнаружили в основном волосы на вашем изображении. То, что вы сделали, отличается; Вы обнаружили НЕ КОЖУ на своей фотографии и предположили, что волосы были самым большим контуром. Делая это, когда вы закрываете свои контуры, особенно на изображениях, где рубашка человека имеет более высокий покрой, вы можете столкнуться с некоторой проблемой, когда вы обнаруживаете рубашку и волосы. Я бы добавил дополнительный шаг в ваш конвейер, где вы пытаетесь сегментировать рубашку на человеке перед применением этой фильтрации.

Удачи!

Другие вопросы по тегам