Фильтр флуктуирующего освещения с OpenCV

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

РЕДАКТИРОВАТЬ:
2 изображения, приведенные ниже, взяты из одного и того же видео, с немного увеличенными изменениями цвета. Если вы переключитесь между ними, вы увидите, что есть небольшие изменения в освещении, возможно, из-за смещения облаков снаружи. Проблема в том, что эти изменения скрывают любые другие изменения цвета, которые я мог бы обнаружить.

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

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

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

6

Решение

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

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

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

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

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

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

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

5

Другие решения

Если изменение сигнала является глобальным, вы должны попытаться вычислить среднее значение 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.

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

2

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

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

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

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

1
По вопросам рекламы [email protected]