Надежное отслеживание цвета по сравнению с экспозицией и изменениями баланса белого
Кто-нибудь имел опыт с подбором цветов и отслеживанием его видео, когда настройки экспозиции и баланса белого постоянно меняются?
Я работаю над приложением для отслеживания цвета, которое использует фронтальную камеру iPad 2 для захвата видео. Мне нужно обнаружить цветные объекты (предварительно определенного цвета, которые мы взяли ранее) на каждом кадре. Моя проблема в том, что программное обеспечение камеры похоже на настройку баланса белого и экспозиции каждого кадра. Поэтому, если мы помним один цвет в кадре N, в кадре N+10 WB будет другим, и это может привести к большой разнице в цвете.
Для расчета цветового расстояния я использую цветовое пространство LAB и формулу CIE76:
Да, я знаю, что есть намного лучшая функция расстояния CIEDE2000, но я работаю с процессором ARM, и я боюсь, что эта формула будет слишком тяжелой даже для оптимизированного вручную кода сборки ARM NEON, который я уже использую.
CIE76 в целом дает хорошие результаты, но в условиях плохого или очень яркого освещения камера либо создает слишком много шума, либо пересыщает изображение, поэтому цвета становятся слишком далекими от оригинала. В дополнение к простой настройке порога с использованием цветового расстояния я реализовал пороговую настройку для каждого компонента значений пикселей LAB на основе стандартного отклонения откалиброванного цвета. Это также повысило правильность обнаружения, однако это не решает основной проблемы.
Сама камера обеспечивает кадры в цветовом пространстве RGB, но API не предоставляет функций для получения белой точки или цветовой температуры текущего кадра. В настоящее время я предполагаю, что источник света D50 выполняет преобразование RGB -> LAB.
И это мое главное сомнение. Моя идея состоит в том, чтобы вычислить белую точку данного изображения RGB, а затем преобразовать ее в цветовое пространство XYZ, а затем преобразовать XYZ в LAB, используя вычисленную белую точку. Является ли это возможным?
Из Википедии: Белая точка
Выражая цвет как координаты трехцветия в цветовом пространстве LMS, можно "перевести" цвет объекта в соответствии с преобразованием фон Криса, просто масштабируя координаты LMS по отношению максимальных значений трехцветия в обеих белых точках. Это дает простую, но приблизительную оценку.
http://en.wikipedia.org/wiki/White_point
Это сработает? Или есть лучший способ для вычисления белой точки (даже грубо)? Кстати, я разработал алгоритм Retinex, который демонстрирует хорошее улучшение цвета в тенях, кто-нибудь использовал его? Какие это плюсы и минусы?