Оптимизация производительности морфологической обработки
Я работаю в распознавании лиц, используя цветовое пространство YCbCr. Когда я применяю это на человеческое лицо, есть промежутки, которые обозначают нос, глаз и рот, и получающийся участок похож на (a). Для устранения этих пробелов я применяю операцию морфологического расширения и получаю результирующее изображение, показанное на (b), но мое требование - получить патч, как показано на (c). Это означает, что я хочу удалить внешние контуры из обработанного патча.
Может кто-нибудь предложить, пожалуйста, как я могу удалить эти внешние контуры?
2 ответа
У меня есть несколько советов для вас, хотя это трудно проверить без самих реальных необработанных изображений. Попробуйте один из них и посмотрите, получите ли вы что-то значимое.
Метод № 1 - Использование imfill
с последующим imopen
Одно из предложений, которое я имею, это использовать imfill
чтобы заполнить любое из отверстий в изображении, а затем вызов imopen
выполнить морфологическое вскрытие (т. е. эрозия с последующим расширением, как указано пользователем Полом Р.). Открытие (через imopen
) удаляет любые небольшие изолированные области на изображении с учетом требуемого структурирующего элемента.
Предполагая, что ваше изображение хранится в переменной BW
что-то вроде этого может работать:
BW2 = imfill(BW, 'holes');
se = strel('square', 5);
BW2 = imopen(BW2, se);
BW2
это окончательное изображение.
Метод № 2 - Использование bwareaopen
с последующим imdilate
Я также могу предложить использовать функцию bwareaopen
который удаляет объекты, чьи области подпадают под определенное количество. Попробуйте что-нибудь маленькое, например область 80 пикселей, чтобы удалить эти изолированные области, затем используйте расширение (imdilate
) команда, на которую вы ссылались в своем посте:
BW2 = bwareaopen(BW, 80);
%// Place your code for dilation here using BW2
Метод № 3 - Откройте свое изображение с imopen
затем выполнить imdilate
И последнее, что я могу предложить, - это сначала открыть свое изображение, чтобы удалить паразитные области небольших пикселей, а затем выполнить код расширения, как вы предложили:
se = strel('square', 5);
BW2 = imopen(BW, se);
%// Place your code for dilation here using BW2
Вы должны сделать следующие шаги:
- Заполнить отверстия => результат. Это заполняет все отверстия в лицо.
- Открытие (эрозия + расширение) => результат. Стирает все маленькие узоры вне фигуры.
Еще лучше: вы заменяете шаг 2 "открытием реконструкцией", которое представляет собой эрозию, за которой следует геодезическая реконструкция. Эта операция не изменяет основной шаблон. Смотрите результат.
Все эти операции должны быть доступны в OpenCV или ImageJ.