本文来自ICCV 2019的tutorial:“Understanding color & the in-camera image processing pipeline for computer vision”,详细介绍请见这里。
算不上翻译,演绎了不少,希望大家能够结合原pdf甄别地看,欢迎提出疑问。
前面已经介绍了色彩空间相关的知识,这一篇将会介绍其他色彩方面的知识,包括【色彩适应与白平衡】和【sRGB与其他色彩空间】。
【色彩适应与白平衡】
之前说到,我们已经可以使用三个值(如CIE XYZ)来表示色彩了,但在现实场景中,我们看到的颜色是由物体的反射特性和场景光照共同决定的,而在之前的例子中我们都默认是纯白光照或者干脆就是单色光,这会带来什么影响呢?我们来看下面这个例子。
图中的苹果在不同的光照环境下有着不同的SPD,也表现出不同的颜色,但对于在场景中的观察者来说,却能看到一样的红色。
再举个例子,在这张图中,左右两边加上了不同的滤镜来模拟不同的光照,但虽然屋顶左右两部分的颜色有差别,我们却能感觉到屋顶应该是白色的(能吧?)
这个视觉系统适应场景光照的能力被称为色彩恒定或者色彩适应(Color constancy/chromatic adaptation)。这个能力并不完美,但用起来相当不错。
然而,图像传感器却没有这种能力,要想将场景光照的影响去除,必须经过一定的处理步骤,这就是白平衡。
不过在那之前,我们需要找到一个描述光源的办法,于是引出了色温。
色温的概念来自于黑体辐射理论。可以简单地将该理论理解为,对于一个理想的黑体,其发射出来的电磁辐射仅和它的温度相关。
于是我们得到了一个映射,将温度(以开尔文为单位)映射到黑体辐射的电磁波谱,而这个电磁波谱在可见光的区域看起来的效果就可以用来描述光源。
由于这里的温度指的是黑体的温度,而不是光源的,因此比起温度,我们实际上更应该说**相对色温(Correlated Color Temperature, CCT)**以表示区分。
上面这张图给出了色温和光源的对照表,可能有些反直觉的是色温越低反而看起来越暖,还是那句话,这里的温度指的是理想黑体的温度,并不是你心里的温度 \手动doge。
为了方便描述,CIE建立了几种合成的SPD来作为真实光源的代表,编号列举如下:
A 钨丝灯
B 正午的阳光
C 白天日光平均值
D 不同色温下具有代表性的自然日光(5000K,5500K,6500K),一般写作D50,D55,D65
E 理想的具有恒定SPD的等能量光源,并不代表任何真实光源,但和D55类似
F 系列:模拟了各种荧光台灯(一共12个)
在我们购买灯泡的时候可能会见到这些参数。
在色彩空间里,认为光源的SPD对应着白色的点,所以色彩适应的本质就是将不同光照下场景的白点变得相同。
这张图里,曲线上的这些颜色其实都是某种场景里的“白色”。
接下来看一个最简单的色彩恒定处理(Von Kries transform)。(LMS)1和(LMS)2分别指不同场景下三种视锥细胞的刺激值,而带下标W则指的是该场景下白点对应的刺激值。
这样,我们就把场景1中的三刺激值转换到场景2中了,从而排除了光源的影响。来看一个实例。
可以看到,我们先定义场景中的白色,再将他们调整得一样,这样不同场景的颜色看起来和谐多了。
【sRGB与其他色彩空间】
好,那么到此为止我们是不是搞定颜色了呢?
快了快了(真的)。
尽管CIE XYZ是一个权威的色彩空间,但图像和设备却很少直接使用XYZ。这主要是因为XYZ本身并不代表颜色,所以留下了很多空,在工业上还是更愿意使用RGB空间,虽然无法表示所有颜色,但容易控制和理解。而为了让不同厂商的设备能够有个统一标准,于是sRGB诞生了。
1996年,微软和惠普定义了一系列RGB三原色:
R=CIE xyY (0.64, 0.33, 0.2126)
G=CIE xyY (0.30, 0.60, 0.7153)
B=CIE xyY (0.15, 0.06, 0.0721)
他们认为这是当时大多数设备能够达到的RGB空间。
而白色点被设定为D65光源。
注意,指定白点是一件重要的事,这意味着sRGB是在假设了观看条件的前提下建立的(6500K 日光)。每当我们把CIE XYZ映射到一个色彩空间时,都需要指定白点。
上图是sRGB映射在CIE xy色度图上的效果(不过之前说过,不建议在CIE xy上看…)。
上图就是CIE XYZ到线性sRGB的转换矩阵(这个过程中舍弃负值)。
为什么这里要说线性?因为到了这一步还不够,从线性sRGB到sRGB还有一步伽马矫正。
什么是伽马矫正呢?
可以看这样一个例子:
这有两张图,每张图上有两个色块,你们感觉哪张图中上色块是下色块亮度的一半?
这个例子来自https://www.cambridgeincolour.com/tutorials/gamma-correction.htm,网页上有对伽马矫正详细的介绍,简单来说,之所以会有伽马变换,是因为人眼对于光亮度变化的感知是非线性的。和相机(感光器)相比,我们对于暗光中的变化要比亮光中更加敏感,这让我们能够在遇到户外强光时得到一定的保护。而显示的目的是为了再现人的感受,因此要进行调节。
刚才的A图就是经过伽马矫正的后的,因此A图展现的是人眼中亮度的一半,而B图展示的是物理上强度的一半。(和你的感受一致吗?)
上式名为Stevens’ power law,就是用于描述这一现象的模型。I就是输入图像的刺激值,S就是经过处理后,符合人感受图像的刺激值。当a取小于1的正数,就是由相机的色彩空间向人的感受转换(编码),当a取大于1时,就是其逆变换(解码)。不同的模型会对系数采用不同的值,在sRGB中,a取2.2。
除了sRGB,还有NTSC、Adobe RGB等各种各样的标准色彩空间,他们的范围各不相同,但他们都来自CIE XYZ空间。
注意,这里面的“Y”不尽相同。
这之后又出现了其他各种各样的色彩空间,他们为了不同的目的而设计。
CIE LAB 色彩空间
这个色彩空间是为了得到一个感知均匀的色彩空间。虽然CIE XYZ空间提供了一种辐射SPD和色彩感知之间的映射,但在CIE XYZ空间中均匀的变化并不是感知上均匀的变化。如图,图中每个椭圆展示了人眼感受类似的区域(椭圆进行了放大)。
密
恐
警
告
CIE Lab 将CIE转化成了一个色彩和亮度变化更加均匀的色彩空间,L表示亮度,a和b张成的平面表示色相。下图展示了ab平面上的颜色。
Y’UV Y’IQ Y’CrCb 色彩空间
这些空间是将RGB空间分解成 “类亮度”组成和色度组成,注意,这些色彩空间里的Y并不是在linear-sRGB或者linear-NTSC里定义的,他们定义在伽马编码的sRGB和NTSC色彩空间里。按理说应该写成Y’以避免误会,但一般会写成Y。(把YUV、YIQ、YCrCb中的Y当成CIE XYZ中的Y是计算机视觉会议中一个常见的错误)。这样的空间下可以直接丢弃U和V来得到灰度级别的图像,可以用于黑白和彩色电视共用的信号。
最后再来介绍一下色差。
CIE在2000年基于CIE LAB定义了色彩误差矩阵,它返回一个在0-100的色彩误差。也会被称为CIE DE2000、CIE DE、ΔE、Delta E、DE。误差的参考量表如下:
一般来说 2或者更小的色差是比较好的,它意味着除非一个标准观测者非常近距离地观察,否则无法区分出两个颜色。
好!
色彩速成班到此结束,接下来可以正式地研究相机了!