主要内容

自动白平衡算法的比较

这个例子展示了如何估计照明和执行白平衡的一个场景使用三种不同的照明算法。

眼睛是很擅长判断什么是白色不同照明条件下。数码相机,但是,没有某种调整,很容易捕捉到不切实际的图像与一个强大的颜色。自动白平衡(AWB)算法试图纠正环境光与最低来自用户的输入,这样产生的图像看起来像我们的眼睛会看到什么。

自动白平衡在两个步骤完成:

  • 步骤1:评估现场光源。

  • 步骤2:正确的图像的色彩平衡。

存在几种不同的算法来估计光源。

  • 白色补丁Retinex[1]

  • 灰色的世界[2]

  • 程菲的主成分分析(PCA)方法[3]

每个算法的性能取决于现场,照明和成像条件。这个例子法官为一个特定的图像质量的三个算法进行比较,计算地面实况场景光源使用ColorChecker®图表。

阅读和原始相机数据进行预处理

AWB算法通常应用于原始图像数据最少的预处理后,在图像压缩和保存到记忆卡。

读一个16位的原始图像到工作区中。foosballraw.tiff是一个图像文件,其中包含原始传感器数据修正后的黑电平和扩展强度每像素16位。这张照片是免费做的白平衡的摄像头,以及其他demosaicing等预处理操作,去噪,色差补偿,调整语气,伽马校正。

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

插入恢复丢失的颜色信息

数码相机使用颜色滤波阵列叠加成像传感器模拟色觉,这样每个像素是敏感红色,绿色或蓝色。恢复丢失的颜色信息在每一个像素,插入使用demosaic函数。拜耳模式使用的相机的照片拍摄RGGB(佳能EOS 30 d)。

一个= demosaic (,“rggb”);

Gamma-Correct图像检测和显示

图像一个包含线性RGB值。线性RGB值适合估计场景光源和纠正图像的色彩平衡。然而,如果你试图显示线性RGB图像,它会显得很暗,因为显示设备的非线性特征。因此,对于显示目的,gamma-correct sRGB色彩空间使用的图像lin2rgb函数。

A_sRGB = lin2rgb(一个);

显示demosaiced伽马校正前后的图像。

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

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

计算地面实况光源使用ColorChecker图表,包括在现场。这个图表是由24个中性和颜色与已知的光谱相对于红光补丁。

探测伽马校正图像通过使用图表colorChecker函数。线性RGB图像太暗了colorChecker自动检测图。

chart_sRGB = colorChecker (A_sRGB);

确认图正确检测到。

displayChart (chart_sRGB)

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

registrationPoints = chart_sRGB.RegistrationPoints;

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

图= colorChecker (A, RegistrationPoints = RegistrationPoints);

测量地面实况光源的线性RGB数据使用measureIlluminant函数。

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

创建的面具ColorChecker图表

测试AWB时算法,防止算法不公平地利用图表的掩蔽图表。

创建一个多边形图使用ROIdrawpolygon函数。指定多边形的顶点作为登记点。

= registrationPoints chartROI = drawpolygon(位置);

将多边形ROI转换成二进制面膜使用createMask函数。

mask_chart = createMask (chartROI);

反转的面具。像素图内的面具,像素被排除在其他场景中包括面具。

mask_scene = ~ mask_chart;

确认的准确性面具,面具显示图像。像素包括面具的蓝色色调。

imshow (labeloverlay (A_sRGB mask_scene));

角误差

你可以考虑一个光源在3 d RGB颜色空间作为一个向量。估计光源的大小并不像它的方向,因为光源的方向就是白平衡一个图像。

评价估计光源的质量,计算之间的角度误差估计光源和地面真理。角误差角(度)形成的两个向量。角误差越小,估计是越好。

为了更好地理解角误差的概念,考虑以下任意光源和地面真理的可视化测量使用ColorChecker图表。的plotColorAnglehelper函数块光源的一个单位向量在3 d RGB颜色空间中,最后定义的例子。

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

白色补丁Retinex

白色的补丁Retinex光源估计算法假设场景包含一块明亮的消色差。这个补丁可能反映了最大光对于每个颜色带,这是现场光源的颜色。使用illumwhite函数来估计照明使用白色补丁Retinex算法。

包括所有场景像素

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

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

计算光源的角误差估计与白色补丁Retinex。

err_wp1 = colorangle (illuminant_wp1 illuminant_groundtruth);disp ([“白片角误差百分比= 0:“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)标题(“白平衡的形象用白色补丁Retinex百分比= 0 ")

排除最亮的像素

白色的补丁Retinex算法不执行当像素是曝光过度。为了提高算法的性能,排除1%的最亮的像素。

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

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

err_wp2 = colorangle (illuminant_wp2 illuminant_groundtruth);disp ([“白色补丁,角误差百分比= 1:“num2str (err_wp2)))
角误差白色补丁百分位= 1:5.0324

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

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

图像显示伽马校正白平衡与新光源。

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

灰色的世界

灰色的世界光源估计算法假定世界的平均颜色是灰色,或消色差。因此,计算出光源的场景平均图像的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]:“num2str (err_gw2)))
角误差灰色世界百分位数= [1]:5.1094

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

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

图像显示伽马校正白平衡与新光源。

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

程菲的主成分分析(PCA)方法

程菲的光源从空间域方法估算方法的灵感如灰色边缘[4]假设图像的梯度,消色差。他们表明,灰色的边缘可以提高通过人为地引入强梯度通过图像块,并得出结论,最强的梯度跟踪光源的方向。根据规范他们的方法在于点像素的投影的方向指的是图像的颜色,和留住底部和顶部百分位。这两组对应于强梯度图像中。最后,他们执行主成分分析(PCA)聘请的像素并返回第一个组件上估计光源。使用illumpca程函数来估计照明使用的主成分分析算法。

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

首先,估计光源使用默认值比例程的PCA方法,排除那些ColorChecker对应图表。

illuminant_ch2 = illumpca (A,面具= mask_scene);

计算之间的角度误差估计光源和地面真理光源。

err_ch2 = colorangle (illuminant_ch2 illuminant_groundtruth);disp ([”郑角误差百分比= 3.5:“num2str (err_ch2)))
程角误差百分比= 3.5:5.0162

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

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

显示伽马校正白平衡的形象。

B_ch2_sRGB = lin2rgb (B_ch2);imshow (B_ch2_sRGB)标题(“白平衡的形象用程百分位= 3.5”)

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

现在,估计现场光源使用底层和顶层5%的像素的方向指的是颜色。第二个参数illumpca函数指定底部和顶部的百分位数的值(亮度)下令排除。

面具illuminant_ch1 = illumpca (5 = mask_scene);

计算之间的角度误差估计光源和地面真理光源。误差小于估计光源时使用默认的百分比。

err_ch1 = colorangle (illuminant_ch1 illuminant_groundtruth);disp ([”郑角误差百分比= 5:“num2str (err_ch1)))
程角误差百分比= 5:4.7454

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

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

显示伽马校正白平衡的形象。

B_ch1_sRGB = lin2rgb (B_ch1);imshow (B_ch1_sRGB)标题(“白平衡的形象用成比例= 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);%程如果(param_range (k) ~ = 0) illuminant_ch = illumpca (A, param_range (k),掩码= mask_scene);犯错(k, 3) = colorangle (illuminant_ch illuminant_groundtruth);其他的%程算法定义的比例= 0犯错(k, 3) =南;结束结束

显示一个热图角的错误使用的热图函数。深蓝色的颜色表明低角误差而黄颜色表示高角误差。最优参数的最小角误差。

热图(呃,Title =“角错误”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));流(“白色补丁的最佳参数% 1.2角错误% 1.2 f度\ n”,best_param_wp犯错(idx_best (1), 1));
白色的补丁的最佳参数为0.25与3.35度角错误
流(“世界最佳参数灰色% 1.2度角错误% 1.2 f度\ n”,best_param_gw犯错(idx_best (2), 2));
灰色世界的最佳参数为0.00与5.04度角错误
流(”郑的最佳参数f % 1.2度角错误% 1.2度\ n”,best_param_ch犯错(idx_best (3), 3));
程的最佳参数为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],线型=”:“颜色=“k”);ax = p.Parent;持有plotColorAngle (illuminant_groundtruth ax) plotColorAngle (best_illum_wp ax) plotColorAngle (best_illum_gw ax) plotColorAngle (best_illum_ch, ax)标题(“最佳光源在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])标题(“蒙太奇的最佳白平衡图像:白色点,灰色的世界,程”)

结论

这种比较的两个经典光源估计算法和最近一个表明,程菲的方法,使用顶部和底部0.75%最黑暗和最亮的像素,获得特定的图像。然而,这一结果应采取与一粒盐。

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

其次,地面真理光源估计的平均颜色中性的补丁。共同使用中值相反的意思,这可能改变大量的地面实况。例如,对于图像在这项研究中,使用相同的像素,颜色和中值的意思是颜色中性补丁0.5度,这在某些情况下可以多光源的角误差估计算法不同。

第三,一个完整的比较光源估计算法应该使用各种不同条件下拍摄的图像。一个算法可能比别人工作对于一个特定的形象,但表现不佳可能在整个数据集。

万博1manbetx支持函数

plotColorAngle功能块的单位向量在3 d RGB颜色空间中光源。输入参数illum指定光源作为一个RGB颜色和输入参数斧头指定轴的单位向量。

函数plotColorAngle (illum ax) R = illum (1);G = illum (2);B = illum (3);magRGB =规范(illum);plot3 ([0 R / magRGB], [0 G / magRGB], [0 B / magRGB],标志=“。”MarkerSize = 10,父= ax)包含(“R”)ylabel (“G”)zlabel (“B”1)xlim ([0]) ylim ([0 1]) zlim ([0 1])结束

引用

[1]it,马克。白色补丁Retinex,颜色恒常性。约翰威利& Sons, 2007。ISBN 978-0-470-05829-9。

[2]it,马克。灰色世界的假设,颜色恒常性。约翰威利& Sons, 2007。ISBN 978-0-470-05829-9。

程[3],Dongliang Dilip k·普拉萨德,布朗和迈克尔·s。“光源估计色彩恒常性:为什么空间域方法工作和颜色分布的作用。”JOSA A 31.5 (2014): 1049-1058.

Joost, [4] Van De Weijer Gevers西奥和阿扬Gijsenij。“Edge-based颜色恒常性”。IEEE Transactions on image processing 16.9 (2007): 2207-2214.

另请参阅

||||||||

相关的话题