【ISP】浅析CCM

   对于正常人而言,睁开眼的一刹那,便能看到五彩斑斓的世界。各种形形色色的物体不断映入我们的眼帘,刷新着我们对这个世界的感知。在遇到美好的场景后,通常会以文字、图画、照片或者视频等方式将其记录下来,以作留念。就一张好的彩色照片而言,不仅有Demosaic、AWB、CCM、Gamma、降噪、锐化等ISP处理,还会有人为调优。在整个ISP处理流程中,影响颜色的模块有很多,但我们可将影响颜色的部分简单地抽象为如下所示的数学模型。
[RGB]in=([a00a01a02a10a11a12a20a21a22][rwb000gwb000bwb][RGB]in)γ \begin{gathered} \begin{bmatrix} R \\ G \\ B \end{bmatrix} _{in}= \begin{pmatrix} \begin{bmatrix} a_{00} & a_{01} & a_{02} \\ a_{10} & a_{11} & a_{12} \\ a_{20} & a_{21} & a_{22} \end{bmatrix} \begin{bmatrix} r_{wb} & 0 & 0 \\ 0 & g_{wb} & 0 \\ 0 & 0 & b_{wb} \end{bmatrix} \begin{bmatrix} R \\ G \\ B \end{bmatrix} _{in} \end{pmatrix} ^{\gamma} \end{gathered}

   整个数学模型中涉及了WB、CCM和Gamma三个部分,这也是目前主流ISP中,会对颜色造成重要影响的三个部分。但这并不是绝对的,许多ISP中还会引入一个3D-LUT模块,用于增强个性色。不过这不是本文讨论的部分,CCM才是本文的主角。
   CCM位于ISP处理流程的第二个阶段,全称Color Correction Matrix(即颜色校正矩阵)。主要用于将白平衡做准确的图像数据转换到标准的RGB颜色空间。但CCM后的RGB数据依旧是线性的,还需要经过Gamma处理才能更接近非线性的sRGB颜色效果。
【ISP】浅析CCM

图1 颜色校正示意图

   由于半导体传感器的频谱响应和人眼对可见光的频谱响应存在较大差异,加之镜头结构、IR-cut filter、滤色镜中的交叉渗色等因素的影响,导致相机的色彩还原与观察者感知到的物体颜色存在很大差异。因此需要通过CCM提高颜色饱和度,使得相机拍摄的图像颜色更加接近人眼的感知效果。
   目前主流的做法是用一个3×33\times3的矩阵将输入的RGB数据映射为全新的RGB数据。在此过程中,通过颜色校正矩阵对不同颜色进行旋转和拉伸,提高颜色饱和度,使相机采集到的图像颜色更加符合人类的审美。不过也会存在某些物体的颜色误差很大的情况,这是由于颜色校正矩阵提供的是最佳近似值,不可能面面俱到,毕竟整个颜色校正矩阵只有9个数据,不可能覆盖所有的颜色组合。
   对于颜色校正矩阵的大小为何为3×33\times3,是因为RGB图像有三个通道,每个通道分辨率一致,为了确保图像通道数和分辨率保持不变,故颜色校正矩阵的大小必须是3×33\times3。简单的讲就是颜色校正是线性组合,需要满足线性组合的规则。不过还存在3×43\times4的颜色校正矩阵,在3×33\times3的基础上增加了3×13\times1的偏移量,可能是为了能够更好的提高颜色饱和度。对于这个偏移量,目前还没研究透彻。
   整个CCM模块,最为复杂的部分应该是计算颜色校正矩阵。在此过程中,我们需建立一个与imatest类似的评价体系,经过最小二乘法等方式找到最优的颜色校正矩阵。计算CCM时,需要满足白平衡约束,即对任何输入R=G=B的像素在输出时必须满足R’=G’=B’。由于白平衡仅能够矫正广义上的白色,无法实现颜色恒常性,因此不同色温需要不同的颜色校正矩阵。此外,ISP流程中用的Gamma不一定是固定的值,故在调整Gamma曲线数据后,最好重新标定CCM数据。
   标定CCM时,24色卡位置最好位于图像中心位置,大小约占1/9的分辨率最佳,这样可以降低Lens Shading对图像的影响,提高24色卡块数据的准确性。此外,标定时还可以通过调整24色卡块的选取权重,调整色彩偏差。通过观察色差图中camera值与idea值的连线情况以及色差数据,确定标定的色彩校正矩阵是否合理。
【ISP】浅析CCM


图2 色差图

   一般而言,不论是低色温,还是高色温,颜色校正矩阵的对角线上的数据均会大于1,其他位置的数据均会靠近0,或大或小。经验老到的高手可以通过手动调整颜色校正矩阵上的数据,调整色彩偏差。由于调试经验较少,故在此没法给出手动修改矩阵的实例。对于颜色调试而言,个人认为是客观与主观的有机结合,没有最好,只有更好。

文章安利:

  1. 刘斯宁前辈的《Understanding ISP Pipeline - CCM
  2. 不知名作者的《Color correction matrix(色彩矩阵)的学习思考

   上述两篇文章既是本人想要安利的两篇关于CCM的文章,同时也是本文重要的参考文献。

个人声明:
   以上内容,纯属个人观点,不喜勿喷。未经本人同意,不得私自转载。博客中出现的代码仅供学习参考,不得有其他用途。若文中存在纰漏,或读者有更好的建议,欢迎留言探讨。也可邮箱联系:[email protected]