exponenta event banner

Сравнение алгоритмов автоматического баланса белого

В этом примере показано, как оценить освещенность и выполнить баланс белого сцены с использованием трех различных алгоритмов освещенности. В примере сравнивается предполагаемый световой сигнал с основным световым сигналом, вычисленным с помощью диаграммы X-Rite ® ColorChecker ®.

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

Автоматическая балансировка белого выполняется в два этапа:

  • Шаг 1: Оценка освещенности сцены.

  • Шаг 2: Исправьте цветовой баланс изображения.

Существует несколько различных алгоритмов оценки освещенности сцены. Производительность каждого алгоритма зависит от сцены, освещения и условий формирования изображения. Этот пример оценивает качество трех алгоритмов оценки освещенности для одного конкретного изображения, сравнивая их с освещенностью сцены истины на земле:

  • Ретинекс белого патча [1]

  • Серый мир [2]

  • Метод анализа основных компонентов (PCA) Ченга [3]

После того, как внешний свет известен, коррекция цветов в изображении (этап 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')

Измерить индикатор истинности грунта с помощью диаграммы ColorChecker

Вычислите индикатор истинности земли с помощью диаграммы 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

Создать маску диаграммы ColorChecker

При тестировании алгоритмов 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]')

Метод анализа основных компонентов (PCA) Ченга

Метод оценки освещенности Ченга черпает вдохновение из методов пространственной области, таких как Grey Edge [4], который предполагает, что градиенты изображения являются ахроматическими. Они показывают, что Серый Край может быть улучшен путем искусственного введения сильных градиентов путем перетасовки блоков изображения, и делают вывод, что самые сильные градиенты следуют за направлением светильника. Их способ заключается в упорядочении пикселей по норме их проекции вдоль направления среднего цвета изображения и удержании нижнего и верхнего процентиля. Эти две группы соответствуют сильным градиентам на изображении. Наконец, они выполняют анализ главного компонента (PCA) для сохраненных пикселей и возвращают первый компонент в качестве оцененного осветителя. Используйте illumpca функция оценки освещенности с использованием алгоритма РСА Ченга.

Включить нижний и верхний 3,5 процента пикселей по умолчанию

Во-первых, оцените светильник, используя процентное значение по умолчанию метода 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 процентов пикселей

Теперь оцените освещенность сцены, используя нижний и верхний 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.

См. также

| | | | | | | |

Связанные темы