EmguCV Cut только для кожи лица и шеи и сохранить новое изображение - PullRequest
4 голосов
/ 23 июня 2011


В моем приложении я введу изображение человека и хочу получить только лицо и шею этого человека в качестве вывода на отдельном изображении.
Пример: под изображением ниже: (Источник: http://www.fremantlepress.com.au) http://www.fremantlepress.com.au И я хочу получить изображение в качестве вывода: Output Image
Я хочу выполнить следующий алгоритм:

1. Определить лицо
2. Выберите (область лица * 2) область
3. Обнаружить кожу и шею
4. Вырежьте область кожи выбранного изображения
5. Сохраните эту вырезанную область в новом изображении

Что касается вики-сайта EmguCV и других онлайн-ресурсов, я уверен, что выполнил шаги 1 и 2. Но я не уверен, как мне выполнить шаги 3 и 4.
Есть некоторые функции / методы, на которые я смотрю (Cunny Edge Detection, Contour и т. Д.), Но я не уверен, как и где я должен применять эти методы. Я использую EmguCV (C #) и Windows Form Application.

Пожалуйста, помогите мне, как я могу выполнить шаги 3 и 4. Я буду рад, если кто-то разработает эти два шага и некоторый код.

1 Ответ

8 голосов
/ 21 июля 2011

Ну, есть несколько способов, которыми вы можете подойти к этому.Обнаружение кромок даст вам только двоичное изображение кромок, и вам придется выполнить некоторые линии трассировки или преобразования Хафа, чтобы определить их местоположение.Там точность будет меняться.

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

Так для статистического фильтра:

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

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

  2. Найти лицо, глаза и рот на исходном изображении.

    Мы можем предположить, что любые данные из глаз и рта образуют часть лица и пометить их на пустой копии с «1».

  3. Теперь нам нужно немногоматематика, как мы знаем, алгоритм обнаружения лица может обнаружить лицо только под определенным углом к ​​камере.Мы используем это и выбираем статистическую маску на изображении определенных частей изображения, скажем, 10x10 пикселей 2 или 3 в области щек.Это будет наиболее вероятная область лица на изображении.Мы используем эти данные и получаем значения из изображения, такие как среднее значение и стандартное отклонение.

  4. Теперь мы сканируем сегментированную часть изображения, где мы обнаружили лицо.Мы не будем делать весь образ, так как это займет много времени.(Примечание: есть граница, равная половине размера маски, которая не будет рассматриваться).Мы исследуем каждый пиксель и его окрестности до размера маски 10х10.Если среднее или стандартное отклонение (что бы мы ни рассматривали) аналогично отклонению нашего фильтра, скажем, в пределах 10%, мы помечаем этот пиксель в нашей пустой копии как «1» и считаем этот пиксель принадлежащим обложке.

Что касается цветовой сегментации:

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

  1. Повторите шаги с 1 по 2.

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

    Альтернативой является вычитание или сложение вычисленного из RG и B спектра изображения, для которого выживет только грань данных.Вы можете преобразовать это непосредственно в двоичное изображение, сделав любое значение> 1 == 1;

Это будет работать только для кожи, так как для волос нам понадобятся другие фильтры.Несколько замечаний:

Статистический фильтр, работающий с цветным изображением, обладает гораздо большей способностью, однако занимает больше времени.

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

Размер маски важен, чем больше размер маски, тем меньше вероятности возникновения ошибок, но снова увеличивается время обработки.

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

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

Чтобы получить алгоритм, работающий аккуратно, потребуется немного проб и ошибок.но вы сможете увидеть сопоставимые результаты довольно быстро, используя эти методы.

Надеюсь, это поможет вам на вашем пути.Извините, что не включил какой-либо код, но надеюсь, что другие могут помочь вам, если вы застряли, и написание его самостоятельно поможет вам понять, что происходит, и позволит вам сократить время обработки.Дайте мне знать, если вам понадобится какой-либо дополнительный совет. Я делаю докторскую диссертацию по анализу изображений, чтобы вы знали, что этот совет верный.

Берегите себя

Крис

[РЕДАКТИРОВАТЬ] Некоторые быстрые результаты:

Вот фильтр 20x20 применяется для обнаружения волос.Программа, которую я написал, в настоящее время работает только с изображениями в оттенках серого, поэтому при обнаружении кожи возникают помехи от камня (см. Далее)

Цветное изображение области лица

Segemented Image

Двоичная карта средних волос Фильтр 20x20 Маска 40% допускается ошибка Binary Map of Results

Как можно заметить, в этом случае помехи от рубашки возникают какэто соответствует цвету волос.Этого можно избежать, просто изучив верхнюю треть или половину обнаруженной области лица.

Двоичная карта среднего фильтра кожи Маска 20x20 Допускается ошибка 40% enter image description here

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

Примеры областей для проверки

enter image description here

Чтобы устранить ложную классификацию, вы можете взять две верхние трети сегментированного изображения и посмотреть на лицо и ширину обнаруженных глаз до дналицевая область для данных шеи.

Cheers Again

Chris

...