Оптимизация производительности морфологической обработки

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

введите здесь описание изображения

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


person Mayank Tiwari    schedule 11.03.2016    source источник
comment
Поскольку вы имеете дело с обработкой изображений, трудно представить это без фактического изображения. Ваше сообщение звучит так, как будто вы имеете в виду изображение, но его нет в вашем сообщении. Не могли бы вы отредактировать свой пост соответствующим образом?   -  person rayryeng    schedule 11.03.2016
comment
Можете ли вы загрузить изображение (а) отдельно?   -  person rayryeng    schedule 11.03.2016
comment
Вы, вероятно, хотите сначала размыть, а затем расширить.   -  person Paul R    schedule 11.03.2016


Ответы (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
person rayryeng    schedule 11.03.2016
comment
сэр, получу ли я аналогичные встроенные функции в java-cv (opencv java)? - person Mayank Tiwari; 11.03.2016
comment
Вы пометили свое сообщение тегом MATLAB, а не Java. bwareaopen и, возможно, imfill, вероятно, не в JavaCV, но метод № 3, вероятно, наиболее подходит для вас с тем, что я знаю о JavaCV. - person rayryeng; 11.03.2016

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

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

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

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

person FiReTiTi    schedule 11.03.2016