此示例演示如何使用三种不同的照明算法估计照明并执行场景的白平衡。此示例将估计的照明体与使用X-Rite®ColorChecker®图表计算的地面真实照明体进行比较。
眼睛非常擅长在不同的光照条件下判断什么是白色的。然而,数码相机,如果不进行某种调整,就可以很容易地捕捉到色彩强烈的不现实的图像。自动白平衡(AWB)算法试图用用户输入的最小值来校正环境光,这样得到的图像就像我们的眼睛所看到的一样。
自动白平衡有两个步骤:
步骤1:估计场景的光源。
第二步:调整图像的色彩平衡。
存在几种不同的算法来估计场景光源。每种算法的性能取决于场景、照明和成像条件。本示例通过将三种算法与地面真实场景光源进行比较,来判断一幅特定图像的光源估计算法的质量:
在环境光已知后,校正图像中的颜色(步骤2)是一个简单且固定的过程。
AWB算法通常在图像压缩并保存到存储卡之前,经过最少的预处理后应用于原始图像数据。
将16位原始图像读入工作区。foosballraw.tiff
是一种图像文件,它包含校正黑电平并将强度缩放到每像素16位后的原始传感器数据。这幅图像不需要相机进行白平衡,也不需要其他预处理操作,如消噪、去噪、色差补偿、色调调整和伽马校正。
A=imread(“foosballraw.tiff”);
数码相机使用叠加在成像传感器上的彩色滤光片阵列来模拟彩色视觉,因此每个像素对红色、绿色或蓝色都很敏感。要恢复每个像素上缺失的颜色信息,请使用demosaic
函数。拍摄照片的相机(佳能EOS 30D)使用的拜耳图案为RGGB。
A=demosaic(A,“rggb”);
形象一个
包含线性RGB值。线性RGB值适用于估计场景光源和校正图像的颜色平衡。但是,如果尝试显示线性RGB图像,由于显示设备的非线性特性,它会显得非常暗淡。因此,为了显示的目的,伽马校正图像到sRGB颜色空间使用lin2rgb
函数。
A_sRGB = lin2rgb(一个);
显示分解后的图像之前和之后的伽玛校正。
蒙太奇({A_sRGB})标题(“伽马校正前后的原始图像”)
使用场景中包含的X-Rite ColorChecker图表计算地面真实光源。这个图表由24个已知光谱反射率的中性色和色斑组成。
使用颜色检查器
函数。线性RGB图像太暗了颜色检查器
自动检测图表。
chart_sRGB = colorChecker (A_sRGB);
确认已正确检测到图表。
displayChart (chart_sRGB)
在图表的四个角得到注册点的坐标。
registrationPoints = chart_sRGB.RegistrationPoints;
创建一个新的颜色检查器
对象的线性RGB数据。使用定位点的坐标指定图表的位置。
图= colorChecker (,“注册点”, registrationPoints);
使用测量仪测量线性RGB数据的地面真实照度measureIlluminant
函数。
发光体=被测发光体(图表)
发光体=1×3103.× 4.5407 9.3226 6.1812
在测试AWB算法时,要防止算法通过屏蔽图表而不公平地利用图表。
使用绘图多边形
函数。指定多边形的顶点作为注册点。
chartROI = drawpolygon (“职位”, registrationPoints);
使用createMask
函数。
mask_chart=createMask(chartROI);
反转遮罩。图表中的像素从遮罩中排除,场景其余部分的像素包括在遮罩中。
mask_scene = ~ mask_chart;
要确认遮罩的准确性,请在图像上显示遮罩。遮罩中包含的像素具有蓝色色调。
imshow(labeloverlay(一个sRGB,面具场景));
在三维RGB颜色空间中,可以考虑光源作为矢量。估计光源的大小与其方向无关,因为光源的方向是用于图像白平衡的方向。
要评估估计光源的质量,请计算估计光源与地面真值之间的角度误差。角度误差是两个向量形成的角度(以度为单位)。角度误差越小,估计效果越好。
为了更好地理解角误差的概念,考虑以下的任意光源的可视化,并且使用CurrChigter图表测量地面的真实性。绘图颜色角
辅助函数在三维RGB颜色空间中绘制光源的单位向量,并在示例末尾定义。
样本_光源=[0.066 0.1262 0.0691];p=绘图3([0 1],[0 1],[0,1],“线型”,':',“颜色”,“k”);ax = p.Parent;持有在…上plotColorAngle (illuminant_groundtruth ax) plotColorAngle (sample_illuminant ax)标题(“RGB空间中的光源”)视图(28,36)图例(“消色差线”,“地面真实光源”,“样本光源”网格)在…上轴平等的
用于估计光源的白斑Retinex算法假设场景包含一个明亮的消色斑。这个补丁反射每个颜色波段的最大可能的光,这是场景光源的颜色。使用illumwhite
函数使用White Patch Retinex算法估计光照。
使用场景中的所有像素估计光源。将ColorChecker图从场景中排除“面具”
名称-值对的论点。
percentileToExclude = 0;illuminant_wp1 = illumwhite (percentileToExclude,“面具”, mask_scene);
计算白斑Retinex估计光源的角度误差。
err_wp1=色角(光源_wp1,光源_地面真相);显示(['百分位为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)标题(“使用百分位数=0的White Patch Retinex的白色平衡图像”)
当像素过度曝光时,White Patch Retinex算法的表现并不好。为了提高算法的性能,排除最亮像素的前1%。
percentileToExclude = 1;illuminant_wp2 = illumwhite (percentileToExclude,“面具”, mask_scene);
计算估计光源的角误差。误差小于用所有像素估计光源时的误差。
err_wp2=色角(发光体_wp2,发光体_地面真相);显示(['百分位为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)标题(“使用百分位数=1的White Patch Retinex的白色平衡图像”)
用于光源估计的灰色世界算法假定世界的平均颜色为灰色或无色。因此,它将场景光源计算为平均图像中的RGB值。使用illumgray
函数,使用灰色世界算法估计光照。
首先,使用图像的所有像素估计场景的光源,不包括那些与ColorChecker图表相对应的像素。的illumgray
函数提供一个参数,用于指定要排除的底部和顶部值(按亮度排序)的百分位数。此处,将百分位数指定为0。
percentileToExclude=0;光源_gw1=illumgray(A,percentileToExclude,“面具”, mask_scene);
计算估计光源与地面真实光源之间的角误差。
err_gw1=色角(发光体_gw1,发光体_地面真相);显示(['灰色世界的角度误差与百分比=[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;发光体_gw2=illumgray(A,percentileToExclude,“面具”, mask_scene);
计算估计光源的角误差。误差小于用所有像素估计光源时的误差。
err_gw2=色角(发光体_gw2,发光体_地面真相);显示(['带百分位数的灰色世界的角度误差=[1]:'num2str (err_gw2)))
灰色世界的角度误差与百分比=[1 1]:5.1094
使用估计的光源在线性RGB颜色空间中对图像进行白平衡。
B_gw2=色度适应(A,发光体_gw2,“色彩”,“linear-rgb”);
使用新光源显示经伽马校正的白色平衡图像。
B_gw2_sRGB=lin2rgb(B_gw2);imshow(B_gw2_sRGB)标题('白色平衡图像使用灰色世界与百分比=[1 1]')
Cheng的光源估计方法从空间域方法如灰色边缘中得到启发[4],它假设图像的梯度是无色的。他们表明,通过对图像块进行无序排列,人为地引入强梯度,可以改善灰色边缘,并得出结论,最强的梯度跟随光源的方向。他们的方法是根据像素沿光源方向的投影范数对像素进行排序e图像平均颜色的方向,并保留底部和顶部百分位。这两组对应于图像中的强梯度。最后,它们执行主成分分析(PCA),并返回第一个分量作为估计的光源。使用illumpca
函数,利用Cheng的主成分分析算法估计光照。
首先,使用Cheng的PCA方法的默认百分比值估计光源,不包括ColorChecker图对应的百分比值。
照明体_ch2=照明PCA(A,“面具”, mask_scene);
计算估计光源与地面真实光源之间的角误差。
err_ch2=色角(发光体_ch2,发光体_真实);显示([Cheng的角度误差百分比=3.5:num2str (err_ch2)))
百分比为3.5时的成角误差:5.0162
使用估计的光源在线性RGB颜色空间中对图像进行白平衡。
B_ch2=色度(A,光源_ch2,“色彩”,“linear-rgb”);
显示伽马校正的白平衡图像。
B_ch2_sRGB = lin2rgb (B_ch2);imshow (B_ch2_sRGB)标题(“使用百分比为3.5的Cheng的白色平衡图像”)
现在,估计场景光源使用底部和顶部5%的像素沿平均颜色的方向。第二个论点illumpca
函数指定要排除的底部和顶部值的百分位数(按亮度排序)。
illuminant_ch1 = illumpca (5“面具”, mask_scene);
计算估计光源与地面真实光源之间的角误差。误差小于使用默认百分比估计光源时的误差。
err_ch1=色角(发光体_ch1,发光体_地面真相);显示(['百分比为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)标题(“白色平衡图像使用程,百分比=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);%灰色世界光源_gw=照度灰色(A,参数范围(k),“面具”,遮罩场景);err(k,2)=颜色角度(光源gw,光源地面真相);%成如果(参数范围(k)~=0)光源(ch=illumpca)(A,参数范围(k),“面具”, mask_scene);犯错(k, 3) = colorangle (illuminant_ch illuminant_groundtruth);其他的当百分比=0时,% Cheng的算法未定义。犯错(k, 3) =南;终止终止
显示角误差的热图使用热图
函数。深蓝色表示角度误差低,而黄色表示角度误差高。最优参数的角误差最小。
热图(呃,“标题”,“角误差”,“Colormap”,parula(长度(参数范围)),...“扩展数据”,[“白色补丁”“灰色世界”“郑氏PCA”],...“伊拉贝尔”,的参数值,“伊达塔”,字符串(参数范围));
找到每种算法的最佳参数。
[~, 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.2f,角度误差为%1.2f度\n',...最佳参数wp,err(idx_最佳(1),1));
White Patch的最佳参数为0.25,角度误差为3.35度
流('灰色世界的最佳参数为%1.2f,角度误差为%1.2f度\n',...最佳参数gw,err(idx_最佳(2),2));
灰色世界的最佳参数为0.00,角度误差为5.04度
流(Cheng的最佳参数为%1.2f,角误差%1.2f°\n',...最佳参数ch,err(idx_最佳(3),3));
Cheng的最佳参数为0.50,角度误差为1.74度
使用最佳参数计算每个算法的估计照度。
best_illum_wp = illumwhite (best_param_wp,“面具”, mask_scene);best_illum_gw = illumgray (best_param_gw,“面具”,遮罩场景);最佳照明度=照明度(A,最佳参数,“面具”, mask_scene);
在RGB颜色空间中显示每种最佳光源的角度误差。
p=plot3([01],[01],[0,1],“线型”,':',“颜色”,“k”);ax = p.Parent;持有在…上plotColorAngle(发光体)plotColorAngle(最佳照明度wp,ax)plotColorAngle(最佳照明度gw,ax)plotColorAngle(最佳照明度ch,ax)标题(“RGB空间中的最佳光源”)视图(28,36)图例(“消色差线”,“地面实况”,“白色补丁”,“灰色的世界”,“程”网格)在…上轴平等的
计算最佳的白平衡图像为每个算法使用最好的光源。
B_wp_best=色度适应(A,最佳照明度,“色彩”,“linear-rgb”);B_wp_best_sRGB=lin2rgb(B_wp_best);B_gw_best=chromadapt(A,best_illum_gw,“色彩”,“linear-rgb”);B_gw_best_sRGB=lin2rgb(B_gw_best);B_ch_best=chromadapt(A,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度,在某些情况下可能会超过不同算法估计光源的角度误差。
第三,光源估计算法的充分比较应采用不同条件下拍摄的各种图像。对于特定的图像,一种算法可能比其他算法工作得更好,但在整个数据集上可能表现不佳。
的绘图颜色角
函数在三维RGB颜色空间中绘制光源的单位向量。输入参数照明
将光源指定为RGB颜色和输入参数斧头
指定要在其上打印单位向量的轴。
作用plotColorAngle(illum,ax) R = illum(1);G = illum (2);B = illum (3);magRGB =规范(illum);[0 R/magRGB],[0 G/magRGB],[0 B/magRGB],...“标记”,“。”,“MarkerSize”,10,“家长”ax)包含(“R”)伊拉贝尔(‘G’)兹拉贝尔(“B”)xlim([01])ylim([01])zlim([01])终止
[1] it,马克。白斑Retinex,颜色稳定。John Wiley & Sons, 2007。ISBN 978-0-470-05829-9。
[2] 《灰色世界假设,颜色恒常性》,约翰·威利父子出版社,2007年,ISBN 978-0-470-05829-9。
程东亮,迪利普·k·普拉萨德,迈克尔·s·布朗。《颜色恒常性的光源估计:为什么空间域方法有效以及颜色分布的作用》[j] .中国科学(d辑):地球科学(英文版)。
[4] 基于边缘的颜色恒常性〉,IEEE图像处理学报16.9(2007):2207-2214。
颜色检查器
|measureColor
|illumgray
|illumpca
|illumwhite
|lin2rgb
|rgb2lin
|chromadapt
|colorangle