色彩校正矩阵Color Correction Matrix (CCM)

简介

颜色/色调设置和自动可以从至少有9个不同色块的颜色测试图的图像中计算出一个颜色校正矩阵(CCM)。一般建议使用3×3的CCM,但也支持4×3。使用廉价的、广泛使用的24个色块的X-Rite Colorchecker,通常可以达到很好的效果。CCM可以应用于图像,以达到最佳的色彩还原效果,其定义为校正后的测试图斑与相应的参考值之间的最小平均平方色彩误差,这些参考值可以是

标准(公布的)参考值。 用分光光度计测量,或 从 “黄金标准 “图像中保存的L*a*b*值(当目的是为了匹配图像)。 默认的颜色误差参数是(ΔE 2000)2(或(ΔE 94)2的平均值,这非常相似),针对所有5≤L*≤98(其中L*在CIELAB色彩空间中定义)且每个R、G和B通道的最大值小于99%的斑块计算(即该斑块是不饱和的)。非线性优化被用来计算矩阵。

CCM可用于电影工作流程的输入设备转换(IDT),如学院色彩编码系统。当几个不同的摄像机被用来拍摄一个场景时,它可以用来实现一致的色彩。

在设置色彩矩阵计算时,非常重要的一点是,图像要适当地线性化,因为矩阵操作需要线性的R、G、B值。有几个线性化选项可用于不同的图像编码。

操作顺序 – 流程图 快速总结:从一个未经校正的颜色图的图像开始。它不需要有一个与之相关的色彩空间。原始图像效果最好。检查它的色调响应曲线以确定需要什么样的线性化,然后选择设置(包括(目标)色彩空间和参考文件)。按校正矩阵运行优化器,找到色彩误差平方之和最小的矩阵。

数学计算 矩阵 彩色图像存储在m x n x 3数组中(m行(高)x n列(宽)x 3种颜色)。为了简单起见,我们将输入的彩色图像转换为k x 3阵列,其中k = m x n。原始(未校正和线性化*输入)像素数据可表示为

此图片的alt属性为空;文件名为image.png

其中第i行的条目[],代表像素i的归一化和线性化*R、G和B水平。转化(校正)的阵列称为,它是通过与颜色校正矩阵进行矩阵乘法计算的。Imatest允许你选择两种不同形式的,即3×3或4×3。(不再推荐4×3;除非我们听到用户的意见,否则可能会被废弃)。

= (是一个3×3矩阵)

每个输出(校正)像素的R、G和B值都是该像素的三个输入颜色通道的线性组合。

*注意:这些公式假定原始(输入)阵列是图像亮度的线性表示。如果图像文件不是线性的(例如,在sRGB或Adobe RGB色彩空间中),在进入矩阵计算之前必须被线性化,之后的结果可能需要应用伽玛曲线(即被去线性化)。详见下面的线性化。

情况2(将被废弃)。 =[1](是一个4×3矩阵;通常建议使用3×3矩阵。)一列1被添加到A矩阵中,为每个颜色通道提供偏移,用41、42和43表示。这使得校正后的颜色值成为原始输入的仿射变换。

计算的目标是使和参考阵列(理想的图表值)之间的差异最小化(在某些选定的度量中,将在下文说明)。3×3和4×3情况下的(优化的起点)的初始值分别为:

其中:

=均值()/均值() =均值()/均值() =均值()/均值() 对参考数组和原始数组而言,其平均值取自所有。

颜色/色调要求每个图表类型有一个参考阵列R。(有时–例如X-Rite Colorchecker–会有不止一个)。R通常包含CIELAB(Lab*)值,可以转换为RGB或用于计算色差指标(ΔE, ΔC, …)。你可以

使用默认的(内置)参考。 输入一个参考文件,你可以通过测量图表(见测量测试图表补丁)或从网页上获得,例如,从X-Rite或Babelcolor的X-Rite Colorchecker上获得 输入一个由高质量的 “黄金标准 “图表图像的Lab值创建的参考文件,如这里所述。 在颜色/色调设置模块中,你可以按文件、复制Lab参考值到剪贴板来获得当前的参考值。右边显示的是Colorchecker的一些数值。下面是X-Rite网页上的一个小裁剪。

线性化 虽然大多数标准(非HDR)图像传感器在饱和之前都是线性的,但许多图像文件是高度非线性的。Imatest处理两大类型的图像文件。

“原始 “文件,从传感器输出转换而不应用伽玛曲线(通常很少或没有信号处理,即锐化、降噪、白平衡等),这些文件是线性的,伽玛接近于1(由于镜头闪光和传感器上的信号处理(增加基座),通常有点低于1)。RAW文件是CCM计算的首选,因为用于获得伽玛编码的可互换文件的处理会造成一些信息损失(特别是在sRGB色彩空间)。 设计为可互换的文件,并以指定的伽玛(γ)显示,其中显示亮度=像素水平γ。(代表色调响应曲线,对数亮度=γ×对数像素水平)。 这些文件通常有一个与之相关的色彩空间(可能嵌入文件中,也可能不嵌入)。最常用的色彩空间(sRGB(约2.2)和Adobe RGB(1998))的伽玛=2.2。

当相机对图像进行编码时(RAW转换过程的一部分),它们会应用一个色调响应曲线(对数像素水平与对数曝光),该曲线是显示曲线的近似倒数:斜率可能与1/γ有很大的不同,它通常在色调响应曲线中包括一个 “肩”(对比度降低的区域),以减少高光烧毁。肩部通过使响应更 “像电影 “来提高图像质量,但可能降低CCM的准确性。

CCM的计算假设任何应用在图像上的图像处理都是统一的,而且个别颜色没有饱和。在应用了局部色调映射后,无法计算出一个好的CCM。

如果输入的图像已被伽马编码,则必须在应用校正矩阵之前进行线性化。Imatest有几个线性化选项,说明如下。选项1和5-8将输入图像线性化。2-4假设输入图像是线性的。

对于5、6、9以外的线性化设置,你可以通过在Color/Tone Interactive中打开测试图表图像,然后查看B&W密度显示(对数像素水平与对数曝光),找到确定线性化设置(如下所述)所需的信息,如右图。

这条特殊的曲线的伽玛值(平均斜率)为0.547,有一个响应的 “肩”。在CCM计算中效果更好的原始文件,通常有一个接近1的斜率(gamma),没有肩部。

一个合理的(但远非完美的)线性化设置是7.使用gamma对输入进行线性化…,gamma在线性化设置下拉菜单的方框中设置为0.55。使用设置5或9可以获得更好的结果,它们不对伽马进行假设:它们从图像中的灰度斑块测量它。对于RAW图像来说,5就足够了(伽马值接近1)。

优化步骤
在色彩/色调(设置或自动)中打开要用来计算CCM的图像。
选择设置,其中大部分位于 “设置 “窗口。
输入图像的色调响应(包括伽玛)(如上框所示)被用来确定适当的线性化选项。如果选择了色彩空间伽玛线性化,OL = Ogamma。(其中伽玛(γ)是由色彩空间指定的,例如,Adobe RGB为1/2.2)。
确保在颜色/色调窗口中选择了正确的颜色空间和参考文件。
按 “校正矩阵 “按钮调用优化器。
计算一个(临时)校正的图像TL = OL A。
(可选择)删除线性化。T = TL(1/γ),使用色彩空间伽玛(γ)。
为每个补丁找到T(转换为CIELAB,即L*a*b*值)和参考(理想)阵列R之间的颜色误差度量。在 “优化 “下拉菜单中选择的颜色误差度量,是标准的颜色误差度量之一。ΔE*ab, ΔC*ab, ΔE94, ΔE94, ΔECMC, ΔCCMC, ΔE00, 或 ΔC00,在此说明。ΔE00(CIEDE2000)或ΔE94是推荐的选择。[在我们为a*b*显示添加色差椭圆之前,我们担心ΔE00可能包含小的不连续点,会影响优化。] ΔC误差类似于省略了亮度(L*)的ΔE。不推荐使用它们,因为L*a*b*色彩空间的色度(a*和b*)和亮度(L*)分量之间存在相互影响,当选择其中一个ΔC值时,色度实际上不太准确。
调整A,直到找到误差指标平方之和的最小值(通常是∑(ΔE00)2或∑(ΔE00)2,对于5≤L*≤98的斑块,使用非线性优化。
报告A的最终值。
在应用A时(一般在Imatest之外),应使用类似的线性化。在RAW转换过程中,在应用伽马+色调响应曲线之前,可以不使用线性化来应用A。

不能保证A是一个全局最小值。它的最终值在一定程度上取决于它的起始值。

颜色/色调中的颜色校正矩阵
1. 选项。颜色矩阵计算选项可以通过点击颜色/色调设置窗口中的设置、颜色矩阵或按设置窗口中的颜色矩阵、ISO速度、mxn图表设置按钮来设置。这将弹出如下所示的对话框。这些选项是color_matrix_settings2 (4×3或3×3)矩阵。颜色校正矩阵的大小。一般推荐3×3。4×3矩阵包括一个dc-offset(常数)项,会减慢计算速度,而且很少能改善结果。
2. 优化。选择颜色误差参数,其在L*>10的斑块上的方差平均值要最小化(95的斑块接近黑色)。选择包括ΔE ab, ΔC ab, ΔE 94, ΔE 94, ΔE CMC, ΔC CMC, ΔE 00, 和 ΔC 00, 在此说明。推荐使用ΔE 94或ΔE 2000,因为它们对高色度(饱和;大a*2+b*2)颜色之间的色度差异给予较少的权重,也就是说,它们比ΔE ab(标准的ΔE计算:L*a*b*空间中颜色之间的几何距离)更接近于眼睛的感觉。
3. 加权。设置用于优化的斑块的权重。

4. 选择。
① 同等权重 [默认] 补丁的权重相同。可能不是最佳设置,因为高光色可能比阴影色在视觉上更突出。
② 强调高光:根据CIELAB L*的权重,给视觉上突出的高光斑块更多的权重。这是默认的。
③ 强烈强调高光:根据L*^2的权重。
④ 从CSV文件中读取权重 如果选择了,复制权重、浏览和文件框就会被激活。CSV文件中的权重数量应与图表中的斑点相同(通常在0到1的范围内)。该文件可以是每行一个值,也可以是n行的m个值,只要m*n=图表中的斑块数。

下面是一个140块(10行x14列)Colorchecker SG的权重例子

0,0,0,0,0,0,0,0,0,0,0,0,0,1
0,0,0,0,0,0,2,0,1,1,0,0,0,0
1,0,0,0,1,1,3,0,1,1,0,0,0,0
0,1,0,0,0,0,0,1,0,1,0,1,1,0
0,0,1,0,0,1,1,0,1,1,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,1,0,0,0,0,0,0,0
0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,1,0,0,0,0,1,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0

当输入权重文件并计算出CCM后,按数字复选框(在颜色/色调窗口的右边),可同时显示补丁号(显示SG的Colorchecker 24副本部分)和权重。这可以帮助验证是否输入了正确的权重。

5. 线性化。
在计算矩阵之前,选择对图像进行线性化的方法。对于大多数设置(除了5、6和9),你需要知道输入图像的色调响应(编码),它可以是线性的(典型的原始图像),伽马编码(使用手动输入的伽马(γ)或选定的色彩空间(sRGB、Adobe RGB等)的伽马),或对数编码。响应可以从图表中灰度部分的黑白密度图中获得。伽玛编码色彩空间的线性化方程是OL=O1/γ。伽玛编码的方程式(在CCM计算后)是O = OLγ。
对于设置5、6和9,你不需要知道图像是如何被编码的。线性化参数是通过使用Matlab的polyfit和polyval函数对灰度数据进行多项式拟合来确定的(对于设置5和6的灰度修补水平L或对于设置9的log10(L))。

设置 描述 线性化公式: Linear level =
1.线性化输入(CS伽马),应用矩阵,然后应用CS伽马编码 对于用标准色彩空间(CS)编码的图像来说,这是一个合理的选择。 input1/(CS gamma)
2.无线性化:将矩阵应用于输入像素 用于实验和开始并保持线性的图像。不适用于伽马编码的图像。 input
3.假设线性输入,应用矩阵,然后应用CS伽马编码 对于没有经过伽马编码(接近线性),但需要转换到色彩空间的图像。在将输入的RGB图像转换为Lab*时,不应用颜色空间(CS)伽玛。 input
4.假设线性输入和输出(gamma=1,贯穿始终)。 没有线性化或伽马编码。在RGB和Lab*空间之间转换时不应用色彩空间伽马。(与2相同) input
5.线性化输入(数据拟合),应用矩阵,应用CS伽马编码(相当准确)。 用三阶多项式拟合P(Matlab的polyfit函数)对灰度贴片像素水平L进行线性化处理,计算CCM,然后用色彩空间伽玛编码。这通常能得到很好的结果。 polyval(P,input), where P is a third-order polynomial fit to L
6. 线性化输入(数据拟合),应用矩阵,然后去线性化(数据拟合)。 与5相同,只是在优化后,图像会恢复到原始色调曲线。 同 5.
7.使用伽玛对输入进行线性化(如下),应用矩阵,然后应用CS伽玛编码 手动输入伽玛,如果色图有灰度模式,可以从黑白密度图中获得。在测量的伽玛与预期的色彩空间伽玛或1(用于线性原始转换)不同的频繁情况下,这可以产生很好的效果。当输入图像的伽玛与标准色彩空间伽玛(通常为1/2.2)或线性(1)不同时,这一设置特别有用。 input1/gamma
8.使用对数斜率进行线性化(用于对数色彩空间,如下),应用矩阵,然后进行伽马编码(CS)。 对于对数色彩空间(有时用于电影;从未用于静止摄影),其特点是近似的编码方程,O = max(1+A log10(OL), 0)和逆向(用于线性化)OL = 10^((O-1)/A)。A是对数斜率,显示在颜色/色调互动模块的黑白密度和白平衡显示中。当选择Pixels vs. Input Density(4.0中的新选项)时,对数编码的色彩空间有近似的直线响应,而当选择更传统的Log(Pixels) vs. Input Density选项时,伽玛编码的空间有近似的直线响应。  
9.线性化(伽马多项式数据拟合),应用矩阵,应用CS伽马编码。 使用三阶多项式拟合P对灰度斑块水平L的对数10进行线性化,计算CCM,然后用色彩空间伽玛编码。这是对伽玛编码的多项式修改。推荐的原因是:(A)它不需要输入图像编码的知识;(B)它为各种图像提供最准确的结果。 polyval(P,log10(input)), where P is a third-order polynomial fit to log10(L). 

注意:对于Rec.709色彩空间,它的允许值在16和235之间(255),线性化将16-235映射到完整的0-1(内部)范围,而去线性化将0-1映射回16-235。图像显示的是全范围。

伽玛(仅对线性化设置7:使用输入伽玛进行线性化…启用)。手动输入从灰度阶梯图测得的伽玛值(大多数色彩图中都有,并显示在黑白密度图中)。
色度乘数(供参考) 通常为1,增加它以获得更多的饱和度;减少它以获得更少的饱和度。有时将它增加到1.05甚至1.1,效果会更好。
优化的约束条件
没有约束。这是默认的,只有在有充分理由的情况下才可以改变。
行的总和为1。
这可以保持白平衡。
计算细节 有两种计算方式:(1)直接从RGBin到RGBout,和(2)从RGBin到XYZ(间接到RGBout)。两者都使用一个优化器:它们从第一个猜测开始,然后优化器调整数值,直到找到选定误差度量的最小值。
直接计算RGB矩阵(原始算法) 从猜测RGBin到RGBout矩阵开始,然后从RGBout找到L*a*b*out。在优化器的控制下调整矩阵,使颜色误差(L*a*b*out和参考值之间的误差(如果≠1,则由色度乘数调整)达到最小。
计算XYZ矩阵和xy原色(较新的算法) 从粗略猜测RGBin到XYZ矩阵开始(使用sRGB系数)。然后将XYZ转换为L*a*b*,并在优化器的控制下调整矩阵,直到选定的误差指标达到最小。优化完成后,将XYZ转换为RGBout。RGB到XYZ和RGB到RGB矩阵都会被计算出来并包含在CSV和JSON输出文件中。
参考文件(在颜色/色调交互窗口;不在颜色矩阵窗口) 参考文件包含理想的图表L*a*b*值,用于优化。通常情况下,它包含用色度测量的图表斑块的L*a*b*值。默认值总是如此,参考文件通常也是如此,但如果需要特殊的 “外观”,参考文件可以包含不同的值,如下面的匹配图像中所述。

匹配图像–使用 “黄金标准 “图像

如果你有一个具有高质量色彩的图像(通常称为 “黄金标准”),你想把它作为计算CCM的参考(目标),以便其他图像尽可能地与之匹配,你可以在 “颜色/色调交互 “窗口中点击 “文件,将Lab结果保存为CSV参考”,将其Lab值保存在一个命名的文件中。然后,你可以通过点击Ref(参考文件)框,选择LAB数据文件,并选择保存的文件,将这个文件作为参考文件。

使用黄金标准Lab值作为合格/不合格标准有一个微妙但重要的优势。由于复杂的原因(因为作为Lab色彩空间基础的人眼与相机的反应不同),三色性图像永远不可能完全匹配理想的Lab值:最小平均ΔE2000通常在3左右。但与黄金标准Lab值的精确匹配是可以实现的。这使得色差指标成为色彩匹配的更好指标。

采集测试图的图像,如果可能的话,注意避免任何斑块的饱和。如果斑块是饱和的,也就是说,如果任何通道的平均像素水平超过比特深度最大值的99%(例如,比特深度=8时为255;比特深度=16时为65535),它们将被从优化中省略,在分割视图中被标记为Sat。当一个补丁是饱和的时候,视觉上可能并不明显,特别是如果三个通道中只有一个是饱和的(如下图所示)。在应用矩阵时,饱和的补丁往往看起来非常奇怪(见下文)。(这似乎是一个错误,但它不是,下面会解释)。

饱和度
一张有饱和补丁的图像(第4行,左边)显示在右边。这并不明显,因为只有绿色通道是饱和的。这从下图的密度响应曲线(来自Color/Tone Interactive或Color/Tone Auto)可以看出:绿色通道在最大曝光量时是饱和的,绿色曲线的斜率正好在最大曝光量之下下降。
由于这个原因,绿色通道的像素水平(相对于其他斑块)比它没有饱和时要低。
此图片的alt属性为空;文件名为colorchecker_saturated_small.jpg此图片的alt属性为空;文件名为colorchecker_saturated_density.png
左下角的饱和斑块的修正值(显示在底部–它是品红色的!)是不正确的,因为饱和的绿色通道比该斑块没有饱和时的值要低。 此图片的alt属性为空;文件名为colorchecker_saturated_corrected.jpg
注意:饱和的斑块不包括在矩阵计算中。虽然我们建议避免它们,但它们不会对计算出的矩阵产生重大影响。
Imatest如何处理饱和像素(在Imatest 5.0+中)当输入文件中的R、G或B像素是饱和的(在归一化数据中的值为1),在应用矩阵后,它将保持在饱和值,也就是说,矩阵不应用于饱和(R、G或B)的像素。这个功能是由下面的示例代码中的一行完成的。
correctedRGB(linearRGB==1)=1。
右边的图片显示了这个修正的结果。左下角水瓶上的青色高光是未经校正的饱和度的结果。
CCM已经应用到下面的图片上了。
左边没有饱和度校正;右边是校正过的。
类似的程序也适用于相机。它不能(也不可能)在饱和区域的边界处提供完美的结果,这些区域经常显示 “紫边”。(维基百科上的解释是不正确的)
此图片的alt属性为空;文件名为671f5d24-891b-4784-9a40-b2169eea6add

要计算颜色校正矩阵。

从黑白密度显示中的密度响应曲线确定线性化设置。

颜色校正(矩阵计算)按钮
用色彩/色调设置或色彩/色调自动打开图像。

设置颜色矩阵设置,特别注意线性化,它应该与黑白密度显示一致。

选择参考文件,该文件包含用于颜色校正的目标值。大多数时候使用的是标准的默认值,但你也可以输入一个由分光光度计测量结果创建的参考文件,或者通过保存一个好的(”黄金标准”)图像的Lab*值。

按下校正矩阵按钮,如右图所示。显示将发生变化,如下图所示。理想(参考)颜色保持在每个补丁的左上方,输入颜色保持在右上方,而修正后的颜色现在显示在底部。输入的图像(来自我们的档案)有相对较差的白平衡。改进是相当显著的。

分割视图,显示参考、输入和修正的补丁颜色。显示的下拉菜单是
显示输入(在右边)可以改为显示校正,以获得[校正-理想]的统计数据。

校正矩阵按钮变为计算的矩阵,以粉红色背景突出显示。在图像属性发生变化(新图像、色彩空间、参考文件或色彩矩阵设置)之前,修正矩阵不能被重新计算。紧挨着它左边的显示输入(或校正)下拉菜单被启用。你可以从两个选择中选择一个。

显示输入 色差(输入-理想)显示在大多数显示器中,[输入-理想]色差显示在左下方的文本中。有两种显示器不受此设置的影响。Pseudocolor色差和Split colors,其中(校正的-理想的)显示在底部。

显示校正的     

色差(校正的-理想的)显示在大多数显示器中,[校正的-理想的]色差显示在左下方的文本中。以下是上述情况的校正色差。

EXIF数据和色彩矩阵显示包含了结果的摘要。

显示了颜色校正矩阵、结果总结以及[输入-理想]和[校正-理想]的色差总结。初始和最终的误差数字显示了所选择的指标(在这种情况下,所有L*>10和L*的斑块的Delta-E 94的平方之和)有多大。

RAW图像结果
下面是一个对原始图像进行颜色矩阵优化的例子。原始图像是以原始(RW2)图像的形式从松下GF1微四三(无反光镜可换镜头)相机上获取的(也获取了JPEG图像作为参考),并使用dcraw进行转换,设置为手动,正常RAW转换,输出伽马=1.0(线性),自动白电平关闭(未勾选),白平衡=无,输出色彩空间=RAW。这些设置除了去马赛克之外没有应用任何图像处理。

该文件几乎是完美的线性:色调响应曲线是一条直线,伽玛=1.01。选择了线性化选项3(假设线性输入,应用矩阵,然后应用CS伽马编码。)。

输出几乎是完美的;对于一个三色传感器来说,这已经是最好的了。这是典型的你可能期望从特征明确的原始图像中得到的结果。我们最近(2014年5月)用四台有RAW输出的相机(松下Lumix LX7和G3,佳能EOS-6D和尼康D800E)在六个不同的照明条件下(2700K和5000K LED,3500K和5000K CFL,标准(2700K)白炽灯,和4700K(测量4000K)SoLux(二色性过滤)卤素灯)测试了该计算,我们取得了明显一致的色彩校正图像。

来自线性原始文件的结果(伽马=1;没有颜色校正)。

x,y和X,Y Z原色 从Imatest 4.0开始,Color/Tone Interactive和Color/Tone可以计算输入(相机)色彩空间的x,y和X,Y Z原色,显示它们(右侧底部三行),并将其保存在CSV和JSON输出文件中。当输入的图像是线性的(从原始图像转换而没有伽玛曲线)或在ACES色彩空间时,这种计算方法效果最好。它对计算信号处理系数很有用。请注意,x,y基色与相机的色域无关。这些基色是对应于R,G,B = {max,0,0}, {0,max,0}, [0,0,max]的x和y值,由于传感器中的颜色串扰,这些值在实践中是无法实现的,而且往往在真实颜色的光谱区域之外。

色差(ΔExx和ΔCxx)能有多好?

它们不可能是完美的,因为三色(三色)相机中的彩色滤光片的光谱(大约是红、绿、蓝;RGB),与人眼的滤光片(大约是黄-橙、绿、蓝)不同。照相机不复制人眼,因为颜色必须转化为RGB才能得到良好的色彩再现,而这将严重降低信噪比(SNR)。

上述例子中的数字,ΔEab ≅ 5和ΔE94和5 ΔE00 ≅ 3,是我们所见过的三色相机(包括所有标准彩色相机)中最好的。我们唯一见过的更好的一次,即ΔExx<1,是用至少有七个频道的多光谱相机。

从颜色/色调互动中保存矩阵
要把矩阵保存到文件(CSV格式),点击文件,把颜色矩阵保存到文件,然后选择文件名。

可以通过点击文件,复制颜色矩阵到剪贴板,将矩阵复制到剪贴板。剪贴板上的内容可以粘贴到图像处理模块中的设置CCM窗口。

当你按下 “颜色/色调交互 “窗口底部的 “保存数据 “时,矩阵会被包含在CSV输出文件中(默认存储在图像文件文件夹的子文件夹Results中)。

CSV文件色彩校正矩阵

应用矩阵–对图像进行色彩校正
一旦在色彩/色调互动中计算出CCM,该矩阵就可用于校正任意图像。我们描述了三种方法。

1. 在色彩/色调互动中应用矩阵
在计算出CCM后,选择13. 在Color/Tone Interactive窗口右侧的显示框中,读取-颜色校正-保存图像。

左边的初始显示包含信息,按 “读取图像进行校正”,然后按 “保存校正后的图像”,如果看起来没问题。你可以按 “读取图像进行纠正 “或 “纠正当前图像”。

在右边的例子中,一个(数字)CC20C(青色)过滤器被应用于Colorchecker和Gallery的图像。滤镜后的Colorchecker图像的颜色校正矩阵被计算出来,然后是13。读取 – 颜色校正…被选中。滤过的画廊图像被读入,并立即使用CCM进行校正。未校正和已校正的图像分别显示在右上方和右下方。

保存校正后的图像可以保存校正后的图像。Multicharts_Vectorscope预览,这种方法只适用于单个图像,而不是成批的。

未校正的和已校正的图像

2. 在Imatest图像处理模块中应用矩阵
在Imatest 5.0+中,图像处理模块可用于将色彩校正矩阵(如上所述,从色彩/色调互动中保存为CSV文件)应用于单个图像或成批的图像。要这样做,请勾选图像处理窗口左边的CCM(颜色矩阵)复选框。矩阵会在高度非线性的色调映射和双边滤镜操作之前应用。

可以通过点击复选框右侧的设置CCM按钮来输入或查看CCM设置。关键设置包括线性化(如上所述)、色彩空间、输入伽玛(用于一个线性化设置)和矩阵乘数(可使图像变亮或变暗;通常留为1)。

图像处理的CCM设置

图像处理可以对成批的图像进行操作,只需选择多个图像而不是单个图像。如果选择了一批图像,名为root_file_name.ext的文件将被自动保存为root_file_name-ext-improc.png。

3. 用Matlab代码在外部应用矩阵

可以在Imatest之外应用CCM。我们展示了一个使用Matlab的例子,说明如何应用矩阵。如果你有Matlab,你可以试试这个方法(如果你没有,也可以把它转换成其他语言,如C或Python)。

右图所示的未校正的24个补丁的Colorchecker图像被用作颜色校正矩阵计算的输入。它来自于原始图像,被转换为没有色彩校正的JPEG文件,然后被缩小。你可以点击(或右击)它来下载它。

该图像被读入Color/Tone Interactive,然后用以下设置进行色彩校正。

优化:Delta-E 00
线性化: 假设线性输入,应用矩阵,然后应用色彩空间伽玛编码。
加权:2.强调高光
色度乘数: 1.06
计算XYZ矩阵…

下面是校正的结果。修正后的颜色非常准确,比我们将矩阵应用于已经处理过的图像时通常得到的要好(ΔEab平均值=5.32;ΔE00平均值=3.11)。

此图片的alt属性为空;文件名为Colorcheck_1_raw_1004W.jpg 此图片的alt属性为空;文件名为Colorcheck_1_corrected_display-300x232-1.jpg
未校正的图和校正后的图

颜色校正矩阵是通过点击文件、复制颜色矩阵到剪贴板,然后直接粘贴到本页获得的。如果需要,你可以从这个页面上复制它。

1.48663 -0.192007 0.033443
-0.612018 2.03673 -0.796356
-0.367863 -0.580001 3.04927

颜色检查_1_更正后的显示

将CCM应用于图像文件的程序在下面的方框中。它在2020年7月进行了更新,使其更容易运行–有一个简单的图形用户界面。涉及可变修正RGB的核心计算,可以作为开发自定义代码的模板。

要将程序加载到您的系统中,请选择方框中的文本,将其复制到剪贴板(control-C),粘贴到Matlab(或其他)编辑器中,然后保存为一个m文件(ccm_test.m)。

在你运行 ccm_test 之前,你应该使用颜色/色调模块计算一个 CCM。如果你没有自己的图像来测试,可以下载未经校正的图像(上图),并将3×3的CCM(也是上图)复制到剪贴板上。

要从Matlab命令窗口运行ccm_test。

  1. 如果可能的话,将CCM复制到剪贴板中(使用颜色/色调模块中的文件下拉菜单或文本文件中的Control-C)。你可以在浏览器窗口中选择3×3的CCM文本(上面),然后复制它(Control-C)。
  2. 输入ccm_test
  3. 一个带有基本说明的窗口打开。点击确定。
  4. 一个狭窄的窗口打开,
    • 你可以输入伽玛值(1代表未校正的文件(上图):你可以从色彩/色调互动的密度图中得出伽玛值)。
    • 输入CCM(如果你从剪贴板上粘贴它,则最简单)。
  5. 打开一个窗口,让你浏览到图像文件并打开它。
  6. 修正后的图像会出现。如果你愿意,你可以保存它。
    右边显示的是一个输出图像(上述输入图像,经过校正)。

function ccm_test
% Test program for applying Color Correction matrix.
% Output for display gamma = 2.2 — sRGB and Adobe RGB color spaces.
close all;
uiwait(msgbox([‘We recommend that you calculate the Color Correction Matrix (CCM),’ newline …
‘and copy it to the clipboard before running ccm_test.’ newline …
‘After you click OK, two input dialog boxes will open.’ newline …
‘1. a narrow box for entering the encoding gamma and entering or pasting the CCM.’ newline …
‘2. A box for browsing and opening the image file to be corrected by the CCM.’], …
‘ccm_test instructions’));
answer = inputdlg({‘Enter encoding gamma (typically 0.5-1)’; ‘Paste or enter the 3×3 CCM into this box’}, …
‘Enter gamma and CCM’, [1 20; 3 20]);
gamma = str2num(answer{1}); %#ok
ccmnum = str2num(answer{2}); %#ok’
szcc = size(ccmnum);
if isempty(answer{1}) || gamma<.01 || gamma>10
disp(‘gamma is invalid or empty — try again.’); return;
end
if isempty(answer{2}) || szcc(1)<3 || szcc(1)>4 || szcc(2)<3 || szcc(2)>4
disp(‘CCM is empty or badly-sized– try again.’); return;
end
[im,path] = uigetfile(‘.‘,’Enter the image file to be corrected by the CCM’); % Find image file
imagefile = fullfile(path,im);
if im==0 | isempty(path) | isempty(im), return; end %#ok
imageRGB = imread(imagefile); % Read the image file.
imtype = class(imageRGB); % Image type: typically uint8 or uint16.
imageRGB = double(imageRGB)/double(intmax(imtype)); % Normalize to maximum for image type.
figure; image(imageRGB);
title([‘Original image: gamma = ‘ num2str(gamma)]); % Works without Image Processing Toolbox.
linearRGB = imageRGB.^(1/gamma); % Linearize the image (apply inverse of encoding gamma).
% Change to 2D to apply matrix; then change back.
[my, mx, mc] = size(linearRGB); % rows, columns, colors (3)
linearRGB = reshape(linearRGB,mymx,mc); correctedRGB = linearRGBccmnum;
correctedRGB = min(correctedRGB,1); correctedRGB = max(correctedRGB,0); % Place limits on output.
correctedRGB = correctedRGB.^(1/2.2); % Apply gamma for sRGB, Adobe RGB color space.
% Deal with saturated pixels. Not perfect, but this is what cameras do. Related to “purple fringing”.
correctedRGB(linearRGB==1) = 1; % Don’t change saturated pixels. (We don’t know HOW saturated.)
correctedRGB = reshape(correctedRGB, my, mx, mc);
figure; image(correctedRGB); title(‘Corrected image’);
tosave = questdlg(‘Do you want to save the corrected image?’,’Save the corrected image?’, ‘Yes’,’No’,’No’);
if strcmpi(tosave,’Yes’)
[path,imroot,ext] = fileparts(imagefile);
imsave = [imroot ‘-CCM-corr’ ext];
sfile = fullfile(path,imsave);
[savef, savepath] = uiputfile(fullfile(path,’.‘), …
‘Enter a file name to save the CCM-corrected results; empty otherwise’, sfile);
savefile = fullfile(savepath,savef);
imwrite(correctedRGB, savefile);
disp([‘Results written to ‘ savefile]);
end

链接
计算的一些背景可以在Stephen Wolf的《数字静态和视频成像系统的色彩校正矩阵》中找到,尽管Imatest的计算在许多方面有所不同:没有离群值的问题,优化是使用标准色差指标之一进行的。

Was this helpful?

5 / 1

http://xzh.i3geek.com
发表回复 0