Подтвердить что ты не робот

Как удалить фоновое изображение и получить предварительное изображение

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

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

4b9b3361

Ответ 1

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

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

Если вы математически склонны, эти ограничения могут быть отлично смоделированы с помощью функциональности Mumford-Shah. Подробнее см. здесь.

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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