目录
在ISP通路里,有个CCM(Color Correction Matrix)模块,这个模块就是个3x3的矩阵,其目的就是将与设备相关的颜色空间,转到和设备无关的颜色空间。
最小二乘法介绍
这个模块可以用最小二乘法计算得到,先介绍下最小二乘法。
其中,我们规定其中B为3xN的矩阵,A为3xN的矩阵,M为3x3矩阵。可以认为M为CCM矩阵,A为目标色卡RGB或XYZ值,B为camera的RGB值,N为色卡的数目,一般为24色卡或者SG色卡,由于CCM矩阵是3x3矩阵,所以,一般用24色卡即可。
要想计算出M,则有
令
则
可得
当然,ISP里的CCM模块,不仅仅是一个3x3矩阵,实际上,为了保证经过CCM之后,AWB的白点不变,即保证白还是白的,需要满足另一个条件,那就是必须保证CCM矩阵的行和为1。而用上面的公式得到的M并不会保证3x3的矩阵行和为1。
带约束条件的最小二乘法
所以,在求解的过程中需要加入约束条件。其推导过程如下(由于敲公式太费劲了,用手写的)。
这样就可以算出M矩阵,必然能够保证M矩阵的行和为1。
计算法获取AB矩阵
下面再介绍如何得到A矩阵和B矩阵,A矩阵我们当作是目标值,这个可以是CIE1931标准观察者空间得到RGB值,这个值和设备不相关了,对指定光源下,可以计算出其值
∫ρ (λ) *R(λ)*stdxyz(λ)
该值是在XYZ空间,且还没做白平衡,所以需要使用色适应计算caMat,可以使用Branford或者CAT02计算,然后再转到sRGB色域或者P3色域,这样就能得到A矩阵。
而B矩阵是和camera相关的,如果能有相机的相应曲线,那么可以使用同样的方法,计算其值,
∫ρ (λ) *R(λ)*S (λ)
同样的,然后做白平衡,即可得到B矩阵。
那么整个计算流程如下图
实拍法获取B矩阵
当然,有时,我们没法知道sensor的响应曲线,那么,可以采用实拍的数据,不过这样需要测环境光源曲线,要保证A矩阵里使用相同的光源曲线。
那整个流程如下:
完全实拍获取AB矩阵
如果有竞品手机,可以在相同光源下,同时用两台手机对色卡进行拍照,从而获取到AB矩阵。整体流程如下:
需保证照片的色域是相同的,不能一个sRGB,一个P3 AWB对齐;亮度对齐,饱和度对齐,都是竞品手机向调试手机对齐,AWB对齐是为了让得到的CCM不会带有倾向,不影响AWB,亮度对齐是为了,计算CCM时无亮度影响,更多的考虑颜色, 二次计算和饱和度对齐是为了色度优先,尽可能保证色相准确性,牺牲饱和度。
总结
这个过程是计算指定光源下的CCM矩阵,实际中,不同光源对应的CCM不同,所以需要计算出多种光源下的CCM矩阵,比方说,D65,LED5000K,TL84,AH等光源下,然后通过AWB计算出的白点色温,根据色温大小或者光源类型,选择对应的CCM矩阵,中间可以采用插值的方式,得到最终使用的CCM阵,只要不选错CCM,效果基本上不会差。
当然,由于CCM是3x3矩阵,是线性的,而sensor的响应曲线到人眼标准观察者空间是非线性的,所以,一般不能保证每个颜色都是准确的,也就是用对应的CCM矩阵算出各个色块的色差,某些色块的色差会比较大,还需要后处理模块来进行二次修正。