Вопрос

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

РЕДАКТИРОВАТЬ:и если это имеет отношение к эффективности, я реализую это на Java с цветными изображениями в виде массива целых чисел.

Это было полезно?

Решение

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

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

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

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

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

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

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

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


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

Другие советы

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

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

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

@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)] )

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

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

Для начала я бы просто усреднил красный, зеленый и синий и использовал это как точку баланса белого.Установите ограничения — оставайтесь в пределах диапазонов для вольфрамового, люминесцентного и дневного света.Оно не будет идеальным, но если оно окажется неправильным, будет относительно легко объяснить, почему.

Одним из недавно опубликованных алгоритмов является алгоритм распределения цвета, его можно найти здесь: 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/

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top