ISP | CMM和Gamma

在图像信号处理器(ISP)中,颜色校正矩阵(Color Correction Matrix,简称CCM)和Gamma是刚需模块,无论是哪个厂家的ISP,里面都肯定有CCM和Gamma模块,而且肯定是CCM在Gamma前面,在调试的时候,CCM和Gamma也有千丝万缕的关系,所以这两个模块放在一起理解比较合适。

1.1 CCM的工作原理

在数字图像处理中,通常使用RGB颜色模型来表示图像的颜色信息,由于不同相机传感器对光的敏感度不同,以及不同显示设备的颜色再现能力也有所差异,因此需要使用CCM来调整图像中的颜色,以符合特定的色彩空间标准或视觉感知要求。

CCM的工作原理基于颜色空间的线性变换,通常由3x3的矩阵构成,每个元素代表对应颜色通道的权重,当一个RGB图像通过CCM进行变换时,每个颜色通道的值都会根据矩阵中的权重进行加权和调整。数学上,CCM的作用可以通过以下公式表示:

\begin{bmatrix} R \\ G \\ B \end{bmatrix}= \begin{bmatrix} c_{11} & c_{12} & c_{13} \\ c_{21} & c_{22} & c_{23} \\ c_{31} & c_{32} & c_{33} \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix}    (1)

这里要做个说明,很多资料会把公式(1)右边的XYZ写成RGB,左边的结果写成R’G’B’,这种字母表示看起来似乎更符合逻辑,因为ISP在经过demosaic之后就被认为是进入了RGB域,所以CCM理应是从RGB域到RGB域的色彩映射。但事实不是这样的,颜色是人为定义出来的,由光谱一步一步推导而来,具体可以参见图像处理算法 | 颜色空间(二),按照CIE的定义,在CCM之前都是在XYZ色域,经过CCM之后才是RGB色域,如果不想理解这部分的内容,那也可以跳过,直接把CCM理解成从RGB到R’G’B’,就是公式(2)的样子:

\begin{bmatrix} R' \\ G' \\ B' \end{bmatrix}= \begin{bmatrix} c_{11} & c_{12} & c_{13} \\ c_{21} & c_{22} & c_{23} \\ c_{31} & c_{32} & c_{33} \end{bmatrix} \begin{bmatrix} R \\ G \\ B \end{bmatrix}    (2)

但是要在心里明白,(1)才是正统,不然无法理解并使用接下来的一些内容。

CCM的颜色校正矩阵定义了从原始颜色空间到目标颜色空间的映射关系,例如,从相机的原始RGB空间转换到sRGB(standard RGB)标准颜色空间,这个过程其实是有标准矩阵可以套用的。Bruce Lindbloom(布鲁斯·林德布卢姆:一位在颜色科学领域有重要贡献的专家,尤其以色彩管理和颜色理论方面的工作而知名),他的这个网站给出了各种颜色空间转换矩阵的值:RGB/XYZ Matrices (brucelindbloom.com)

上面的链接进来之后里面是两个大表格,这两个表格给出了不同白点下XYZ颜色空间和RGB颜色空间互转的矩阵,CCM使用的就是图中红框圈出的这个,在D65白点(白平衡的链接)下从XYZ转到RGB的颜色矩阵。

图1 XYZ和RGB互转矩阵

在ISP中CCM是可以配置的,用户可以根据具体需求或特定场景进行调整,这一定程度上取决于用户的喜好,这种tunning堪比艺术创作,向tunning工程师致敬!

在介绍Gamma前先解释一下为什么所有的ISP框架中CCM都在Gamma前面,这是因CIE在定义颜色的时候是把XYZ投影在了X+Y+Z=1平面上(如图2所示),这相当于是把亮度给指定成了单位1,也就是在亮度为1的前提下讨论颜色,所以先用CCM确定颜色再用Gamma调整亮度是合乎逻辑的流程,而倒过来则会引入亮度这个变量,使颜色调校不准。

图2 从XYZ截舌形图

CCM在Gamma前并不意味着CCM做完之后就紧接着做Gamma,而是说在ISP的处理流程中,CCM的位置在Gamma前。事实上,有些厂家的ISP可能会在CCM后加入降噪模块,这可能是因为Gamma会拉高暗区的噪声,先处理噪声有助于提升图像效果,或者是在CCM后面加入3DLUT进一步调整颜色,做完这些模块之后才做Gamma。不同的厂家设计出来的ISP千差万别,配合不同的tunning风格,获得的效果也完全不同,千万别思维定式。

1.2 Gamma的工作原理

Gamma的作用是重新映射线性颜色,以更好的适应人类的视觉系统对辐射功率的非线性响应。这句话的意思其实是,人眼对暗处的细节比对亮处的细节敏感,所以需要一个非线性变换抬升暗区,压缩亮区,从而实现图像对比度增强的目的,基于这个需求,gamma映射应运而生。Gamma映射的公式非常简单,如(3)所示:

V_{out}=V_{in}^{\gamma}    (3)

其中,γ是gamma值,是一个大于0的实数。以常用的γ=1/2.2为例显示gamma曲线如下图3所示:

图3 gamma=0.45的曲线

从曲线可以看出,对于输入的暗区部分,在输出的时候获得了比较大的映射区间,而输入的亮区部分,在输出的时候获得了比较小的映射区间,这反映在图像上,就是暗区被拉伸,亮区被压制。用gamma抬暗区是为了在ISP后续处理的时候不要丢失太多的细节,比如降噪。

然而,公式(3)在实际应用中可能会遇到一些问题,比如当Vin接近于0时,Vout也接近于0,这可能导致暗部细节的丢失。为了解决这个问题,通常会使用一个稍微复杂一点的Gamma校正公式:

V_{out}=1.255\times \left ( \frac{V_{in}}{255} \right)^{\gamma}+0.05    (4)

这个公式在Vin0时,Vout被设置为0.05,而不是0,这样可以保留一些暗部的细节。另外,还有一种常见的Gamma校正公式是:

V_{out}=\left\{\begin{matrix} 0,V_{in}=0 \\ \left (V_{in}/255\right)^{\gamma},0<V_{in}\le 1 \end{matrix}\right.    (5)

1.3 CCM和Gamma的效果测试

CCM的调试要和白平衡一起,为了只说明CCM和Gamma的效果,假定白平衡已经调好了,选定D65作为白点,对下面的这幅24色卡图像进行效果测试。

图4 输入的24色卡测试图

 在这个网站选择了sRGB、Adobe RGB和Apple RGB三种常用的颜色空间的矩阵值来做CCM测试,得到的结果如图5所示:

图5 不同颜色空间的CCM效果

这三幅图像从整体上看起来并没有特别大的差异,仔细看(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所示,从左往右,亮度是逐渐增大的。

图6 不同Gamma的效果
  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大凝的IC进阶之路

一起学习一起进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值