12

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

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

+0

Что это? Можете ли вы поместить изображение на photobucket или что-то еще, чтобы мы могли видеть, о чем вы говорите? У вас есть две фотографии, добавленные вместе пиксель за пикселем? Вы говорите о хроматической манипуляции (см. Http://en.wikipedia.org/wiki/Chroma_key)? – metal

+0

Нет, просто это метод удаления фона с фотографии человека. – carl

+0

, вы действительно могли бы переписать вопрос с помощью примера изображения, очень сложно понять, что именно вы хотите – Alex

ответ

15

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

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

Если вы математически наклонены, эти ограничения могут быть смоделированы отлично с Mumford-шахом функциональным.See here for more information.

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

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

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

Теперь у вас есть наброски многоугольник, который касается видимого человека-фон границы и продолжает плавно, где граница не видна или имеет низкую контрастность. Для получения дополнительной информации смотрите «Змеи» (e.g. here).

+1

Большое вам спасибо! вы очень хороши и профессиональны. – carl

+0

У вас есть действующий указатель на разделение фона Мамфорда-Шаха? Ссылка выше больше не действительна. И да - я знаю, что я немного опоздал в игру ... – nimrodm

+1

@nimrodm: Я обновил ссылку. Но, честно говоря, это был первый хит в Google Scholar. – Niki

-3

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

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

+7

никогда. Я бедный человек. $ 5 может накормить меня через неделю. – carl

-3

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

+1

это может быть проблемой, поскольку условие освещения нестабильно. – carl

+1

-1: Это то же самое, что и вычесть все, а затем установить порог 0. Кроме того, даже если освещение будет статичным, нет гарантии, что пиксели в двух последующих кадрах - то же самое. –

+0

Это очень примитивный способ сравнения двух изображений. Использование информации о пороге и окрестности обеспечит лучший результат в реальной жизни. – Winfred

1

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

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

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

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

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

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

+0

Хорошее решение. Если я могу добавить к этому, хороший альгорифм может быть: – nav

4

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

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

0

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

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

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