Этот пример показывает, как оценить освещенность и выполнить баланс белого для сцены с помощью трех различных алгоритмов освещения. Пример сравнивает предполагаемую подсветку с наземной подсветкой истинности, рассчитанной с помощью графика X-Rite ® ColorChecker ®.
Глаза очень хорошо судят, что белое при разных условиях подсветки. Цифровые камеры, правда, без какой-то регулировки могут легко захватывать нереалистичные изображения с сильной цветовой отливкой. Автоматические алгоритмы баланса белого (AWB) пытаются скорректировать для окружающего света с минимальным входом от пользователя, чтобы получившееся изображение выглядело так, как видели бы наши глаза.
Автоматическая белая балансировка выполняется в два этапа:
Шаг 1: Оцените освещение сцены.
Шаг 2: Исправьте баланс цвета изображения.
Существует несколько различных алгоритмов для оценки освещенности сцены. Эффективность каждого алгоритма зависит от сцены, подсветки и условий визуализации. Этот пример оценивает качество трех алгоритмов для оценки освещенности для одного конкретного изображения путем сравнения их с основной истиной подсветкой сцены:
После того, как окружающий свет известен, коррекция цветов в изображении (этап 2) является простым и фиксированным процессом.
Алгоритмы AWB обычно применяются к данным необработанного изображения после минимального объема предварительной обработки, до сжатия и сохранения изображения на карте памяти.
Считайте 16-битное необработанное изображение в рабочую область. foosballraw.tiff
- файл изображения, который содержит необработанные данные о датчике после коррекции уровня черного и масштабирования интенсивности до 16 бит на пиксель. Это изображение не содержит белой балансировки, выполняемой камерой, а также других операций предварительной обработки, таких как демозаицирование, шумоподавление, хроматическая компенсация аберрации, коррекция тона и гамма-коррекция.
A = imread('foosballraw.tiff');
Цифровые камеры используют массив цветного фильтра, наложенный на датчик изображения, чтобы симулировать цветовое зрение, так что каждый пиксель чувствителен к красному, зеленому или синему. Чтобы восстановить недостающую информацию о цвете в каждом пикселе, интерполируйте с помощью demosaic
функция. Шаблон Bayer, используемый камерой, с помощью которой было снято фото (Canon EOS 30D), является RGGB.
A = demosaic(A,'rggb');
Изображение A
содержит линейные значения RGB. Линейные значения RGB подходят для оценки освещенности сцены и коррекции цветового баланса изображения. Однако, если попытаться отобразить линейное изображение RGB, оно появится очень тусклым, из-за нелинейной характеристики устройств отображения. Поэтому в целях отображения гамма-корректировка изображения в цветовое пространство sRGB с помощью lin2rgb
функция.
A_sRGB = lin2rgb(A);
Отобразите демонтированное изображение до и после гамма- коррекции.
montage({A,A_sRGB})
title('Original Image Before and After Gamma Correction')
Вычислите освещение основной истины с помощью графика X-Rite ColorChecker, включенной в сцену. Этот график состоит из 24 нейтральных и цветных закрашенных фигур с известными спектральными отражениями.
Обнаружите график в гамма-исправленном изображении при помощи colorChecker
функция. Линейное изображение RGB слишком темное для colorChecker
для автоматического обнаружения графика.
chart_sRGB = colorChecker(A_sRGB);
Подтвердите, что график обнаружен правильно.
displayChart(chart_sRGB)
Получите координаты регистрационных точек в четырех углах графика.
registrationPoints = chart_sRGB.RegistrationPoints;
Создайте новую colorChecker
объект из линейных данных RGB. Укажите местоположение графика с помощью координат точек регистрации.
chart = colorChecker(A,"RegistrationPoints",registrationPoints);
Измерьте основную истину осветитель линейных данных RGB с помощью measureIlluminant
функция.
illuminant_groundtruth = measureIlluminant(chart)
illuminant_groundtruth = 1×3
103 ×
4.5407 9.3226 6.1812
При тестировании алгоритмов AWB предотвратите несправедливое использование алгоритмов графиком, маскируя график.
Создайте многоугольник информации только для чтения над графиком при помощи drawpolygon
функция. Задайте вершины многоугольника в качестве точек регистрации.
chartROI = drawpolygon("Position",registrationPoints);
Преобразуйте многоугольник информации только для чтения в двоичную маску при помощи createMask
функция.
mask_chart = createMask(chartROI);
Переверните маску. Пиксели на графике исключаются из маски, а пиксели на остальной части сцены включаются в маску.
mask_scene = ~mask_chart;
Чтобы подтвердить точность маски, отобразите маску на изображении. Пиксели, включенные в маску, имеют синий оттенок.
imshow(labeloverlay(A_sRGB,mask_scene));
Можно рассматривать освещение как вектор в 3-D цветовом пространстве RGB. Величина предполагаемого светильника не имеет значения так же, как и его направление, потому что направление светильника - это то, что используется для балансировки белого изображения.
Чтобы оценить качество предполагаемого осветителя, вычислите угловую ошибку между предполагаемым осветителем и основной истиной. Угловая ошибка - это угол (в степенях), образованный двумя векторами. Чем меньше угловая ошибка, тем лучше оценка.
Чтобы лучше изучить концепцию угловой ошибки, рассмотрите следующую визуализацию произвольного осветителя и основной истины, измеренную с помощью графика ColorChecker. The plotColorAngle
helper графиков функций вектор модуля подсветчика в цветовом пространстве 3-D RGB и определяется в конце примера.
sample_illuminant = [0.066 0.1262 0.0691]; p = plot3([0 1],[0 1],[0,1],'LineStyle',':','Color','k'); ax = p.Parent; hold on plotColorAngle(illuminant_groundtruth,ax) plotColorAngle(sample_illuminant,ax) title('Illuminants in RGB space') view(28,36) legend('Achromatic Line','Ground Truth Illuminant','Sample Illuminant') grid on axis equal
Алгоритм Белой Закрашенной фигуры Retinex для оценки освещения принимает, что сцена содержит яркую ахроматическую закрашенную фигуру. Эта закрашенная фигура отражает максимально возможный свет для каждой цветовой полосы, которая является цветом освещающей сцены. Используйте illumwhite
функция для оценки освещенности с помощью алгоритма White Patch Retinex.
Оцените освещение, используя все пиксели в сцене. Исключить график ColorChecker из сцены можно используя команду 'Mask'
аргумент пары "имя-значение".
percentileToExclude = 0;
illuminant_wp1 = illumwhite(A,percentileToExclude,'Mask',mask_scene);
Вычислите угловую ошибку для подсветчика, оцененную с помощью White Patch Retinex.
err_wp1 = colorangle(illuminant_wp1, illuminant_groundtruth);
disp(['Angular error for White Patch with percentile=0: ' num2str(err_wp1)])
Angular error for White Patch with percentile=0: 16.5381
Белый баланс изображения с помощью chromadapt
функция. Укажите предполагаемый осветитель и укажите, что значения цветов находятся в линейном цветовом пространстве RGB.
B_wp1 = chromadapt(A,illuminant_wp1,'ColorSpace','linear-rgb');
Отобразите гамма-исправленное белое сбалансированное изображение.
B_wp1_sRGB = lin2rgb(B_wp1);
figure
imshow(B_wp1_sRGB)
title('White-Balanced Image using White Patch Retinex with percentile=0')
Алгоритм White Patch Retinex не работает хорошо, когда пиксели переэкспонированы. Чтобы улучшить эффективность алгоритма, исключить топ-1% самых ярких пикселей.
percentileToExclude = 1;
illuminant_wp2 = illumwhite(A,percentileToExclude,'Mask',mask_scene);
Вычислите угловую ошибку для предполагаемого подсветчика. Ошибка меньше, чем при оценке подсветчика, используя все пиксели.
err_wp2 = colorangle(illuminant_wp2,illuminant_groundtruth);
disp(['Angular error for White Patch with percentile=1: ' num2str(err_wp2)])
Angular error for White Patch with percentile=1: 5.0324
Белый баланс изображения в линейном цветовом пространстве RGB с помощью предполагаемой подсветки.
B_wp2 = chromadapt(A,illuminant_wp2,'ColorSpace','linear-rgb');
Отобразите гамма-скорректированное белое сбалансированное изображение с новым осветителем.
B_wp2_sRGB = lin2rgb(B_wp2);
imshow(B_wp2_sRGB)
title('White-Balanced Image using White Patch Retinex with percentile=1')
Алгоритм Серого Мира для оценки освещения принимает, что средний цвет мира является серым или ахроматическим. Поэтому он вычисляет освещение сцены как среднее значение RGB в изображении. Используйте illumgray
функция для оценки освещенности с помощью алгоритма Gray World.
Сначала оцените освещение сцены, используя все пиксели изображения, исключая те, которые соответствуют графику ColorChecker. The illumgray
функция предоставляет параметр для задания процентилей нижних и верхних значений (упорядоченных по яркости), которые нужно исключить. Здесь задайте процентили как 0.
percentileToExclude = 0;
illuminant_gw1 = illumgray(A,percentileToExclude,'Mask',mask_scene);
Вычислите угловую ошибку между расчетным освещением и основной истиной освещением.
err_gw1 = colorangle(illuminant_gw1,illuminant_groundtruth);
disp(['Angular error for Gray World with percentiles=[0 0]: ' num2str(err_gw1)])
Angular error for Gray World with percentiles=[0 0]: 5.0416
Белый баланс изображения в линейном цветовом пространстве RGB с помощью предполагаемой подсветки.
B_gw1 = chromadapt(A,illuminant_gw1,'ColorSpace','linear-rgb');
Отобразите гамма-исправленное белое сбалансированное изображение.
B_gw1_sRGB = lin2rgb(B_gw1);
imshow(B_gw1_sRGB)
title('White-Balanced Image using Gray World with percentiles=[0 0]')
Алгоритм Gray World работает плохо, когда пиксели недостаточно экспонируются или передерживаются. Чтобы улучшить эффективность алгоритма, исключить топ 1% самых темных и ярких пикселей.
percentileToExclude = 1;
illuminant_gw2 = illumgray(A,percentileToExclude,'Mask',mask_scene);
Вычислите угловую ошибку для предполагаемого подсветчика. Ошибка меньше, чем при оценке подсветчика, используя все пиксели.
err_gw2 = colorangle(illuminant_gw2, illuminant_groundtruth);
disp(['Angular error for Gray World with percentiles=[1 1]: ' num2str(err_gw2)])
Angular error for Gray World with percentiles=[1 1]: 5.1094
Белый баланс изображения в линейном цветовом пространстве RGB с помощью предполагаемой подсветки.
B_gw2 = chromadapt(A,illuminant_gw2,'ColorSpace','linear-rgb');
Отобразите гамма-скорректированное белое сбалансированное изображение с новым осветителем.
B_gw2_sRGB = lin2rgb(B_gw2);
imshow(B_gw2_sRGB)
title('White-Balanced Image using Gray World with percentiles=[1 1]')
Метод оценки освещенности Ченга черпает вдохновение из методов пространственной области, таких как Серое Ребро [4], который принимает, что градиенты изображения являются ахроматическими. Они показывают, что Grey Edge может быть улучшен путем искусственного введения сильных градиентов путем перетасовки блоков изображений, и делают вывод, что самые сильные градиенты следуют направлению освещения. Их способ заключается в упорядоченном расположении пикселей по норме их проекции по направлению среднего цвета изображения и сохранении нижнего и верхнего процентиля. Эти две группы соответствуют сильным градиентам в изображении. Наконец, они выполняют основной анализ компонента (PCA) на сохраненных пикселях и возвращают первый компонент как предполагаемый осветитель. Используйте illumpca
функция для оценки освещенности с помощью алгоритма Cheng PCA.
Во-первых, оцените освещение, используя процентное значение по умолчанию метода Cheng PCA, исключая те, которые соответствуют графику ColorChecker.
illuminant_ch2 = illumpca(A,'Mask',mask_scene);
Вычислите угловую ошибку между расчетным освещением и основной истиной освещением.
err_ch2 = colorangle(illuminant_ch2,illuminant_groundtruth);
disp(['Angular error for Cheng with percentage=3.5: ' num2str(err_ch2)])
Angular error for Cheng with percentage=3.5: 5.0162
Белый баланс изображения в линейном цветовом пространстве RGB с помощью предполагаемой подсветки.
B_ch2 = chromadapt(A,illuminant_ch2,'ColorSpace','linear-rgb');
Отобразите гамма-исправленное белое сбалансированное изображение.
B_ch2_sRGB = lin2rgb(B_ch2);
imshow(B_ch2_sRGB)
title('White-Balanced Image using Cheng with percentile=3.5')
Теперь оцените освещение сцены, используя нижний и верхний 5% пикселей по направлению среднего цвета. Второй аргумент illumpca
функция задает процентили нижних и верхних значений (упорядоченных по яркости), которые нужно исключить.
illuminant_ch1 = illumpca(A,5,'Mask',mask_scene);
Вычислите угловую ошибку между расчетным освещением и основной истиной освещением. Ошибка меньше, чем при оценке подсветчика с использованием процента по умолчанию.
err_ch1 = colorangle(illuminant_ch1, illuminant_groundtruth);
disp(['Angular error for Cheng with percentage=5: ' num2str(err_ch1)])
Angular error for Cheng with percentage=5: 4.7454
Белый баланс изображения в линейном цветовом пространстве RGB с помощью предполагаемой подсветки.
B_ch1 = chromadapt(A,illuminant_ch1,'ColorSpace','linear-rgb');
Отобразите гамма-исправленное белое сбалансированное изображение.
B_ch1_sRGB = lin2rgb(B_ch1);
imshow(B_ch1_sRGB)
title('White-Balanced Image using Cheng with percentage=5')
Чтобы найти лучший параметр для использования в каждом алгоритме, можно протянуть область значений и вычислить угловую ошибку для каждого из них. Параметры трех алгоритмов имеют различные значения, но одинаковые области значений этих параметров облегчают программный поиск лучшего для каждого алгоритма.
param_range = 0:0.25:5; err = zeros(numel(param_range),3); for k = 1:numel(param_range) % White Patch illuminant_wp = illumwhite(A,param_range(k),'Mask',mask_scene); err(k,1) = colorangle(illuminant_wp,illuminant_groundtruth); % Gray World illuminant_gw = illumgray(A,param_range(k),'Mask',mask_scene); err(k,2) = colorangle(illuminant_gw,illuminant_groundtruth); % Cheng if (param_range(k) ~= 0) illuminant_ch = illumpca(A,param_range(k),'Mask',mask_scene); err(k,3) = colorangle(illuminant_ch,illuminant_groundtruth); else % Cheng's algorithm is undefined for percentage=0. err(k,3) = NaN; end end
Отобразите тепловую карту угловой ошибки с помощью heatmap
функция. Темно-синие цвета указывают на низкую угловую ошибку, а желтые - на высокую угловую ошибку. Оптимальный параметр имеет наименьшую угловую ошибку.
heatmap(err,'Title','Angular Error','Colormap',parula(length(param_range)), ... 'XData',["White Patch" "Gray World" "Cheng's PCA"], ... 'YLabel','Parameter Value','YData',string(param_range));
Найдите лучший параметр для каждого алгоритма.
[~,idx_best] = min(err); best_param_wp = param_range(idx_best(1)); best_param_gw = param_range(idx_best(2)); best_param_ch = param_range(idx_best(3)); fprintf('The best parameter for White Patch is %1.2f with angular error %1.2f degrees\n', ... best_param_wp,err(idx_best(1),1));
The best parameter for White Patch is 0.25 with angular error 3.35 degrees
fprintf('The best parameter for Gray World is %1.2f with angular error %1.2f degrees\n', ... best_param_gw,err(idx_best(2),2));
The best parameter for Gray World is 0.00 with angular error 5.04 degrees
fprintf('The best parameter for Cheng is %1.2f with angular error %1.2f degrees\n', ... best_param_ch,err(idx_best(3),3));
The best parameter for Cheng is 0.50 with angular error 1.74 degrees
Вычислите предполагаемую подсветку для каждого алгоритма, используя лучший параметр.
best_illum_wp = illumwhite(A,best_param_wp,'Mask',mask_scene); best_illum_gw = illumgray(A,best_param_gw,'Mask',mask_scene); best_illum_ch = illumpca(A,best_param_ch,'Mask',mask_scene);
Отображение угловой ошибки каждого лучшего подсветчика в цветовом пространстве RGB.
p = plot3([0 1],[0 1],[0,1],'LineStyle',':','Color','k'); ax = p.Parent; hold on plotColorAngle(illuminant_groundtruth,ax) plotColorAngle(best_illum_wp,ax) plotColorAngle(best_illum_gw,ax) plotColorAngle(best_illum_ch,ax) title('Best Illuminants in RGB space') view(28,36) legend('Achromatic Line','Ground Truth','White Patch','Gray World','Cheng') grid on axis equal
Вычислите оптимальные бело-сбалансированные изображения для каждого алгоритма, используя лучший осветитель.
B_wp_best = chromadapt(A,best_illum_wp,'ColorSpace','linear-rgb'); B_wp_best_sRGB = lin2rgb(B_wp_best); B_gw_best = chromadapt(A,best_illum_gw,'ColorSpace','linear-rgb'); B_gw_best_sRGB = lin2rgb(B_gw_best); B_ch_best = chromadapt(A,best_illum_ch,'ColorSpace','linear-rgb'); B_ch_best_sRGB = lin2rgb(B_ch_best);
Отобразите оптимальные бело-сбалансированные изображения для каждого алгоритма в монтаже.
figure montage({B_wp_best_sRGB,B_gw_best_sRGB,B_ch_best_sRGB},'Size',[1 3]) title('Montage of Best White-Balanced Images: White Point, Gray World, Cheng')
Это сравнение двух классических алгоритмов оценки освещения и более позднего показывает, что метод Ченга, используя верхний и нижний 0,75% самый темный и самый яркий пиксели, выигрывает для этого конкретного изображения. Однако этот результат следует принимать с помощью зерна соли.
Во-первых, основная истина осветитель был измеряема с помощью диаграммы ColorChecker и чувствителен к выстрелу и шуму датчика. Основная истина сцены может быть лучше оценен с помощью спектрофотометра.
Во-вторых, основная истина оценивается как средний цвет нейтральных закрашенных фигур. Обычно вместо среднего используют медиану, которая может сместить основную истину на значительное количество. Например, для изображения в этом исследовании, используя те же пиксели, медианный цвет и средний цвет нейтральных закрашенных фигур находятся на 0,5 степени друг от друга, что в некоторых случаях может быть больше, чем угловая ошибка осветителей, оцененная различными алгоритмами.
В-третьих, полное сравнение алгоритмов оценки освещения должно использовать множество изображений, полученных в различных условиях. Один алгоритм может работать лучше, чем другие для определенного изображения, но может плохо работать по всему набору данных.
The plotColorAngle
Графики функций вектор модуля подсветчика в 3-D цветовом пространстве RGB. Входной параметр illum
задает освещение в виде цвета RGB и входного параметра ax
задает оси, на которых нужно построить график вектора модуля.
function plotColorAngle(illum,ax) R = illum(1); G = illum(2); B = illum(3); magRGB = norm(illum); plot3([0 R/magRGB],[0 G/magRGB],[0 B/magRGB], ... 'Marker','.','MarkerSize',10,'Parent',ax) xlabel('R') ylabel('G') zlabel('B') xlim([0 1]) ylim([0 1]) zlim([0 1]) end
[1] Эбнер, Марк. Белая закрашенная фигура ретинекс, постоянство цвета. John Wiley & Sons, 2007. ISBN 978-0-470-05829-9.
[2] Эбнер, Марк. The Gray World Assumption, Color Constancy. John Wiley & Sons, 2007. ISBN 978-0-470-05829-9.
[3] Cheng, Dongliang, Dilip K. Prasad, and Michael S. Brown. «Подсвечивающая оценка постоянства цвета: почему работают пространственно-доменные методы и роль цветового распределения». JOSA A 31.5 (2014): 1049-1058.
[4] Van De Weijer, Joost, Theo Gevers, and Arjan Gijsenij. «Краевое постоянство цвета». Транзакции IEEE по обработке изображений 16.9 (2007): 2207-2214.
chromadapt
| colorangle
| colorChecker
| illumgray
| illumpca
| illumwhite
| lin2rgb
| measureColor
| rgb2lin