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

StackOverflow https://stackoverflow.com/questions/2100064

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Теперь у вас есть контурный многоугольник, который касается видимой границы человека и фона и плавно продолжается там, где граница не видна или имеет низкий контраст.Найдите «Змеи» (напримерздесь) Чтобы получить больше информации.

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top