Как заполнить сложный граф в OpenCV
сценарий
Я пишу программу для обнаружения волос с кожи. Пока я сделал это...
- Загруженное исходное изображение и примененный захват для удаления фона
- Прикладное обнаружение кожи для получения кожи
- Выполнил ANDing для получения волос вместе с другими регионами
- Выполнение обнаружения контура для получения контура с максимальным размером
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 ответ
Вы можете применить некоторую фильтрацию дилатационной эрозии (закрытия) перед извлечением контуров, чтобы быть уверенным, что вы получите полный контур. По сути, дилатационная эрозия заключается в том, что замыкаются области контуров, которые обычно бывают раздельными и располагаются рядом друг с другом, расширяя их так, чтобы они пересекались, а затем сжимая теперь пересеченный контур обратно вниз, чтобы он оставался правильно масштабированным. Проверьте здесь для получения дополнительной информации по этой теме.
ОДНАКО, этот метод предполагает, что вы обнаружили в основном волосы на вашем изображении. То, что вы сделали, отличается; Вы обнаружили НЕ КОЖУ на своей фотографии и предположили, что волосы были самым большим контуром. Делая это, когда вы закрываете свои контуры, особенно на изображениях, где рубашка человека имеет более высокий покрой, вы можете столкнуться с некоторой проблемой, когда вы обнаруживаете рубашку и волосы. Я бы добавил дополнительный шаг в ваш конвейер, где вы пытаетесь сегментировать рубашку на человеке перед применением этой фильтрации.
Удачи!