在图像信号处理器(ISP)中,颜色校正矩阵(Color Correction Matrix,简称CCM)和Gamma是刚需模块,无论是哪个厂家的ISP,里面都肯定有CCM和Gamma模块,而且肯定是CCM在Gamma前面,在调试的时候,CCM和Gamma也有千丝万缕的关系,所以这两个模块放在一起理解比较合适。
1.1 CCM的工作原理
在数字图像处理中,通常使用RGB颜色模型来表示图像的颜色信息,由于不同相机传感器对光的敏感度不同,以及不同显示设备的颜色再现能力也有所差异,因此需要使用CCM来调整图像中的颜色,以符合特定的色彩空间标准或视觉感知要求。
CCM的工作原理基于颜色空间的线性变换,通常由3x3的矩阵构成,每个元素代表对应颜色通道的权重,当一个RGB图像通过CCM进行变换时,每个颜色通道的值都会根据矩阵中的权重进行加权和调整。数学上,CCM的作用可以通过以下公式表示:
(1)
这里要做个说明,很多资料会把公式(1)右边的XYZ写成RGB,左边的结果写成R’G’B’,这种字母表示看起来似乎更符合逻辑,因为ISP在经过demosaic之后就被认为是进入了RGB域,所以CCM理应是从RGB域到RGB域的色彩映射。但事实不是这样的,颜色是人为定义出来的,由光谱一步一步推导而来,具体可以参见图像处理算法 | 颜色空间(二),按照CIE的定义,在CCM之前都是在XYZ色域,经过CCM之后才是RGB色域,如果不想理解这部分的内容,那也可以跳过,直接把CCM理解成从RGB到R’G’B’,就是公式(2)的样子:
(2)
但是要在心里明白,(1)才是正统,不然无法理解并使用接下来的一些内容。
CCM的颜色校正矩阵定义了从原始颜色空间到目标颜色空间的映射关系,例如,从相机的原始RGB空间转换到sRGB(standard RGB)标准颜色空间,这个过程其实是有标准矩阵可以套用的。Bruce Lindbloom(布鲁斯·林德布卢姆:一位在颜色科学领域有重要贡献的专家,尤其以色彩管理和颜色理论方面的工作而知名),他的这个网站给出了各种颜色空间转换矩阵的值:RGB/XYZ Matrices (brucelindbloom.com)
上面的链接进来之后里面是两个大表格,这两个表格给出了不同白点下XYZ颜色空间和RGB颜色空间互转的矩阵,CCM使用的就是图中红框圈出的这个,在D65白点(白平衡的链接)下从XYZ转到RGB的颜色矩阵。
![](https://img-blog.csdnimg.cn/direct/45ca50df5dd44c80bc51938db98572e4.png)
在ISP中CCM是可以配置的,用户可以根据具体需求或特定场景进行调整,这一定程度上取决于用户的喜好,这种tunning堪比艺术创作,向tunning工程师致敬!
在介绍Gamma前先解释一下为什么所有的ISP框架中CCM都在Gamma前面,这是因CIE在定义颜色的时候是把XYZ投影在了X+Y+Z=1平面上(如图2所示),这相当于是把亮度给指定成了单位1,也就是在亮度为1的前提下讨论颜色,所以先用CCM确定颜色再用Gamma调整亮度是合乎逻辑的流程,而倒过来则会引入亮度这个变量,使颜色调校不准。
![](https://img-blog.csdnimg.cn/direct/0f9bba2c82a9494a81cf2c7d302b3b22.png)
CCM在Gamma前并不意味着CCM做完之后就紧接着做Gamma,而是说在ISP的处理流程中,CCM的位置在Gamma前。事实上,有些厂家的ISP可能会在CCM后加入降噪模块,这可能是因为Gamma会拉高暗区的噪声,先处理噪声有助于提升图像效果,或者是在CCM后面加入3DLUT进一步调整颜色,做完这些模块之后才做Gamma。不同的厂家设计出来的ISP千差万别,配合不同的tunning风格,获得的效果也完全不同,千万别思维定式。
1.2 Gamma的工作原理
Gamma的作用是重新映射线性颜色,以更好的适应人类的视觉系统对辐射功率的非线性响应。这句话的意思其实是,人眼对暗处的细节比对亮处的细节敏感,所以需要一个非线性变换抬升暗区,压缩亮区,从而实现图像对比度增强的目的,基于这个需求,gamma映射应运而生。Gamma映射的公式非常简单,如(3)所示:
(3)
其中,γ是gamma值,是一个大于0的实数。以常用的γ=1/2.2为例显示gamma曲线如下图3所示:
![](https://img-blog.csdnimg.cn/direct/800b5053092f435f9d12a1d2b89eab14.png)
从曲线可以看出,对于输入的暗区部分,在输出的时候获得了比较大的映射区间,而输入的亮区部分,在输出的时候获得了比较小的映射区间,这反映在图像上,就是暗区被拉伸,亮区被压制。用gamma抬暗区是为了在ISP后续处理的时候不要丢失太多的细节,比如降噪。
然而,公式(3)在实际应用中可能会遇到一些问题,比如当Vin接近于0时,Vout也接近于0,这可能导致暗部细节的丢失。为了解决这个问题,通常会使用一个稍微复杂一点的Gamma校正公式:
(4)
这个公式在Vin为0时,Vout被设置为0.05,而不是0,这样可以保留一些暗部的细节。另外,还有一种常见的Gamma校正公式是:
(5)
1.3 CCM和Gamma的效果测试
CCM的调试要和白平衡一起,为了只说明CCM和Gamma的效果,假定白平衡已经调好了,选定D65作为白点,对下面的这幅24色卡图像进行效果测试。
![](https://img-blog.csdnimg.cn/direct/1842318ab1ba46e381df713ecf709c8e.png)
在这个网站选择了sRGB、Adobe RGB和Apple RGB三种常用的颜色空间的矩阵值来做CCM测试,得到的结果如图5所示:
![](https://img-blog.csdnimg.cn/direct/01ed5c7110db4840b5c4f86496d6244c.jpeg)
这三幅图像从整体上看起来并没有特别大的差异,仔细看(3,3)位置的红色才能看出有些许不同,似乎不同矩阵的差异也不是特别大?其实差异比我们看见的要大,目前看见的三幅结果只有(a)图的sRGB是准确的,因为我们的显示器大多是sRGB的,而Adobe RGB和Apple RGB不能在sRGB域上完全显示出来,具体参考颜色空间(三)——RGB、Lab、HSV和YUV。这也是为什么ISP调试需要专业的显示器,这方面做的比较好的显示器品牌好像叫艺卓,另外在使用之前还需要校准,然后才可以进行ISP的颜色调试。
接下来是gamma,针对sRGB的结果测试gamma=1/1.8,1/2.2和1/2.4三种常用参数,得到的效果如图6所示,从左往右,亮度是逐渐增大的。
![](https://img-blog.csdnimg.cn/direct/0d19ccb0779a43d7a9cefe8ce82631d2.jpeg)