主要内容

自动白平衡算法比较

这个例子展示了如何使用三种不同的光照算法来估计光照和实现场景的白平衡。这个例子比较了估计的光源和使用X-Rite®ColorChecker®图表计算的地面真光源。

眼睛非常擅长在不同的光照条件下判断什么是白色的。然而,数码相机,如果不进行某种调整,就可以很容易地捕捉到色彩强烈的不现实的图像。自动白平衡(AWB)算法试图用用户输入的最小值来校正环境光,这样得到的图像就像我们的眼睛所看到的一样。

自动白平衡有两个步骤:

  • 步骤1:估计场景的光源。

  • 第二步:调整图像的色彩平衡。

目前有几种不同的场景光源估计算法。每个算法的性能取决于场景、照明和成像条件。这个例子通过将三种算法与地面真实场景光照剂进行比较,来判断一幅特定图像光照剂估计的质量:

在已知环境光之后,纠正图像中的颜色(步骤2)是一个简单而固定的过程。

读取和预处理原始相机数据

AWB算法通常是在对原始图像数据进行少量预处理后,然后将图像压缩并保存到存储卡中。

将16位的原始图像读入工作区。foosballraw.tiff是一种图像文件,它包含校正黑电平并将强度缩放到每像素16位后的原始传感器数据。这幅图像不需要相机进行白平衡,也不需要其他预处理操作,如消噪、去噪、色差补偿、色调调整和伽马校正。

一个= imread (“foosballraw.tiff”);

插值恢复缺失的颜色信息

数码相机使用一个叠加在成像传感器上的滤色器阵列来模拟彩色视觉,这样每个像素对红、绿或蓝都很敏感。为了在每个像素处恢复缺失的颜色信息,使用插值demosaic函数。拍摄照片的相机(佳能EOS 30D)使用的拜耳图案为RGGB。

一个= demosaic (,“rggb”);

用于检测和显示的伽马正确图像

图像一个包含线性RGB值。线性RGB值适用于估计场景光源和校正图像的颜色平衡。但是,如果尝试显示线性RGB图像,由于显示设备的非线性特性,它会显得非常暗淡。因此,为了显示的目的,伽马校正图像到sRGB颜色空间使用lin2rgb函数。

A_sRGB = lin2rgb(一个);

在伽玛校正前和校正后显示失谐图像。

蒙太奇({A_sRGB})标题(“伽玛校正前后的原始图像”

使用ColorChecker图表测量地面真实光源

使用场景中包含的X-Rite ColorChecker图表计算地面真实光源。这个图表由24个已知光谱反射率的中性色和色斑组成。

在伽玛校正图像中检测图表使用colorChecker函数。线性RGB图像太暗了colorChecker自动检测图表。

chart_sRGB = colorChecker (A_sRGB);

确认正确检测到图表。

displayChart (chart_sRGB)

获取图表四个角落的注册点的坐标。

注册点= chart_srgb.registrationPoints;

创建一个新的colorChecker对象的线性RGB数据。使用定位点的坐标指定图表的位置。

图= colorChecker (,“RegistrationPoints”, registrationPoints);

测量线性RGB数据的地面真光源法测定剂函数。

illuminant_groundtruth = measureIlluminant(图)
illuminant_groundtruth =1×3103.× 4.5407 9.3226 6.1812

创建ColorChecker图表的掩码

在测试AWB算法时,要防止算法通过屏蔽图表而不公平地利用图表。

在图表上创建一个多边形ROIdrawpolygon函数。指定多边形的顶点作为配准点。

Chartroi = DrawPolygon(“位置”, registrationPoints);

将多边形感兴趣区域转换为二进制掩模createMask函数。

mask_chart = createMask (chartROI);

反转的面具。图表中的像素被排除在蒙版之外,场景其余部分的像素被包含在蒙版中。

mask_scene = ~ mask_chart;

为了确认遮罩的准确性,在图像上显示遮罩。蒙版中包含的像素是蓝色的。

imshow (labeloverlay (A_sRGB mask_scene));

角误差

你可以把光源看作是3-D RGB颜色空间中的矢量。估计光源的大小与其方向无关,因为光源的方向是用来实现图像白平衡的。

为了评价估计光源的质量,计算估计光源与地面真实值之间的角误差。角误差是两个矢量形成的角度(以度数表示)。角误差越小,估计效果越好。

为了更好地理解角误差的概念,考虑以下任意光源的可视化和使用ColorChecker图表测量的地面真实值。的plotColorAngle辅助函数在3-D RGB颜色空间中绘制光源的单位向量,并在示例的最后定义。

Sample_illuminant = [0.066 0.1262 0.0691];P = plot3([0,1], [0,1], [0,1],'linestyle'“:”“颜色”“k”);AX = P.Parent;抓住plotColorAngle (illuminant_groundtruth ax) plotColorAngle (sample_illuminant ax)标题(“RGB空间中的光源”36)视图(28日)传说(“消色差线”“地面实况光源”“样本光源”网格)平等的

白色补丁Retinex.

用于估计光源的白斑Retinex算法假设场景包含一个明亮的消色斑。这个补丁反射每个颜色波段的最大可能的光,这是场景光源的颜色。使用illumwhite函数使用White Patch Retinex算法估计光照。

包括所有场景像素

使用场景中的所有像素估计光源。将ColorChecker图从场景中排除“面具”名称-值对的论点。

percentileToExclude = 0;illuminant_wp1 = illumwhite (percentileToExclude,“面具”, mask_scene);

计算白斑Retinex估计光源的角度误差。

Err_wp1 = colorangle(illuminant_wp1, illuminant_groundtruth);disp (['百分比=0的White Patch的角误差:'num2str (err_wp1)))
百分比=0的白斑的角误差:16.5381

白平衡使用图像chromadapt函数。指定估计的光源并指示颜色值在线性RGB颜色空间中。

B_wp1 = chromadapt (illuminant_wp1,'色彩空间'“linear-rgb”);

显示伽玛校正的白平衡图像。

B_wp1_sRGB = lin2rgb (B_wp1);图imshow (B_wp1_sRGB)标题('使用白色贴片视网膜+ 0'的白色平衡图像

排除最亮的像素

当像素过度曝光时,White Patch Retinex算法的表现并不好。为了提高算法的性能,排除最亮像素的前1%。

percentileToExclude = 1;illuminant_wp2 = illumwhite (percentileToExclude,“面具”, mask_scene);

计算估计光源的角误差。误差小于用所有像素估计光源时的误差。

err_wp2 = colorangle (illuminant_wp2 illuminant_groundtruth);disp (['百分比=1的White Patch的角度误差:'num2str (err_wp2)))
白斑的角度误差百分比=1:5.0324

使用估计的光源在线性RGB颜色空间中对图像进行白平衡。

B_wp2 = chromadapt (illuminant_wp2,'色彩空间'“linear-rgb”);

用新的光源显示伽玛校正的白平衡图像。

B_wp2_sRGB = lin2rgb (B_wp2);imshow (B_wp2_sRGB)标题(“使用百分位数=1的White Patch Retinex的白色平衡图像”

灰色的世界

用于估计光源的灰色世界算法假设世界的平均颜色是灰色的,或无色的。因此,将场景光源计算为平均图像中的RGB值。使用Illumgray.函数,使用灰色世界算法估计光照。

包括所有场景像素

首先,使用图像的所有像素估计场景的光源,不包括那些与ColorChecker图表相对应的像素。的Illumgray.函数提供一个参数来指定要排除的底部值和顶部值的百分比(按亮度排序)。在这里,指定百分比为0。

percentileToExclude = 0;illuminant_gw1 = illumgray (percentileToExclude,“面具”, mask_scene);

计算估计光源与地面真实光源之间的角误差。

err_gw1 = colorangle (illuminant_gw1 illuminant_groundtruth);disp (['灰色世界的角度误差与百分比=[0 0]:'num2str (err_gw1)))
灰色世界的角度误差百分比=[0 0]:5.0416

使用估计的光源在线性RGB颜色空间中对图像进行白平衡。

B_gw1 = chromadapt (illuminant_gw1,'色彩空间'“linear-rgb”);

显示伽玛校正的白平衡图像。

B_gw1_sRGB = lin2rgb (B_gw1);imshow (B_gw1_sRGB)标题('白色平衡图像使用灰色世界与百分比=[0 0]'

排除最亮和最暗像素

当像素曝光不足或过度时,灰色世界算法表现不佳。为了提高算法的性能,剔除最暗和最亮像素的前1%。

percentileToExclude = 1;illuminant_gw2 = illumgray (percentileToExclude,“面具”, mask_scene);

计算估计光源的角误差。误差小于用所有像素估计光源时的误差。

Err_gw2 = colorangle(illuminant_gw2, illuminant_groundtruth);disp (['灰色世界的角度误差与百分比=[1 1]:'num2str (err_gw2)))
灰色世界的角度误差与百分比=[1 1]:5.1094

使用估计的光源在线性RGB颜色空间中对图像进行白平衡。

B_gw2 = chromadapt (illuminant_gw2,'色彩空间'“linear-rgb”);

用新的光源显示伽玛校正的白平衡图像。

B_gw2_sRGB = lin2rgb (B_gw2);imshow (B_gw2_sRGB)标题('使用灰色世界的白色平衡图像百分比= [1 1]'

主成分分析(PCA)方法

Cheng的光源估计方法从空间域方法如灰色边缘中得到启发[4],它假设图像的梯度是消色差的。结果表明,灰度边缘可以通过变换图像块人工引入强梯度来改善,最强的梯度跟随光源的方向。他们的方法是根据沿图像平均颜色方向投影的范数对像素进行排序,并保留底部和顶部的百分位数。这两组对应于图像中的强梯度。最后,他们表演主成分分析(PCA),并返回第一个分量作为估计的光源。使用illumpca函数,利用Cheng的主成分分析算法估计光照。

包括默认底部和顶部3.5%的像素

首先,使用Cheng的PCA方法的默认百分比值估计光源,不包括ColorChecker图对应的百分比值。

illuminant_ch2 = illumpca (,“面具”, mask_scene);

计算估计光源与地面真实光源之间的角误差。

err_ch2 = colorangle (illuminant_ch2 illuminant_groundtruth);disp ([Cheng的角度误差百分比=3.5:num2str (err_ch2)))
Cheng的角度误差百分比=3.5:5.0162

使用估计的光源在线性RGB颜色空间中对图像进行白平衡。

B_ch2 = chromadapt (illuminant_ch2,'色彩空间'“linear-rgb”);

显示伽玛校正的白平衡图像。

b_ch2_srgb = lin2rgb(b_ch2);imshow(b_ch2_srgb)标题(“使用Cheng的白平衡图像,百分位数=3.5”

包括底部和顶部5%的像素

现在,估计场景光源使用底部和顶部5%的像素沿平均颜色的方向。第二个论点illumpca函数指定要排除的底部值和顶部值的百分比(按亮度排序)。

illuminant_ch1 = illumpca (5“面具”, mask_scene);

计算估计光源与地面真实光源之间的角误差。错误小于使用默认百分比估计发光时的误差。

Err_ch1 = colorangle(illuminant_ch1, illuminant_groundtruth);disp ([' Cheng的角度误差百分比=5 'num2str (err_ch1)))
Cheng的角度误差百分比=5:4.7454

使用估计的光源在线性RGB颜色空间中对图像进行白平衡。

B_ch1 = chromadapt (illuminant_ch1,'色彩空间'“linear-rgb”);

显示伽玛校正的白平衡图像。

B_ch1_sRGB = lin2rgb (B_ch1);imshow (B_ch1_sRGB)标题(“使用cheng百分比的白色平衡形象= 5”

找到最优参数

为了找到每个算法使用的最佳参数,您可以遍历一个范围并计算每个算法的角误差。这三种算法的参数有不同的含义,但这些参数的相似范围使得可以很容易地通过编程为每种算法搜索最佳的参数。

param_range = 0:0.25:5;呃= 0(元素个数(param_range), 3);k = 1:元素个数(param_range)%白色补丁Illuminant_wp = IllumWhite(A,Param_Range(k),“面具”, mask_scene);犯错(k, 1) = colorangle (illuminant_wp illuminant_groundtruth);%的灰色世界illuminant_gw = illumgray (A, param_range (k),“面具”, mask_scene);犯错(k, 2) = colorangle (illuminant_gw illuminant_groundtruth);%程如果illuminant_ch = illumpca(A,param_range(k)),“面具”, mask_scene);犯错(k, 3) = colorangle (illuminant_ch illuminant_groundtruth);其他的当百分比=0时,% Cheng的算法未定义。犯错(k, 3) =南;结束结束

显示角误差的热图使用的热图函数。深蓝色表示角度误差低,而黄色表示角度误差高。最优参数的角误差最小。

热图(呃,'标题'“角误差”“Colormap”parula(长度(param_range)),...“XData”, (“白色补丁”“灰色的世界”“程的PCA”],...“YLabel”'参数值'“YData”字符串(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));流(“White Patch的最佳参数是%1.2f,角误差%1.2f°\n”...best_param_wp犯错(idx_best (1), 1));
White Patch的最佳参数为0.25,角度误差为3.35度
流(“灰色世界的最佳参数是%1.2f,角误差%1.2f°\n”...best_param_gw犯错(idx_best (2), 2));
Gray World的最佳参数为0.00,角度误差为5.04度
流(Cheng的最佳参数为%1.2f,角误差%1.2f°\n'...best_param_ch犯错(idx_best (3), 3));
Cheng的最佳参数为0.50,角误差为1.74度

用最优参数计算每个算法的估计光源。

best_illum_wp = illumwhite (best_param_wp,“面具”, mask_scene);best_illum_gw = illumgray (best_param_gw,“面具”, mask_scene);best_illum_ch = illumpca (best_param_ch,“面具”, mask_scene);

在RGB颜色空间中显示每种最佳光源的角度误差。

P = plot3([0,1], [0,1], [0,1],'linestyle'“:”“颜色”“k”);AX = P.Parent;抓住plotColorAngle(best_illum_wp,ax) plotColorAngle(best_illum_gw,ax) plotColorAngle(best_illum_ch,ax) title(“RGB空间中最好的光源”36)视图(28日)传说(“消色差线”'真相'“白色补丁”'灰色世界'“程”网格)平等的

计算最佳的白平衡图像为每个算法使用最好的光源。

B_wp_best = chromadapt (best_illum_wp,'色彩空间'“linear-rgb”);B_wp_best_sRGB = lin2rgb (B_wp_best);B_gw_best = chromadapt (best_illum_gw,'色彩空间'“linear-rgb”);B_gw_best_sRGB = lin2rgb (B_gw_best);B_ch_best = chromadapt (best_illum_ch,'色彩空间'“linear-rgb”);B_ch_best_sRGB = lin2rgb (B_ch_best);

显示最佳白平衡图像为每个算法在蒙太奇。

图蒙太奇({B_wp_best_sRGB、B_gw_best_sRGB B_ch_best_sRGB},“大小”3[1])标题(“最佳白平衡图像蒙太奇:白点、灰色世界、程”

结论

对比两种经典的光源估计算法和最近的一种算法,Cheng的方法,使用顶部和底部0.75%的最暗和最亮像素,对特定的图像获胜。然而,这一结果应该持保留态度。

首先,地面真光源是用ColorChecker图测量的,对镜头和传感器噪声很敏感。使用分光光度计可以更好地估计场景的地面真光源。

其次,地面真光源被估计为中性斑块的平均颜色。使用中值而不是平均值是很常见的,这可能会大大改变地面事实。例如,在本研究的图像中,使用相同的像素,中性块的中值颜色和平均颜色之间的距离为0.5度,在某些情况下可能会超过不同算法估计光源的角度误差。

第三,光源估计算法的充分比较应采用不同条件下拍摄的各种图像。对于特定的图像,一种算法可能比其他算法工作得更好,但在整个数据集上可能表现不佳。

金宝app支持函数

plotColorAngle函数绘制光源在3-D RGB颜色空间中的单位向量。输入参数illum指定光源为RGB颜色和输入参数斧头指定绘制单位向量的轴。

函数Plotcolorangle(Illum,Ax)R = Illum(1);g = illum(2);b = illum(3);magrgb = norm(illum);Plot3([0 r / magrgb],[0 g / magrgb],[0b / magrgb],...“标记”“。”“MarkerSize”10“父”ax)包含(“R”) ylabel (‘G’) zlabel (“B”) xlim([0 1]) ylim([0 1]) zlim([1])结束

参考

[1] it,马克。白斑Retinex,颜色稳定。John Wiley & Sons, 2007。ISBN 978-0-470-05829-9。

[2] it,马克。灰色世界假设,色彩恒常性。John Wiley & Sons, 2007。ISBN 978-0-470-05829-9。

程东亮,迪利普·k·普拉萨德,迈克尔·s·布朗。《颜色恒常性的光源估计:为什么空间域方法有效以及颜色分布的作用》[j] .中国科学(d辑):地球科学(英文版)。

[4] Van De Weijer, Joost, Theo Gevers和Arjan Gijsenij。“Edge-based颜色恒常性”。计算机工程与应用。

另请参阅

||||||||

相关的话题