Подтвердить что ты не робот

Алгоритм баланса белого

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

EDIT: и если это имеет отношение к эффективности, я буду реализовывать его на Java с цветными изображениями в виде массива целых чисел.

4b9b3361

Ответ 1

Относительно простой алгоритм состоит в том, чтобы усреднить оттенки (в HSV или HSL) самых ярких и самых темных пикселей на экране. В крайнем случае, идите с самым ярким пикселем. Если оттенки между самыми яркими и темными слишком разные, пойдите с ярким пикселем. Если темнота близко к черному, пойдите с ярким пикселем.

Почему даже смотреть на темный пиксель? Иногда темнота не находится рядом с черным, и намекает на окружающий свет, туман или туман.

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

Затем отрегулируйте оттенки всех пикселей.

Вам понадобятся быстрые функции RGB для HSV и HSV для RGB. (Но, возможно, вы можете работать в RGB для коррекции пикселей с LUT или линейной интерполяцией.)

Вы не хотите идти по среднему цвету пикселя или самому популярному цвету. Таким образом, безумие.

Чтобы быстро найти самый яркий цвет (и самый темный), вы можете работать в RGB, но у вас должны быть множители для зеленого, красного и синего. На мониторе RGB 255 зеленых ярче 255 красных, которые ярче 255 синих. Раньше у меня были хорошие мультипликаторы, но, увы, они сбежали из моей памяти. Возможно, вы можете использовать Google для них.

Это не сработает на изображении, который не имеет подсветки. Например, матовая окрашенная стена. Но я не знаю, что вы можете с этим поделать.


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

Ответ 2

GIMP, по-видимому, использует очень простой алгоритм автоматической балансировки белого. http://docs.gimp.org/en/gimp-layer-white-balance.html

Команда "Баланс белого" автоматически корректирует цвета активного слоя, растягивая красный, зеленый и синий каналы отдельно. Для этого он отбрасывает пиксельные цвета на каждом конце красных, зеленых и синих гистограмм, которые используются только 0,05% пикселей на изображении и максимально растягивают оставшийся диапазон. В результате цвета пикселей, которые встречаются очень редко на внешних краях гистограмм (возможно, биты пыли и т.д.), Не оказывают отрицательного влияния на минимальные и максимальные значения, используемые для растяжения гистограмм, по сравнению с Stretch Contrast. Однако, как и "Контрастность растяжения", в полученном изображении могут быть изменения оттенка.

Существует немного больше настроек, чем описано здесь, так как моя первая попытка реализовать эти работы, похоже, работает для большинства фотографий, но у других фотографий есть артефакты или они содержат слишком много красного или синего:/

Ответ 3

@Charles Ma предложил использовать алгоритм баланса белого Gimp. В python и numpy это может выглядеть так:

# white balance for every channel independently
def wb(channel, perc = 0.05):
    mi, ma = (np.percentile(channel, perc), np.percentile(channel,100.0-perc))
    channel = np.uint8(np.clip((channel-mi)*255.0/(ma-mi), 0, 255))
    return channel

image = cv2.imread("foo.jpg", 1) # load color
imWB  = np.dstack([wb(channel, 0.05) for channel in cv2.split(img)] )

это быстро, просто и дает довольно приличные результаты

Ответ 4

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

Во-первых, я бы просто усреднил красный, зеленый и синий цвета и использовал это как точку баланса белого. Установите ограничения на него - оставайтесь в пределах диапазона для вольфрама, цветения и дневного света. Это будет не идеально, но когда это будет неправильно, относительно легко объяснить, почему.

Ответ 5

Недавно опубликованный алгоритм - это алгоритм распределения цветов, который можно найти здесь: http://www.comp.nus.edu.sg/~brown/pdf/ColorConstancyJOSAv10.pdf В документе также есть ссылка на исходный код Matlab (http://www.comp.nus.edu.sg/~whitebal/illuminant/files/illuminantEstimator.m). Это простой алгоритм, который можно легко запрограммировать, и результаты показывают, что он очень быстрый.

Если вам нужны дополнительные быстрые и в то же время точные алгоритмы балансировки белого цвета (цветовое постоянство), вы должны проверить этот сайт: http://www.fer.unizg.hr/ipg/resources/color_constancy/

Существует несколько алгоритмов с их исходным кодом, которые могут быть только теми, которые вы ищете.

Ответ 6

Вы можете сослаться на исходный код алгоритма автоматической балансировки белого, который я реализовал здесь https://github.com/UmarKhalidcs/automaticwhitebalance. Это реализация Python, озаглавленная "Автоматический баланс белого для цифровых фотокамер * от VARSHA CHIKANE и CHIOU-SHANN FUH". Pycharm была использована для его реализации.