EmguCV Вырезать только кожу лица и шеи и сохранить новое изображение


В моем приложении я ввожу изображение человека и хочу получить в качестве вывода только лицо и шею этого человека. в отдельном изображении.
Пример: изображение ниже в качестве входных данных: (Источник:http://www.fremantlepress.com.au/dreamgirl/filesend/4743/Chris%20Nixon%20full%20body.jpg) http://www.  fremantlepress.com.au И я хочу получить выходное изображение: Выходное изображение
Я хочу выполнить следующий алгоритм:

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

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

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


person Foyzul Karim    schedule 23.06.2011    source источник


Ответы (1)


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заботиться

Крис

[EDIT] Некоторые быстрые результаты:

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

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

Сегментированное изображение

Бинарная карта среднего фильтра для волос 20x20 Маска с допустимой ошибкой 40% Бинарная карта результатов

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

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

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

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

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

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

Ура снова

Крис

person Chris    schedule 21.07.2011
comment
@Chris: Спасибо, брат... отличная статья... :) - person Foyzul Karim; 21.07.2011