как убрать фоновое изображение и получить переднее изображение - PullRequest
13 голосов
/ 20 января 2010

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

альтернативный текст http://bbs.shoucangshidai.com/attachments/month_1001/1001211535bd7a644e95187acd.jpg альтернативный текст http://bbs.shoucangshidai.com/attachments/month_1001/10012115357cfe13c148d3d8da.jpg один - фоновое изображение, другой - фотография человека с тем же фоном, того же размера, что я хочу сделать, это удалить фон второго изображения и получить только профиль человека общий метод - вычесть первое изображение из второго, но моя проблема в том, что цвет одежды человека похож на фон. результат вычитания ужасен. Я не могу получить профиль целых людей. кто имеет хорошую идею удалить фон, дайте мне несколько советов. заранее спасибо.

Ответы [ 6 ]

17 голосов
/ 21 января 2010

Если вы хорошо оценили фон изображения, вычтите его из изображения с человеком - это хороший первый шаг. Но это только первый шаг. После этого вам нужно сегментировать изображение, т. Е. Вы должны разделить изображение на пиксели "background" и "foreground" с такими ограничениями:

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

Если вы склонны математически, эти ограничения можно идеально смоделировать с помощью функционала Мамфорда-Шаха. Подробнее см. Здесь.

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

Если вам нужна быстрая и простая (но не идеальная) версия, вы можете попробовать это:

  • вычесть два изображения
  • найти наибольшее последовательное «пятно» пикселей с разницей между фоном и передним планом, превышающей некоторый порог. Это первая приблизительная оценка «площади человека» на изображении на переднем плане, но сегментация не соответствует критериям 3 и 4, приведенным выше.
  • Найдите контур самого большого шарика ( РЕДАКТИРОВАТЬ: Обратите внимание, что вам не нужно начинать с контура. Вы также можете начать с более крупного многоугольника, поскольку шаги автоматически уменьшат его до оптимальное положение.)
  • Теперь пройдитесь по каждой точке контура и сгладьте контур. то есть для каждой точки найдите точку, которая минимизирует формулу: c1 * L - c2 * G, где L - длина многоугольника контура, если точка была перемещена здесь, а G - градиент в месте, куда точка будет перемещена, c1 / c2 - константы для управления процессом. Переместите точку в эту позицию. Это имеет эффект сглаживания многоугольника контура в областях с низким градиентом в исходном изображении, в то же время сохраняя его привязанным к высоким градиентам в исходном изображении (то есть видимых границах человека). Вы можете использовать разные выражения для L и G, например, L может учитывать длину и кривизну, а G также может принимать во внимание градиент фона и вычитаемых изображений.
  • вам, вероятно, придется заново нормализовать многоугольник контура, то есть убедиться, что точки на контуре регулярно разнесены. Либо так, либо убедитесь, что расстояния между точками остаются постоянными на предыдущем шаге. («Геодезические змеи»)
  • повторите два последних шага до схождения

Теперь у вас есть контурный многоугольник, который касается видимой границы лица и фона и плавно продолжается там, где граница не видна или имеет низкий контраст. Посмотрите "Змеи" ( например здесь ) для получения дополнительной информации.

4 голосов
/ 05 февраля 2010

Фильтр нижних частот (размытие) изображений перед их вычитанием. Затем используйте этот разностный сигнал в качестве маски, чтобы выбрать интересующие пиксели. Достаточно широкий фильтр будет игнорировать слишком малые (высокочастотные) функции, которые в конечном итоге будут выделять «ужасные» области внутри интересующего вас объекта. Это также уменьшит выделение шума и смещения на уровне пикселей (информация о самой высокой частоте).

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

1 голос
/ 30 октября 2010

Фон против обнаружения переднего плана очень субъективен. Сценарий приложения определяет фон или передний план. Однако в приложении, которое вы подробно описали, я предполагаю, что вы неявно говорите, что человек находится на переднем плане. Используя приведенное выше предположение, вы ищете алгоритм обнаружения человека. Возможное решение:

  1. Запуск детектора особенностей хаара + усиленный каскад слабых классификаторов (см. opencv wiki )
  2. Вычислить межкадровое движение (различия)
  3. Если для кадра есть распознавание лица + ve, кластеризованные пиксели движения вокруг лица ( алгоритм kNN )

вуаля ... у вас должен быть простой детектор людей.

1 голос
/ 21 января 2010

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

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

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

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

Однако, если человек носит одежду, визуально неотличимую от фона, очевидно, что ни один из методов, описанных выше, не сработает. Вам нужно будет либо получить другой датчик (например, ИК или УФ), либо иметь довольно сложную «модель человека», которая могла бы «сложить» ноги в правильном положении, если он обнаружит то, что считает туловищем и головой.

Удачи в проекте!

0 голосов
/ 21 января 2010

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

0 голосов
/ 21 января 2010

Опубликуйте фотографию в Craigslist и скажите им, что вы заплатите 5 долларов за того, кто это сделает.

Гарантировано, что вы получите попадания в считанные минуты.

...