В этом примере показано, как оценить освещенность и выполнить баланс белого сцены с использованием трех различных алгоритмов освещенности. В примере сравнивается предполагаемый световой сигнал с основным световым сигналом, вычисленным с помощью диаграммы X-Rite ® ColorChecker ®.
Глаза очень хорошо оценивают, что является белым при различных условиях освещения. Цифровые фотоаппараты, впрочем, без какой-то регулировки могут легко запечатлеть нереальные изображения с сильным цветным отливом. Автоматические алгоритмы баланса белого (AWB) пытаются скорректировать для окружающего света с минимальным вводом от пользователя, чтобы получившееся изображение выглядело так, как видели бы наши глаза.
Автоматическая балансировка белого выполняется в два этапа:
Шаг 1: Оценка освещенности сцены.
Шаг 2: Исправьте цветовой баланс изображения.
Существует несколько различных алгоритмов оценки освещенности сцены. Производительность каждого алгоритма зависит от сцены, освещения и условий формирования изображения. Этот пример оценивает качество трех алгоритмов оценки освещенности для одного конкретного изображения, сравнивая их с освещенностью сцены истины на земле:
После того, как внешний свет известен, коррекция цветов в изображении (этап 2) является простым и фиксированным процессом.
Алгоритмы AWB обычно применяются к необработанным данным изображения после минимального объема предварительной обработки до того, как изображение будет сжато и сохранено на карте памяти.
Чтение 16-разрядного необработанного изображения в рабочую область. foosballraw.tiff - файл изображения, содержащий необработанные данные датчика после коррекции уровня черного и масштабирования интенсивностей до 16 бит на пиксель. Это изображение не имеет балансировки белого, выполняемой камерой, а также других операций предварительной обработки, таких как демосейсинг, деноизирование, компенсация хроматической аберрации, регулировка тона и гамма-коррекция.
A = imread('foosballraw.tiff');Цифровые камеры используют матрицу цветных фильтров, наложенную на датчик изображения, для моделирования цветового зрения, так что каждый пиксель чувствителен к красному, зеленому или синему. Чтобы восстановить недостающую информацию о цвете в каждом пикселе, выполните интерполяцию с помощью demosaic функция. Рисунок Байера, используемый камерой, с помощью которой была снята фотография (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);
Преобразование ROI полигона в двоичную маску с помощью createMask функция.
mask_chart = createMask(chartROI);
Переверните маску. Пиксели внутри диаграммы исключаются из маски, а пиксели остальной сцены включаются в маску.
mask_scene = ~mask_chart;
Чтобы подтвердить точность маски, отобразите маску поверх изображения. Пиксели, включенные в маску, имеют синий оттенок.
imshow(labeloverlay(A_sRGB,mask_scene));

Осветитель можно рассматривать как вектор в цветовом пространстве 3-D RGB. Величина оцененного светильника не имеет такого значения, как его направление, потому что направление светильника является тем, что используется для баланса белого изображения.
Чтобы оценить качество оцененного светильника, вычислите угловую ошибку между оцененным светильником и истинностью земли. Угловая погрешность - это угол (в градусах), образованный двумя векторами. Чем меньше угловая погрешность, тем лучше оценка.
Чтобы лучше понять понятие угловой ошибки, рассмотрим следующую визуализацию произвольного светильника и истинности земли, измеренную с помощью диаграммы ColorChecker. plotColorAngle функция помощника готовит вектор единицы источника света в 3D цветовом пространстве 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

Алгоритм White Patch 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 для оценки освещенности с использованием алгоритма Серого мира.
Сначала оцените освещенность сцены, используя все пиксели изображения, исключая те, которые соответствуют диаграмме ColorChecker. 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]')
Алгоритм «Серый мир» работает плохо, когда пикселы не экспонируются или не экспонируются. Чтобы улучшить производительность алгоритма, исключите 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]')
Метод оценки освещенности Ченга черпает вдохновение из методов пространственной области, таких как Grey Edge [4], который предполагает, что градиенты изображения являются ахроматическими. Они показывают, что Серый Край может быть улучшен путем искусственного введения сильных градиентов путем перетасовки блоков изображения, и делают вывод, что самые сильные градиенты следуют за направлением светильника. Их способ заключается в упорядочении пикселей по норме их проекции вдоль направления среднего цвета изображения и удержании нижнего и верхнего процентиля. Эти две группы соответствуют сильным градиентам на изображении. Наконец, они выполняют анализ главного компонента (PCA) для сохраненных пикселей и возвращают первый компонент в качестве оцененного осветителя. Используйте illumpca функция оценки освещенности с использованием алгоритма РСА Ченга.
Во-первых, оцените светильник, используя процентное значение по умолчанию метода 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 градуса, что в некоторых случаях может быть больше угловой ошибки осветителей, оцененной различными алгоритмами.
В-третьих, полное сравнение алгоритмов оценки освещенности должно использовать множество изображений, сделанных в различных условиях. Один алгоритм может работать лучше, чем другие для определенного изображения, но может работать плохо по всему набору данных.
plotColorAngle функционируйте готовит вектор единицы источника света в 3D цветовом пространстве 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] Эбнер, Марк. Ретинекс белого пятна, цветовое постоянство. Джон Уайли и сыновья, 2007. ISBN 978-0-470-05829-9.
[2] Эбнер, Марк. Успение серого мира, цветовое постоянство. Джон Уайли и сыновья, 2007. ISBN 978-0-470-05829-9.
[3] Чэн, Дунлян, Дилип К. Прасад и Майкл С. Браун. «Оценка освещенности для цветового постоянства: почему работают методы пространственной области и роль цветораспределения». JOSA A 31.5 (2014): 1049-1058.
[4] Ван Де Вейер, Йоост, Тео Геверс и Арьян Хийсенидж. «Постоянство цвета на основе краев». IEEE Транзакции по обработке изображений 16.9 (2007): 2207-2214.
chromadapt | colorangle | colorChecker | illumgray | illumpca | illumwhite | lin2rgb | measureColor | rgb2lin