▶介绍
“颜色/色调交互式”和“自动”功能可以根据至少包含 9 个不同色块的色卡图像计算颜色校正矩阵 (CCM) 。通常建议使用 3x3 CCM,但也支持 4x3。使用价格低廉且广泛使用的24 色块 X-Rite Colorchecker通常可以获得出色的校正效果。CCM 可应用于图像以实现最佳色彩还原,最佳色彩还原定义为校正后的色块与相应参考值之间的最小均方色差。
- 标准(已公布的)参考值,
- 用分光光度计测量,或
- 从“黄金标准”图像中保存 L*a*b* 值(当目的是匹配图像时)。
默认颜色误差参数是 ( ΔE<sub>2000</sub> ) <sup>2 </sup>(或 ( ΔE<sub>94</sub> ) <sup>2</sup> ,两者非常相似)的平均值,计算对象为所有满足 5 ≤ L * ≤ 98(其中L * 定义于CIELAB 色彩空间)且 R、G 和 B 通道的亮度均小于最大值 99% 的色块(即色块未饱和)。该矩阵的计算采用非线性优化方法。
CCM 可用于电影工作流程中的输入设备转换 (IDT),例如学院色彩编码系统。当使用多台不同的摄像机拍摄同一场景时,它可用于实现色彩一致性。
在设置颜色矩阵计算时,图像的正确线性化至关重要,因为矩阵运算需要线性的 R、G、B 值。针对不同的图像编码,有多种线性化选项可供选择。
操作顺序——流程图
简要说明:首先准备一张未经校正的色卡图像。该图像无需关联任何色彩空间。RAW 格式图像效果最佳。检查其色调响应曲线,确定所需的线性化程度,然后选择设置(包括目标色彩空间和参考文件)。点击“校正矩阵”按钮,运行优化器,找到颜色误差平方和最小的矩阵。

数学矩阵彩色图像存储在m × n × 3 的数组中( m行(高度) × n列(宽度) × 3 种颜色)。为简单起见,我们将输入的彩色图像转换为k × 3 的数组,其中k = m × n 。原始(未经校正和线性化的*输入)像素数据可以表示为 其中第i行的条目,分别表示像素i的归一化和线性化*后的 R、G 和 B 值。变换(校正)后的数组称为这是通过矩阵乘法计算得出的。 颜色校正矩阵, Imatest 允许您选择两种不同的形式可以是 3x3 或 4x3。(不再推荐使用 4x3;除非收到用户反馈,否则可能会弃用。) ( (是一个 3 x 3 矩阵) 每个输出(校正后)像素的 R、G 和 B 值都是该像素三个输入颜色通道的线性组合。
计算的目标是最小化以下两者之间的差异(以下面描述的某种选定指标衡量):以及参考数组(理想的图表值)初始值为(优化的起点)对于 3 x 3 和 4 x 3 的情况分别为: 在哪里 参考数组和原始数组其中平均值是对所有情况取的。 。 |
Color/Tone requires a reference array R for each chart type. (Sometimes— for example with the X-Rite Colorchecker— more than one is available). R typically contains CIELAB (L*a*b*) values, which can be converted to RGB or used to calculate the color difference metric (ΔE, ΔC, ...). You can
- use the default (built-in) reference,
- enter a reference file that you can obtain by measuring the chart (see Measuring test chart patches) or from a web page, for example, from X-Rite or Babelcolor for the X-Rite Colorchecker
- enter a reference file created from the L*a*b* values of a high quality "gold standard" chart image, as described here.
In the Color/Tone Interactive module, you can press File, Copy L*a*b* reference to clipboard to get the current reference values. A few values for the Colorchecker are shown on the right. A small crop from the X-Rite page is shown below.
37.31 13.39 14.58 64.37 18.05 17.05 49.62 -1.162 -22.16 43.35 -14.62 22.86 55.18 12.16 -24.57 70.67 -31.91 0.08472 62.11 33.4 55.77 40.05 16.27 -44.37 50.06 48.12 15.6 30.21 24.4 -20.88 71.52 -28.38 58.85 70.96 14.79 67.25 29.15 21.68 -48.74 54.35 -42.65 32.87 41.82 50.35 27.36 (24 rows total)
线性化
虽然大多数标准(非HDR)图像传感器在饱和之前都是线性的,但许多图像文件具有高度非线性。Imatest 处理两种主要类型的图像文件。
- “RAW”文件是从传感器输出转换而来,未经伽马曲线校正(通常也几乎不进行信号处理,例如锐化、降噪、白平衡等)。这些文件呈线性关系,伽马值接近1(由于镜头光晕和传感器信号处理(添加基座)的影响,通常略低于1)。CCM计算首选RAW文件,因为用于获得伽马编码的可互换文件的处理过程可能会造成一些信息损失(尤其是在sRGB色彩空间下)。
- 设计为可互换且以指定的伽玛值 ( γ ) 显示的文件,其中显示亮度 =像素级别γ 。(表示为色调响应曲线,对数亮度= γ × 对数像素级别)。
这些文件通常都关联着一个色彩空间(该色彩空间可能嵌入在文件中,也可能没有嵌入)。最常用的色彩空间(sRGB(约 2.2)和 Adobe RGB(1998))的 Gamma 值为 2.2。
相机在对图像进行编码(RAW转换过程的一部分)时,会应用一条色调响应曲线(像素值对数与曝光量的对数关系),该曲线近似于显示曲线的反比:斜率可能与1/ γ有较大差异,并且通常在色调响应曲线中包含一个“肩部”(对比度降低的区域),以最大限度地减少高光过曝。肩部通过使响应更“胶片化”来提高图像质量,但可能会降低对比度补偿(CCM)的精度。
| CCM 计算的前提是应用于图像的任何图像处理都是均匀的,并且各个颜色均未饱和。应用局部色调映射后,无法计算出良好的 CCM 值。 |
如果输入图像经过伽马编码,则在应用校正矩阵之前必须对其进行线性化。Imatest 提供了几种线性化选项,如下所述。选项 1 和 5-8 对输入图像进行线性化。选项2-4 假设输入图像是线性的。
这条曲线的伽玛值(平均斜率)为 0.547,并且有一个响应“肩部”。原始文件(更适合 CCM 计算)的斜率(伽玛值)通常接近 1,并且没有肩部。 一个合理的(但远非完美的)线性化设置是 7。使用伽马值线性化输入……在线性化设置下拉菜单下方的框中将伽马值设置为 0.55。使用设置 5 或 9 可以获得更好的结果,因为这两个设置不对伽马值做任何假设:它们直接从图像中的灰度块测量伽马值。对于伽马值接近 1 的 RAW 图像,设置 5 就足够了。 |
优化步骤
- 打开用于计算颜色/色调CCM 的图像(交互式或自动)。
- 选择设置,其中大部分设置位于“设置”窗口中。
输入图像的色调响应(包括伽玛值)(如上图所示)用于确定合适的线性化选项。如果选择颜色空间伽玛线性化,则OL = OL γ 。(其中伽玛 ( γ ) 由颜色空间指定,例如 Adobe RGB 为 1/2.2)。
请确保在“颜色/色调”窗口中选择了正确的颜色空间和参考文件。 - 按下校正矩阵按钮即可调用优化器,
- 计算(临时)校正图像T L = O L A 。
- (可选)移除线性化:使用颜色空间 gamma ( γ ) 的T = T L (1/γ ) 。
- 计算每个色块的T (转换为 CIELAB 值,即 L*a*b* 值)与参考(理想)色块R之间的颜色误差。颜色误差指标在“优化”下拉菜单中选择,是以下标准颜色误差测量方法之一:ΔE* ab 、ΔC* ab 、 ΔE94 、 ΔE94 、 ΔECMC 、 ΔCCMC 、 ΔE00或ΔC00 (详见此处) 。ΔE00 (CIEDE2000) 或ΔE94 推荐选项为:[在为 a*b* 显示添加色差椭圆之前,我们担心 ΔE 00可能包含一些小的不连续性,从而影响优化。] ΔC 误差与 ΔE 类似,只是省略了亮度 ( L *) 分量。不建议使用 ΔC,因为 L*a*b* 色彩空间的色度 ( a * 和b *) 分量与亮度 ( L *) 分量之间存在相互作用,选择 ΔC 值时,色度实际上会降低精度。
- 使用非线性优化,调整A直到找到误差度量平方和的最小值(通常是 ∑(ΔE 00 ) 2或 ∑(ΔE 00 ) 2 ,对于 5 ≤ L * ≤ 98 的补丁)。
- 报告A的最终值。
在应用A 时(通常在Imatest之外),应使用类似的线性化方法。A也可以在 RAW 转换过程中应用,无需线性化,在应用伽马曲线和色调响应曲线之前即可。
不能保证A是全局最小值。它的最终值在一定程度上取决于它的初始值。
颜色/色调中的颜色校正矩阵
选项:您可以通过在“颜色/色调交互”窗口中单击“设置” > “颜色矩阵” ,或在设置窗口中单击按钮来设置颜色矩阵计算选项。这将打开如下所示的对话框。选项如下:
-
4x3 或 3x3 矩阵:颜色校正矩阵的大小。通常建议使用 3x3 矩阵。4x3 矩阵包含一个直流偏移(常数)项,这会降低计算速度,而且很少能改善结果。 - 优化:选择颜色误差参数,使其在 L*>10(L*95 接近黑色)的色块上的均方值最小化。可选参数包括 ΔE<sub>ab</sub>、ΔC<sub>ab</sub>、ΔE<sub>94</sub>、ΔE<sub>94</sub>、ΔE<sub>CMC</sub>、ΔC<sub>CMC</sub>、ΔE<sub>00</sub> 和 ΔC<sub>00</sub>,详见此处。建议使用 ΔE<sub>94</sub> 或 ΔE<sub>2000</sub>,因为它们对高饱和度(饱和度高;a*<sup> 2 </sup> + b*<sup> 2 </sup> 值大)颜色之间的色度差异赋予的权重较低,也就是说,它们比 ΔE<sub>ab</sub>(标准 ΔE 计算:L*a*b* 空间中颜色之间的几何距离)更接近人眼的感知。
- 权重:设置用于优化的各个补丁的权重。选项:
- 1. 等权重[默认] 所有色块权重相等。这可能不是最佳设置,因为高光颜色在视觉上可能比阴影颜色更突出。
- 2. 强调高光:根据 CIELAB L* 值赋予权重。赋予视觉上显著的高光区域更高的权重。这是默认设置。
- 3. 重点突出高光:根据 L*^2 加权。
- 4.从 CSV 文件读取权重如果选中此项,则会激活“复制权重”、“浏览”和“文件”复选框。CSV 文件中的权重数量(通常在 0 到 1 之间)应与图表中的色块数量相同。文件可以每行一个值,也可以每行m个值,共n行,只要m*n等于图表中的色块数量即可。
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、6 和 9 外),您需要知道输入图像的色调响应(编码),它可以是线性的(通常用于原始图像)、伽马编码的(使用手动输入的伽马值 (γ) 或所选颜色空间(sRGB、Adobe RGB 等)的伽马值)或对数编码的。响应可以从图表灰度部分的黑白密度图中获得。伽马编码颜色空间的线性化公式为O L = O 1/γ 。伽马编码的公式(在计算 CCM 之后)为O = O L γ 。
对于设置 5、6 和 9,您无需了解图像的编码方式。线性化参数通过对灰度数据进行多项式拟合来确定(对于设置 5 和 6,拟合灰度块级别L;对于设置 9,拟合log10 ( L )),使用 Matlab 的polyfit和polyval函数。
| 环境 | 评论 | 线性化方程:线性水平 = |
| 1. 对输入进行线性化(CS gamma),应用矩阵变换,然后应用 CS gamma 编码。 | 对于以标准颜色空间(CS)编码的图像来说,这是一个合理的选择。 | 输入1/(CS 伽马) |
| 2. 不进行线性化:将矩阵应用于输入像素 | 适用于实验以及起始和保持线性的图像。不适用于伽马编码图像。 | 输入 |
| 3. 假设输入为线性输入,应用矩阵变换,然后应用压缩感知伽马编码。 | 对于未进行伽马编码(接近线性)但需要转换为颜色空间的图像,在将输入的 RGB 图像转换为 L*a*b* 图像时,不会应用颜色空间 (CS) 伽马值。 | 输入 |
| 4. 假设输入输出呈线性关系(γ = 1)。 | 不进行线性化或伽玛编码。RGB 和 L*a*b* 色彩空间转换时,不应用色彩空间伽玛校正。(同第 2 点) | 输入 |
| 5. 对输入进行线性化(数据拟合),应用矩阵,应用压缩感知伽马编码(相当准确) | 使用三阶多项式拟合P (Matlab 的 polyfit 函数)将图像线性化到灰度图像块的像素级别L。计算 CCM,然后使用 gamma 色彩空间进行编码。这通常会得到不错的结果。 | polyval( P , input),其中P是对L进行拟合的三阶多项式。 |
| 6. 对输入进行线性化(数据拟合),应用矩阵,然后进行去线性化(数据拟合) | 与 5 相同,只是优化后图像恢复到原始色调曲线。 | 同第5点。 |
| 7. 使用伽马变换(如下)对输入进行线性化,应用矩阵变换,然后应用压缩感知伽马编码。 | 手动输入伽玛值,如果色卡采用灰度模式,则可以从黑白密度图中获得该值。在测量伽玛值与预期色彩空间伽玛值或 1(线性原始转换)存在差异的常见情况下,此方法可获得极佳的结果。当输入图像的伽玛值与标准色彩空间伽玛值(通常为 1/2.2)或线性值(1)不同时,此设置尤其有用。 | 输入1/伽马 |
| 8. 使用对数斜率进行线性化(对于对数色彩空间,见下文),应用矩阵,然后进行伽马编码(CS) | 对数色彩空间(有时用于电影,但从不用于静态摄影)的特征在于其近似编码方程: O = max(1+A log 10 (O L ), 0) ,其倒数(用于线性化)为: OL = 10^((O-1)/A) 。A为对数斜率,显示在“颜色/色调交互”模块的黑白密度和白平衡显示中。当选择“像素与输入密度”选项(4.0 版本新增)时,对数编码色彩空间具有近似直线响应;而当选择更传统的“对数(像素)与输入密度”选项时,伽马编码色彩空间具有近似直线响应。 | |
| 9. 线性化(伽马多项式数据拟合),应用矩阵,应用 CS 伽马编码。 | 使用以灰度块级别L的log10为底的三次多项式P对图像进行线性化。计算 CCM,然后使用伽马色彩空间进行编码。这是伽马编码的一种多项式改进。推荐此方法的原因在于:(A) 它不需要了解输入图像的编码;(B) 它能为各种图像提供最精确的结果。 | polyval( P ,log 10 (input)),其中P是对 log 10 ( L ) 进行拟合的三阶多项式。 |
注意:对于 Rec. 709 色彩空间(允许值介于 16 和 235 之间,共 255 个值),线性化将 16-235 映射到完整的 0-1(内部)范围,而去线性化将 0-1 映射回 16-235。图像以全范围显示。
- Gamma (仅在线性化设置7 中启用:使用输入 gamma 进行线性化... )。手动输入从灰度阶梯图(大多数颜色图表都包含该图表,并显示在黑白密度图中)测量的 gamma 值。
- 色度倍增器(仅供参考)通常为 1。增大此值可获得更饱和的颜色;减小此值可获得更不饱和的颜色。有时将其增大到 1.05 甚至 1.1 可获得更好的效果。
- 优化约束
- 无任何限制。这是默认设置,除非有充分理由,否则不应更改。
- 各行之和为 1。
- 各列之和为 1。这样可以保持白平衡。
- 计算详情:有两种计算方式可供选择:(1)直接 RGB输入到 RGB输出,以及(2)RGB输入到 XYZ(间接到 RGB输出)。两种方式都使用优化器:它们首先给出一个初始猜测值,然后优化器会不断调整数值,直到找到所选误差指标的最小值。
- 直接计算 RGB 矩阵(原始算法)首先猜测 RGB输入到 RGB输出矩阵,然后从 RGB输出中找到 L*a*b*输出。在优化器的控制下调整矩阵,使颜色误差(L*a*b*输出与参考值之间的误差,如果 ≠ 1,则通过色度乘数进行调整)最小。
- 计算 XYZ 矩阵和 xy 原色(新算法)。首先粗略估计 RGB输入到 XYZ 矩阵的转换结果(使用 sRGB 系数)。然后将其转换为 L*a*b* 格式,并在优化器的控制下调整矩阵,直到选定的误差指标最小化。优化完成后,将 XYZ 转换回 RGB输出。RGB 到 XYZ 和 RGB 到 RGB 的矩阵均已计算并包含在 CSV 和 JSON 输出文件中。
- 参考文件(位于“颜色/色调交互”窗口中;而非“颜色矩阵”窗口中)参考文件包含用于优化的理想色卡 L*a*b* 值。通常,它包含色卡色块的色度测量 L*a*b* 值。默认值始终如此,参考文件通常也是如此,但如果需要特殊的“外观”,参考文件可以包含不同的值,如下文“匹配图像”部分所述。
|
获取测试图表的图像
构图——图表无需充满整个画面,尤其是在光线衰减严重的相机上——这在具有严重桶形畸变的广角镜头中很常见。大多数情况下(像素极低的相机除外),将图表放置在画面中心三分之一处(线性测量)就足够了。
背景——应避免画面内或画面附近出现强光,因为强光会产生眩光,使阴影模糊,难以进行精确校正。理想的背景是中性色(反射率约18%)到深灰色,但只要在进行色彩校正之前不进行色彩校正,背景颜色本身的影响并不大。
图像处理——如果可能,在进行色彩校正模型 (CCM) 计算之前,应尽量减少图像处理。调整颜色和/或将图像转换到特定色彩空间会降低精度。(这正是 CCM 的工作原理。)应避免局部色调映射:它会彻底破坏计算结果。
饱和度——请尽可能避免任何色块饱和。如果色块饱和,即任何通道的平均像素值超过位深度最大值的 99%(例如,位深度为 8 时为 255;位深度为 16 时为 65535),则这些色块将从优化过程中排除,并在分割视图中标记为“饱和” 。色块饱和可能并不明显,尤其是在三个通道中只有一个通道饱和的情况下(如下所示)。应用矩阵后,饱和的色块看起来往往非常奇怪(见下文)。(这看起来像是一个错误,但并非如此,如下所述。)
饱和右侧图像显示了一块饱和区域(第 4 行,左侧) 。由于只有绿色通道饱和,因此并不明显。从下方所示的密度响应曲线(来自“颜色/色调交互式”或“颜色/色调自动” )可以明显看出这一点:绿色通道在最大曝光时饱和,并且绿色曲线的斜率在略低于最大曝光时开始下降。 因此,绿色通道的像素级别(相对于其他色块)比未饱和时的像素级别要低。 | |
![]() | 左下角饱和色块的校正值(底部显示——它是洋红色!)不正确,因为饱和的绿色通道比色块未饱和时的值要低。 |
Imatest 如何处理饱和像素( Imatest 5.0+):当输入文件中的 R、G 或 B 像素饱和(归一化数据中的值为 1)时,应用矩阵后,该像素值将保持饱和状态,即矩阵不会应用于饱和的(R、G 或 B)像素。此功能由以下示例代码中的一行实现。 correctedRGB(linearRGB==1) = 1; 右侧图片展示了校正后的结果。左下角水瓶上的青色高光是未校正饱和度造成的。 CCM 已应用于下方图像。 类似的处理方法也适用于相机。这种方法无法(也无法)在饱和区域边界处给出完美的结果,这些区域通常会出现“紫边”现象。( 维基百科上的解释有误,我可能会尝试修正。) | |
为了计算颜色校正矩阵,

使用“颜色/色调交互式”或“颜色/色调自动”打开图像。
根据黑白密度显示中的密度响应曲线确定线性化设置。
设置颜色矩阵设置,特别注意线性化,使其与黑白密度显示保持一致。
选择参考文件,其中包含用于颜色校正的目标值。大多数情况下使用标准默认值,但您也可以输入通过分光光度计测量或保存高质量(“黄金标准”)图像的 L*a*b* 值创建的参考文件。
按下右侧所示的按钮。显示屏将发生变化,如下所示:理想(参考)颜色仍位于每个色块的左上角,输入颜色仍位于右上角,校正后的颜色则显示在底部。输入图像(来自我们的存档)的白平衡相对较差。校正后的改善效果非常显著。
分屏视图,显示参考色、输入色和校正后的色块颜色。下拉菜单显示
可以将显示输入(在右侧)更改为显示校正值,以获得[校正后 - 理想]统计数据。
按钮变为 ,并以粉色背景高亮显示。只有当图像属性发生更改(例如,新图像、色彩空间、参考文件或颜色矩阵设置)时,才能重新计算校正矩阵。其左侧的“显示输入” (或“已校正” )下拉菜单将启用。您可以从以下两个选项中选择一个。
| 显示输入 | 大多数显示器都会显示颜色差异(输入 - 理想值),并且左下角的文本会显示[输入 - 理想值]颜色差异。有两个显示器不受此设置的影响:伪彩色颜色差异和分离颜色,其中底部会显示(校正值 - 理想值)。 |
| 显示已修正 | 大多数显示器都会显示色差(校正后 - 理想值),左下角的文本也会显示[校正后 - 理想值]色差。以下是上述情况的校正后色差。 |
EXIF 数据和颜色矩阵显示包含结果摘要。
图中显示了颜色校正矩阵、结果摘要以及[输入 - 理想]和[校正后 - 理想]颜色差异摘要。初始误差和最终误差数值显示了所选指标(在本例中为所有 L*>10 和 L* 值大于 10 的色块的 Delta-E 94 平方和)的校正效果。
原始图像结果
以下是一个针对原始图像进行色彩矩阵优化的示例。原始图像由松下GF1微型4/3系统(无反可换镜头)相机拍摄,格式为RAW(RW2)(同时拍摄了JPEG格式作为参考)。使用dcraw软件进行转换,设置参数为:手动模式,标准RAW转换,输出伽玛值=1.0(线性),自动白平衡关闭(未勾选),白平衡无,输出色彩空间=RAW。除去马赛克外,未应用其他图像处理。
该文件几乎完全呈线性:音调响应曲线是一条直线,gamma = 1.01。选择了线性化选项 3 (假设线性输入,应用矩阵,然后应用 CS gamma 编码。 )。
输出效果近乎完美,对于三色传感器而言已臻极致。这与使用特征明确的RAW图像进行处理后的预期效果相符。我们最近(2014年5月)使用四款支持RAW输出的相机(松下Lumix LX7和G3、佳能EOS-6D以及尼康D800E)在六种不同的光照条件下(2700K和5000K LED灯、3500K和5000K CFL灯、标准(2700K)白炽灯以及4700K(实测4000K)SoLux(二向色滤光片)卤素灯)测试了该计算方法,并获得了色彩校正后图像高度一致的结果。
“x、y 和 X、YZ 原色”功能(交互式和自动颜色/色调)可以计算输入(相机)色彩空间的 x、y 和 X、YZ 原色,并将它们显示出来(右侧底部三行),然后保存为 CSV 和 JSON 输出文件。当输入图像为线性图像(从原始图像转换而来,没有伽马曲线)或处于 ACES 色彩空间时,此计算效果最佳。它可用于计算信号处理系数。请注意,x、y 原色与相机的色域无关。这些原色是对应于 R、G、B = {max,0,0}、{0,max,0}、[0,0,max} 的 x 和 y 值,由于传感器中的颜色串扰,这些值在实际应用中无法达到,并且通常位于真实颜色的光谱轨迹之外。
颜色差异( ΔExx和ΔCxx )能达到多好? 它们不可能做到完美,因为三色相机(近似为红、绿、蓝; RGB )中滤色片的光谱与人眼滤色片(近似为黄橙、绿、蓝)的光谱不同。相机无法完全复制人眼,因为要获得良好的色彩还原,必须将颜色转换为RGB,而这会严重降低信噪比(SNR)。 上述示例中的数值, ΔE * ab ≅ 5、 ΔE * 94和5ΔE00 ≅ 3 ,对于三色相机(包括所有标准彩色相机)而言,已经是我们见过的最佳结果之一。我们唯一一次见到更好的结果,即ΔExx < 1,是在至少拥有七个通道的多光谱相机上。 |
从 Color/Tone Interactive 保存矩阵要将矩阵保存到文件(CSV 格式),请单击“文件” ,选择“将颜色矩阵保存到文件” ,然后选择文件名。 点击“文件”菜单,选择“复制颜色矩阵到剪贴板” ,即可将矩阵复制到剪贴板。然后,可以将剪贴板内容粘贴到图像处理模块的“设置CCM”窗口中。 当您按下“颜色/色调交互式”窗口底部的按钮时,矩阵将包含在 CSV 输出文件中(默认存储在图像文件文件夹的“结果”子文件夹中)。 | ![]() |
应用矩阵——图像颜色校正在Color/Tone Interactive中计算出 CCM 后,该矩阵可用于校正任意图像。我们描述了三种方法。 1. 在“颜色/色调交互”中应用矩阵计算出 CCM 后,在“颜色/色调交互式”窗口右侧的“显示”框中选择13. 读取 - 颜色校正 - 保存图像。 左侧初始显示屏会显示“按‘读取图像进行校正’”的信息,如果校正后的图像没有问题,请按“保存校正后的图像”。您可以按或 。 在右侧的示例中,对 Colorchecker 和 Gallery 的图像应用了 CC20C(青色)数字滤镜。计算了滤镜后 Colorchecker 图像的颜色校正矩阵,然后选择了“13. 读取 - 颜色校正...” 。读取滤镜后的 Gallery 图像,并立即使用颜色校正矩阵进行校正。校正前的图像和校正后的图像分别显示在右上角和右下角。 图像。 | ![]() 未校正和已校正的图像 |
这种方法只适用于单张图像,不适用于批量图像。
2. 在 Imatest 图像处理模块中应用该矩阵
在Imatest 5.0 及更高版本中,可以使用图像处理模块将颜色校正矩阵(如上所述,从“颜色/色调交互式”功能保存为 CSV 文件)应用于单个图像或图像批次。为此,请选中图像处理窗口左侧的“CCM(颜色矩阵)”复选框。该矩阵会在高度非线性色调映射和双边滤波操作之前应用。
点击复选框右侧的“设置 CCM”按钮,即可输入或查看 CCM 设置。关键设置包括线性化(如上所述)、色彩空间、输入伽玛(用于一种线性化设置)和矩阵乘数(可以使图像变亮或变暗;通常设置为 1)。

图像处理可以通过选择多个图像而不是单个图像来处理一批图像。如果选择了一批图像,则名为root_file_name.ext的文件将自动保存为root_file_name – ext -improc.png。
3. Apply the matrix externally with Matlab code

The CCM can be applied outside of Imatest. We show an example, using Matlab, of how to apply the matrix. You can try this out if you have Matlab (or convert it into another language like C or Python if you don't).
The uncorrected 24-patch Colorchecker image shown on the right is used as the input to the Color Correction Matrix calculation. It was derived from a raw image, converted to a JPEG file with no color correction, then reduced. You can click (or right-click) on it to download it.
This image was read into Color/Tone Interactive, then color-corrected with the following settings.
Optimize: Delta-E 00
Linearization: Assume linear input, apply matrix, then apply Color Space gamma encoding.
Weighting: 2. Emphasize highlights
Chroma multiplier: 1.06
Calculate XYZ matrix...
Here are the results of the correction. The corrected colors are extremely accurate— better than we usually get when we apply the matrix to an image that has already been processed (ΔEab mean = 5.32; ΔE00 mean = 3.11).
The Color Correction Matrix was obtained by clicking File, Copy color matrix to clipboard, then pasting directly into this page. You can copy it from this page if needed.
1.48663 -0.192007 0.033443
-0.612018 2.03673 -0.796356
-0.367863 -0.580001 3.04927

The program for applying the CCM to an image file is in the box below. It was updated July 2020 to make it much easier to run— with a simple Graphic User Interface. The core calculations, involving variable correctedRGB, can be used as a template for developing custom code.
To load the program into your system, select the text in the box, copy it to the clipboard (control-C), paste it into the Matlab (or other) editor, then save as an m-file (ccm_test.m).
Before you run ccm_test you should calculate a CCM using the Color/Tone module. If you don't have an image of your own to test, download the uncorrected image (above) and copy the 3×3 CCM (also above) to the clipboard.
To run ccm_test from the Matlab command window.
- If possible, copy the CCM to the clipboard (using the File dropdown in the Color/Tone module or Control-C in a text file). You can select the 3×3 CCM text (above) in the browser window, then copy it (control-C).
- Enter ccm_test.
- A window with basic instructions opens. Click OK.
- A narrow window opens where you can
- enter gamma (1 for uncorrected file (above): you can derive gamma from the density plot in Color/Tone Interactive)
- enter the CCM (easiest if you paste it from the clipboard).
- A window opens that lets you browse to the image file and open it.
- The corrected image appears. You can save it if you wish.
An output image (the above input image, corrected) is shown on the right.
function ccm_test
% Test program for applying Color Correction matrix.
% Output for display gamma = 2.2 — sRGB and Adobe RGB color spaces.
uiwait(msgbox(['We recommend that you calculate the Color Correction Matrix (CCM),' newline ...
'and copy Color Matrix to the clipboard before running ccm_test.' newline newline ...
'After you click OK, two input dialog boxes will open.' newline 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); % Keep for diagnostics.
if isempty(answer{2}) || szcc(1)<3 || szcc(1)>4 || szcc(2)<3 || szcc(2)>4
ans2 = answer{2}; % sz2 = size(ans2),
ccmnum = [str2num(ans2(1,:)); str2num(ans2(2,:)); str2num(ans2(3,:))]
gamtemp = str2num(ans2(6,:)); %#ok
if isempty(answer{1}) && ~isempty(gamtemp)
gamma = gamtemp;
end
if isempty(ccmnum)
disp(['CCM is empty or badly-sized– try again.' newline 'szcc = ' num2str(szcc)]);
return;
end
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,my*mx,mc);
correctedRGB = linearRGB*ccmnum;
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
Links
Some of the background for the calculation can be found in Color Correction Matrix for Digital Still and Video Imaging Systems by Stephen Wolf, though the Imatest calculation differs in many respects: there is no issue with outliers and optimization is performed using one of the standard color difference metrics.












