Camera ISP - ColorCorrectionMatrix

转载自:Camera ISP - ColorCorrectionMatrix

CCM 全名是 Color Correction Matrix,也就是颜色校正矩阵,主要作用是用来对 sensor 输出的原始 RGB 图像进行一个定义好的 3x3 或 3x4 矩阵矫正,后者多了一个 RGB 分量的整体偏移 offset,得到我们想要的 RGB 输出。之所以需要这个的原因是我们人眼的感光分布在 RGB 各个通道上的颜色分量来看的时候是不均匀的,也就是 R, G, B 每个颜色分量对于最终人眼感受到的颜色贡献是不一样的,假定 sensor 的 R, G, B 感光敏感度是一致的,我们也需要按照人眼的感光特性进行一个矫正使其 R, G, B 分量符合人眼的特性。并且由于 sensor 工艺制造,镜头,滤光等等的影响,实际上 sensor 输出的图像 RGB 通道也并不是均匀分布的,而是有一定的感光曲线的。

下图是人眼在不同波长的情况下对于 RGB 分量的敏感度分布,LMS 分别是 Long、Middle、Short 光波分量,也可以理解为我们认为的红绿蓝颜色分量,可以看到不同波长光情况下对于 RGB 分量是不均匀分布的。

人眼的感光特性曲线

下图是我找到的一个 Sony 的 sensor 感光特性曲线,也就是不同波长的光最终被 sensor 接收进行光电转换之后呈现出来的 RGB 值,也就是 sensor Raw 的输出。可以看到它的曲线和上面一幅图相去甚远,如果我们不对 sensor 的输出进行任何处理的话,最终到我们人眼感受到的颜色和实际被拍摄物在物理世界呈现的颜色是有严重不一致的。

Sony IMX117 感光特性曲线



CIE 颜色空间的来源

 CIE 全称是 Commission Internationale d’Eclairage,也就是国际照明协会。在某年应该是 1931 年 CIE 使用颜色匹配试验测定了一组光照曲线。具体的做法类似下图,一侧用 RGB 三色灯生成组合灯光, CIE 采用了 700nm, 546.1nm 和 435.8nm 的红绿蓝单一波长光源做的匹配试验,虽然是单一波长,但是激发强度可以使得我们合成等效的其它波长光。另一侧可以理解为是用一定方法获取到的自然光源,和自然界的光波分布类似。颜色匹配就是通过调整自然光一侧使得其波长从小到大变化,然后我们在 RGB 侧进行合成,使得左右两侧在观察上是一致的,最终我们可以得到一个颜色匹配曲线。

CIE color matching 实验

下图是最终得到的曲线,可以看到红色光部分有一段是负值,这是因为某些波长自然光无法通过指定的三个定波长的 RGB 混合获取,于是将红色光源移到了自然光一侧,等于说是类似做了一个对 R 分量的减法,负值就是这么来的。

CIE RGB 响应曲线


最后还有对 CIE RGB 的优化,得到 CIE XYZ 空间的表示,这个就是把负值给抹掉,变成正值,这个是一个想象的空间,没有直接的物理意义上的对应关系,然后再对三维的空间进行约束投影变成二维的 CIE xyz(小写)空间,最终就是我们看到的马蹄形的 CIE 色彩空间图形:

CIE XYZ 空间,负值被翻转了

CIE xyz 空间,二维

这部分颜色空间从三维的 CIE RGB -> CIE XYZ -> CIE xyz 二维的马蹄形颜色空间的转换有一个具体的演进过程,不过这里不是重点,有一些非常形象化的图就没有放在这里,或许后面可以写一个 CIE 颜色空间表示的文章时把它们放进去。重点就是 CIE 颜色空间在 CCM 的计算过程中会需要用到,所以就大概介绍下它是怎么来的。

CIE & La*b* & RGB & sRGB

CIE La*b* 是基于 CIE XYZ 衍生而来的符合人直观感受的颜色空间,它使用 L 表示亮度,a* 和 b* 分别表示颜色分量,听起来有点像是 YUV 格式的表达方式。CIE La*b* 是一个设备无关的颜色表示系统,它是直接对颜色本身进行定义的,不受显示位数、存储位数等等的约束,所以所有的颜色空间可以通过用 La*b* 进行中转转换,达到不同设备之间颜色同步的需求。

CIE LAB 颜色空间

可以看出,它大概是个球形,三个轴分别是亮度,红绿,黄蓝。球形的横截面左右滑动的时候会有 Hue 的变化,纵截面上下滑动的时候会有明度/亮度的变化,这个可以比较直观的表示颜色并且符合我们的主观直觉。而 CIE LAB 和 RGB sRGB 是可以互相转换的,前面提到那个马蹄图,上面马蹄图里面的三角形就是 sRGB 在 D65 CIE xyz 空间的映射范围,而 sRGB 则是 RGB 在 Gamma 域的表示(详情可看前面 Gamma 一节)。

所以我们可以做到 RGB <-> CIEXYZ <-> CIELa*b* <-> sRGB 之间的相互转换,而我们的 CCM 通常就是换到 CIE La*b* 空间进行的计算。他们之间的互相转换有相关的公式,下面贴一个 CIEXYZ 到 CIELa*b* 的转换(来自维基百科):

CIE LAB 颜色空间



标准颜色卡

有了上面的预备知识之后我们就可以把 sensor 输出的图像 RGB 转换到 CIELa*b* 颜色空间,这时我们还需要一个标准颜色测试卡来进行参考调试。为什么需要这个标准颜色测试卡呢?因为我们需要知道矫正之后的颜色是否和标准颜色测试卡的颜色是一致的,经常用的有 Gretag Macbeth 24 色测试卡,也就是下面的这种,实际上我们可能会使用到更多颜色的测试卡,以及实际拍摄到的日常外景进行多重的对比参考:

Gretag Macbeth 24 色标准测试卡

这里面的 24 个颜色分别是:Dark skin, Light skin, Blue sky, Foliage, Blue flower, Bluish green, Orange, Purplish blue, Moderate red, Purple, Yellow green, Orange yellow, Blue, Green, Red, Yellow, Magenta, Cyan, White, Neutral 8, Neutral 6.5, Neutral 5, Neutral 3.5, Black。其实自然界的颜色要比 24 色要多很多,就说 8bit 的 RGB,每个通道 255 种选择,合起来就是 255^3 种颜色,当然我们也可以选择那样进行一一映射,但是这样未免比较耗费时间空间,实际 3D Lut 也是采用空间采样得到 9x9x9,17x17x17,… ,65x65x65 等等,其它的就用三维空间的插值获取到。而实际 ISP 实现里面通常是采样若干个点,比如就是这个 24 色标准测试卡颜色,然后进行拟合得到通用的 CCM 变换矩阵,从而完成对其它颜色的统一变换,这个作用域是 La*b* 空间的全局映射,并没有做到针对每一个颜色域内进行特性化的映射,说人话就是 3D Lut 可以实现只改变某一个或者一段颜色区域的映射方式而不影响其它的,CCM 则是全局映射,所有的颜色区域按照统一方式进行映射。

24 色卡在 CIEXYZ 空间的分布大概如下图所示,它是被包含在 sRGB 空间内的,并且大致呈现出均匀分布的状态,使得我们用这些采样点计算出来的结果尽量的符合整体:

24 色卡在 CIE XYZ 空间的大概位置

还有一个问题,前面说到的那些颜色空间,他的来源三色波长、sensor 所处的测试光强环境、最终 RGB 的显示存储位数等等都会对我们实际使用当中用到的标示值有影响,而且 CIE 在不同的年份也对这些结果进行了一定的修正,导致每一个版本也是不尽相同。所以我们可以看到有类似 D50、D65 之类的字符,它表示特定的光照环境,并且 24 色卡也给出了一定约束条件下的 RGB,LAB 值,如下图所示,可以看到它是在 D50 条件下,color checker 2005 版本的 La*b* 和 RGB、sRGB 之间的关系:

24 色卡的标准化数值表示

而我们要做的就是大概下面的工作:

    Sensor 获取原始 Raw RGB 数值,位数由 sensor 的硬件以及驱动配置共同决定。
    对 Raw RGB 进行 WB 矫正得到校正后的 WhiteBalanced RGB,因为 CCM 需要在白平衡基础上进行调试。
    然后进行初始 CCM 矫正得到我们想要的最终结果。
    再转换到 CIE La*b* 空间获得测量到的实际颜色值。
    与标准测试卡给出的 La*b* 值进行对比,然后迭代求解出最接近理想状态的 CCM 矩阵,这个就是我们最终需要获取的矩阵了。
    针对不同光照环境测得多组 CCM 以应对不同情况下的转换(因为 WB 不同光照也是不一样的)。

(Sensor RGB) -> Mwb -> CCM -> (Corrected RGB) -> Mrgb2xyz -> Mxyz2lab -> (La*b* value RGB)
(Standard CIE La*b* sRGB) -> Inverse Gamma -> (Standard CIE La*b* RGB)
添加约束条件 ==> 使得上面两者的插值方差最小

CCM 计算
3D Lut

3D LUT 就是分别对 RGB 分量做不同的映射,大致的结构如下所示:

Rorig -> 1D Lut(R) -                     --> R
Gorig -> 1D Lut(G)  | --> 3D Lut (RGB) -| -> G
Borig -> 1D Lut(B) -                     --> B

 

那么 1D Lut 是什么呢?它是每一个颜色分量的映射查找表,作用就类似下面的样子,假设我们是 8Bit 的 RGB 存储系统,那么 RGB 分量就分别有 0~255 这 256 个表示值,我们分别对每一个通道的 0~255 这些值添加一个 LutN 的映射,比如说 0 就会被映射到 10,1 映射到 5 这样子,RGB 通道有三个不同的 1DLut 表,合起来作为 3DLut。

0      -> |Lut0|      -> X0
1      -> |Lut1|      -> X1
n      -> |Lutn|      -> Xn
255    -> |Lut255|    -> X255

 

实际操作的时候并不会对每一个 0~255 的分量全部测量出其准确映射,如之前所说的会取 17x17x17 之类的映射点,然后中间的部分经过采样获取到的点进行插值获得,这个插值使用三维的插值方式,具体就不做深入挖掘了。3D Lut 的优点就是可以特性化的只针对想要改变的颜色进行调节,而避免动到其它不想动的颜色,而 CCM 则是一个全局的矩阵映射。那么问题来了,看起来这个 3DLut 可以完全包含 CCM 的功能,并且还可以做到 CCM 做不到的事情,为什么不直接用 3DLut 代替传统 3x3 的 CCM 的模式。这块我也没有确切的答案,不过应该是因为 CCM 之后我们还要做 Gamma,因为 Gamma 之后是非线性的 RGB 空间而 CCM 要求在线性的 RGB 空间,Gamma 也会对图像产生亮度色彩上面的一些影响从而导致一些色彩一致性上面的问题,实际上类似 3DLut 的工作也有放在 CCM 和 Gamma 之后,用作色彩增强使用。

而 3DLut 是一个三维的多项式拟合,这部分我还没有研究过具体的实现原理,但是现在大概都可以通过机器学习的方式实现,matlab 也有相关的方法以供调用。

最小二乘法

最小二乘法可以用来正向求解近似估计值,我们可以设置 24 个颜色卡的 RGB 为参考值,然后我们相机输出经过 WB 的 RGB 为实际测试值,需要做的就是求他们平方差和的最小值,大概的公式就是下面这几个:

最小二乘法需满足的条件

第一个就是求平方差和的公式,也就是目标值减去 sensor 输出值取平方之后求和,然后需要做到使得这个 L 为最小的 CCM 值,具体到我们的颜色系统就是第三个公式所示,简写为第四个公式的状态:Rref = M * R,最小二乘法最终求 M 就是第四个公式所示,M 可以由 Rref 和 R 矩阵变换求得,具体的推算公式所代表的本质意义比较难以理解,我还没有搞透彻,所以这里就不写了,只是知道有这么一种方法。

最小二乘法得到的值我们需要给一个约束条件,也就是 M11 + M12 + M13 = M21 + M22 + M23 = M31 + M32 + M33 = 1,这样不会破坏之前 WB 得到白平衡状态,所以实际计算当中还是需要把这个列入约束做计算,最终才能够获得满足条件的 CCM。

神经网络

当然我们也可以使用 AI 去取点训练得到一个 CCM,这个模型的输入是一个 sensor RGB 矩阵,输出是我们想要的 24 色卡标准色彩值,定义损失函数就可以参考上面公式里面的平方差,然后进行迭代求解。在 imatest 里面有一个 CCM optimizer 的工具,AI 的内部运行过程应该类似,从一个给定的初始值得到训练之后的理想值:

imatest 的优化过程

算法实现的这部分我还是不太了解实际工程过程中是怎么做的,AI 这部分并没有深入去了解过其实现原理,不过我想现在应该都是用集成的基于 AI 的 API 去计算这个 CCM 了吧,毕竟这个方便快捷且可以提供较高的准确度了。
总结

本文主要是针对 CCM 的来源,我们为什么需要 CCM,以及 CCM 大概的计算方法做了一个大概的描述,算法内部原理并没有深入了解,现阶段这个程度已经可以满足学习需求了,等到后面系统成型之后可能会需要深入每一个算法的实现原理里面去研究下。本文的参考放在下面这里了,可能不太全面,但是我挑了比较好的几篇文章放这里了。
Reference:

    Wiki CIE: https://en.wikipedia.org/wiki/CIE_1931_color_space#CIE_RGB_color_space
    Zhihu CIE: https://zhuanlan.zhihu.com/p/129095380
    CG color: https://chrisbrejon.com/cg-cinematography/
    Activision tech: https://research.activision.com/publicationss
    imatest: https://www.imatest.com/docs/colormatrix/
————————————————
版权声明:本文为CSDN博主「嵌入式Max」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013904227/article/details/127337324

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值