2016-06-28 6 views
6

Мне нужно сделать довольно чувствительные измерения цвета (яркости) в кадре веб-камеры, используя OpenCV. Проблема, которую я испытываю, заключается в том, что окружающий свет колеблется, что затрудняет получение точных результатов. Я ищу способ постоянно обновлять последовательные кадры видео, чтобы сгладить глобальные различия освещения. Световые изменения, которые я пытаюсь отфильтровать, происходят во всем мире или во всем изображении. Я попытался вычислить разницу и вычесть это, но с небольшой удачей. Кто-нибудь есть какие-либо советы о том, как подойти к этой проблеме?Фильтровать флуктуирующее освещение с помощью OpenCV

EDIT: 2 изображения, приведенные ниже, принадлежат к одному и тому же видеоролику, изменения цвета слегка увеличены. Если вы будете чередоваться между ними, вы увидите, что есть небольшие изменения в освещении, вероятно, из-за того, что облака смещаются наружу. Проблема в том, что эти изменения затмевают любые другие изменения цвета, которые я могу обнаружить.

Поэтому я хотел бы отфильтровать эти конкретные изменения. Учитывая, что мне нужна часть кадров, которые я захватил, я решил, что нужно будет отфильтровывать изменения освещения, как они происходят в остальной части кадры. Вне моей области интересов.

Я попытался захватить доминирующие частоты в изменениях с помощью dft, чтобы просто игнорировать изменения в освещении. Но я не достаточно знаком с использованием этой функции. Я использую opencv только неделю, поэтому я все еще участвую.

enter image description here enter image description here

+0

Вы можете загрузить пример для нескольких кадров, чтобы лучше понять ваши вопросы? – drorco

+1

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

+0

взгляните на http://stackoverflow.com/questions/24341114/simple-illumination-correction-in-images-opencv-c –

ответ

5

Короткий ответ: временный фильтр нижних частот на освещении в целом

Рассмотрит освещение, концептуально, как временная последовательность значений, представляющего нечто вроде светового потока, падающего на сцене фотографируется. Ваша идеальная ситуация заключается в том, что эта функция является постоянной, но вторая лучшая ситуация в том, что она меняется как можно медленнее. A low-pass filter изменяет функцию, которая может быстро изменяться до той, которая изменяется медленнее. Таким образом, основные этапы: (1) Рассчитать общую функцию освещения (2) Вычислить новую функцию освещения с использованием фильтра нижних частот (3) Нормализовать исходную последовательность изображений до новых значений освещенности.

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

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

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

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

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

+0

Отличное объяснение – user2587106

2

Если изменение сигнала является глобальным, вы должны попытаться вычислить среднее значение m (i, t) для каждой строки i в каждом изображении в момент времени t в вашем видео. Без флуктуационного отношения света m (i, t)/m (i, t + 1) должно быть равно 1 за все время. Если существует глобальное изменение, то для каждого i m (i, t)/m (i, t + 1) должно быть постоянным. лучше использовать среднее значение m (i, t)/m (i, t + 1) (для всех i). Это среднее значение может быть использовано для исправления вашего изображения в момент времени t.

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

+0

Изменение сигнала локально да, но также будут локальные изменения цвета, которые я хочу обнаружить. Таким образом, изменения во времени не всегда будут постоянными повсюду. Я уже пытался вычесть минимальное глобальное изменение освещения из кадров, но это мало повлияло. – FHannes

+1

Это не субстрат, а деление. У вас есть движение в вашем видео, так что вы будете новым, чтобы соответствовать изображению перед любой процедурой. – LBerger

+1

О методе фильтрации, если нет движения, это может быть хорошим ответом, например, предлагая @ eh9. У меня есть временный код фильтрации в https://github.com/LaurentBerger/AmplificationMouvement. – LBerger

1

I подумайте, что вы можете применить homomorphic filtering к каждому из кадров для вычисления компонента отражения кадра. Затем вы можете отслеживать различную отражательную способность в выбранных точках.

В соответствии с моделью формирования изображения отражения изображения значение пикселя в данной позиции является продуктом освещения и отражения: f(x,y) = i(x,y) . r(x,y). Освещение i имеет тенденцию к изменению медленно по изображению (или в вашем случае, рамка), а коэффициент отражения r имеет тенденцию быстро меняться.

Используя гомоморфную фильтрацию, вы можете отфильтровать компонент освещения. Он принимает логарифм вышеуказанного уравнения, поэтому компоненты освещения и отражения становятся аддитивными: ln(f(x,y)) = ln(i(x,y)) + ln(r(x,y)). Теперь вы применяете фильтр верхних частот для сохранения компонента отражения (так что медленно меняющийся компонент освещения отфильтровывается). Посмотрите here и here для подробного объяснения процесса с примерами.

После применения фильтра вы получите оценочные рамки отражения r^(x,y,t).

 Смежные вопросы

  • Нет связанных вопросов^_^