1.色温和白平衡
物体有SPD,光照也有SPD,所以最终进入人眼的实际是二者的乘积。但有意思的是同一物体在不同光照SPD下,人眼会识别为同一个颜色,这就是Color constancy/chromatic adaptation。但sensor是没有这个特性的,所以需要白平衡来解决。
对于光照的SPD,可以使用色温来表示。由普朗克定律Plank's law,某个波长的能量谱密度可以由给定温度下的黑盒辐射“blackbody radiators”来表示,剩余的都是光速,普朗克常量等常量。
由这个公式对应的曲线图中可以看出:温度越高,曲线峰值对应的波长越短,越接近蓝色。
CIE建立了几种标准的光源,和色灯箱上的字母是对应的:标准光源对色灯箱上字母含义是什么-DOHO标准光源对色灯箱厂家
A | 充气螺旋钨丝灯,色温2856K |
B | noon sunlight |
C | average daylight,色温约为6774K的平均日光,光色近似阴天天空的日光 |
D | D50, D55, D65分别表示5000K, 5500K, 6500K |
E | 均匀分布的SPD,类似于D55 |
F | 各种荧光灯,色温2700K |
H | 卤钨灯,色温2300K |
可以只考虑白色点,只要白色点在各个光照下不变,那么最终的成像颜色就不会受光照的影响。下图可以看到,不同光照下白色点确实出现的偏移:
白平衡的目的就是使白色区域在不同场景下的xyz空间的同一位置。具体做法是乘一个对角矩阵,即每个分量乘一个权重系数。对白色乘完之后在人眼细胞LMS空间中应该是(1,1,1),这样就得到了对角矩阵。
由此类推,也可以像色调映射一样,把一个色温下的图像转换到另外一个色温场景下。
2.设备间一致——sRGB
CIE XYZ 虽然是很典型的颜色空间,但照片和设备不直接使用XYZ。因为XYZ毕竟不是真实的分量,我们还是对RGB更熟悉。但麻烦的是不同设备的分量不一致,这样同一个信号在不同设备下的颜色就会不一样。
要改变这一现象,就需要设备的生产商们制定一个标准。在1996,微软和惠普制定了Standard RGB 的标准:
sRGB本质是从XYZ空间中选取了一块子空间。
因为色温影响颜色空间,所以在制定sRGB时的whitepoint是在D65下制定的,即色温为6500K。
3.转换为sRGB——CCM
CCM(Color Correction Matrix)的作用就是通过一个3X3的矩阵使得颜色更接近人眼所感受的颜色。这句话看着有点废话,因为整个ISP的作用就是如此。但他又是正确的,因为CCM完成了从sensor rgb到sRGB的变化,无疑前者不够标准化,后者更接近人眼。
通常CCM之前已经完成的白平衡操作,为了不再破坏白平衡,对于whitepoint(R=1,G=1,B=1),经过CCM之后,要有R'=1,G'=1,B'=1,这就要求CCM矩阵满足:
所以通常通过带限制条件的优化方程的方式来求解,这样求解出来的矩阵就能保证白平衡不被破坏。
https://zhuanlan.zhihu.com/p/413851281
https://zhuanlan.zhihu.com/p/536783855
在sRGB中提到,不同色温的sRGB空间是不同的,所以不同色温下的CCM也是不同的。一般会在不同色温如2800K和6500K下标定CCM,其他色温的CCM通过线性插值求解。
4.人眼非线性——gamma
sRGB是一个线性空间,但人眼对亮度的感受不是线性的,而是更接近指数函数的形式。曲线是上凸的,斜率越来越低,接近cube-root power-law,指数的幂一般取1/2.2。
有趣的是,人对疼痛的感受和对亮度的感受正好相反:
gamma上凸的曲线被称为encoding的过程,对应的反函数被称为decoding的过程。
5.其他颜色空间
YUV是一种颜色编码方式,Y表示亮度,uv共同表示色度。因为人眼对色度的感知较弱,所以可以压缩uv的带宽,从而有了YUV422和YUV420编码。RGB向YUV转换时,应该是gamma变换之后的RGB。这里的Y指的是Luma,而不是Luminance
LAB颜色空间是一种基于人类生理特征的颜色模型,它不依赖于特定的设备或光线条件。a表示从绿色到红色(数值对应从负到正,后面同理),b表示从蓝色到黄色的范围。其中L的值域为[0, 255], a的值域为[-128, 127], b的值域为[-128, 127]。当a=b=0时,表示灰色。
lab解决了xyz中颜色分布不均匀的问题。L差不多是Y分量的根号三次方。RGB无法直接转换成为Lab,需要线转换成XYZ色彩空间再转换为Lab。
电视广播系统有自己的标准NTSC。不过,目前NTSC 是一个已经过时的电视色彩标准,如今保存下来的意义几乎就仅是作为各色彩标准之间的对比。NTSC 色域相对 sRGB 色域而言,绿色的覆盖面积会更广一些,色彩会更加丰富。但值得注意的是,NTSC 并未完全覆盖住 sRGB,sRGB 有一小部分是在 NTSC 之外的。