1

Я работаю в распознавании лиц с использованием цветового пространства YCbCr. Когда я применяю его на человеческом лице, есть промежутки, которые обозначают нос, глаз и рот, а результирующий патч выглядит как (a). Чтобы устранить эти пробелы, я применяю операцию морфологической дилатации, и я получаю результирующее изображение, показанное в (b), но мое требование - получить патч, как показано в (c). Это означает, что я хочу удалить внешние контуры из обработанного патча.Оптимизация производительности морфологической обработки

enter image description here

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

+1

Поскольку вы занимаетесь обработкой изображений, трудно представить это без фактического изображения. Ваш пост заставляет его звучать так, как будто вы ссылаетесь на изображение, но его нет в вашем сообщении. Не могли бы вы отредактировать свой пост? – rayryeng

+1

Можете ли вы загрузить изображение (a) отдельно? – rayryeng

+2

Вы, вероятно, хотите сначала подорвать, а затем расшириться. –

ответ

1

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


Метод # 1 - Использование imfill с последующим imopen

одно предложение у меня есть, чтобы использовать imfill, чтобы заполнить в любом из отверстий в изображении, а затем с помощью вызова imopen для выполнения морфологического открытия (т.е. эрозия, за которой следует расширение, как это указано пользователем Paul R). Открытие (через 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 
+0

сэр, я получу аналогичные встроенные функции в java-cv (opencv java)? –

+2

Вы отметили свое сообщение ** MATLAB **, а не Java. 'bwareaopen' и, возможно,' imfill', вероятно, не в JavaCV, но метод # 3, вероятно, наиболее подходит для вас тем, что я знаю о JavaCV. – rayryeng

0

вы должны выполнить следующие шаги:

  1. Заполняющие отверстия =>result. Он заполняет все отверстия в лицо.
  2. Открытие (эрозия + дилатация) =>result. Он стирает все мелкие узоры вне формы.

Еще лучше: вы заменяете шаг 2 на «открытие путем реконструкции», которое представляет собой эрозию, за которой следует геодезическая реконструкция. Эта операция не изменяет основной шаблон. См. the result.

Все эти операции должны быть доступны в OpenCV или ImageJ.