彩色空间基础知识
彩色空间基础
从人类的视网膜说起
大部分人类的视网膜上有三种感知颜色的感光细胞,叫做视锥细胞,分别对不同波长的光线敏感,称为 L/M/S 型细胞。
三种视锥细胞最敏感的波长分别是橙红色(长波,Long),绿色(中波,Medium),蓝色(短波,Short)。这三种视锥细胞的归一化感光曲线如下图所示。
总之,大自然的这千千万万种颜色,在人类的眼里看到,最后传送到大脑里的信号,就只有这三种视锥细胞的电信号而已。根据这三种电信号的强弱,大脑解读成了不同的颜色。这就是三原色理论的生物学依据。
不仅如此,人类眼睛对不同颜色光线混合的反应还是 线性 的。根据 格拉斯曼定律(Grassmann’s Law),两束不同颜色的光 和 ,假设某个视锥细胞对他们的反应分别是 和 ,现在将他们按照一个比例混合,得到第三种颜色 ,那么视锥细胞对这个混合颜色的反应也将是前两个反应的线性叠加 。
格拉斯曼定律是一个实验规律,并没有物理或者生物学上的依据。然而这个规律大大简化了我们对人类彩色视觉系统的建模,并且给我们使用线性代数理论分析人类彩色视觉系统提供了一个前提和基础。
色匹配函数
前面已经提到,人类视网膜上有三种感知色彩的视锥细胞,所以理论上我们用三种颜色的光就可以混合出自然界中任何一种颜色来。在 20 世纪 20 年代,David Wright 和 John Guild 各自独立地领导了一些实验,通过三种颜色的光源进行匹配,得到了人眼对于不同颜色光的匹配函数。此后,多名科学家多次进行了类似的实验,加深了我们对人类彩色视觉的认识。
实验过程大致是这样的,把一个屏幕用不透光的挡板分割成两个区域,左边照射某个被测试的颜色的光线,这里记为 (以下用大写字母表明颜色,用小写字母表明分量大小),右边同时用三种颜色的光同时照射,这里记为 ,,。然后,调节右边三种颜色光源的强度,直到左右两边的颜色看上去一样为止。假设这个时候三种颜色的光源强度分别为 ,,,那么根据光色叠加的线性性质,我们可以写出
也就是说,只要按照 (r,g,b) 的分量来混合 (R,G,B) 三种颜色的光,就可以得到 C 这个颜色的光。
也就是说,只要按照 的分量来混合 三种颜色的光,就可以得到 这个颜色的光。于是在这一系列实验里,科学家们把左边的颜色按着光谱顺序,挨个测试了一遍,得到了纯光谱色的混合叠加的数据,这就是 色匹配函数(Color Matching Function),并且在这个基准下定义的色彩空间,就是 CIE RGB 色彩空间。
下图是 CIE RGB 的色匹配函数曲线。
浅色的细线代表实验中不同参与者个人的色匹配函数曲线,中间深色的粗线代表数据的平均值。
可以看到,曲线上出现了负数,这是怎么回事?回想一下前面描述的实验过程,左边是被测试的光色,右边是可调节的三色光的混合。如果碰到一种情况,右边三色光无论如何调节比例,都不能混合出左边的颜色,比如某种颜色的光强度已经减小为 0 了,然而看趋势还需要继续减小才能与左边的光色相匹配,怎么办?这时候需要往左边的光色中混入三色光中的一种或者几种,继续调节,直到两边的颜色匹配。在左边(被测试)的色光中添加,那就是相当于在右边的混合光中减去,这就导致了色匹配函数曲线上出现了负数。实际上,这相当于就是光线的「减法」了。
比如,对于 的黄色光,色匹配函数的值是 ,意味着将 份的红光与 份的绿光混合放在右边,左边放上 1 份的 的黄光,以及 份的蓝光,这样左右两边的光色看上去就一样了。
因为有部分出现了负数,在使用和计算上都有不方便,因此就对这个匹配函数进行了一下线性变换,变换到一个所有分量都是正的空间中。变换后的色彩空间就是 CIE XYZ 色彩空间。
CIE RGB 色彩空间和 CIE XYZ 色彩空间是完全等价的,两者只是差了一个线性变换。由于允许「减法」的存在,因此 CIE RGB 空间是能够表示所有颜色的;同样的,CIE XYZ 空间也能。
从线性空间的角度理解色彩空间
以上的实验基础提示我们,色彩空间和线性代数中的线性空间之间具有某种相似性。我们可以看到,由于人类有三种感知色彩的视锥细胞,自然界千千万万的色彩被眼睛接收后,可以用三个数值来表征。而格拉斯曼定律也揭示了色彩叠加的线性性质。这似乎意味着,色彩空间就是一个3维的线性空间。事实上也的确如此。
自然界本身是没有「颜色」这个属性的,只有对不同波长光线的反射率/透过率,到达人眼中的,显然是一个连续的光谱分布函数。数学上,这是一个无穷维的函数空间(巴拿赫空间)。而人眼内的三种视锥细胞,它们的感光特性曲线相当于是在这个无穷维的函数空间中建立了三个基底。任何一个光谱分布进来,三种视锥细胞被激发。由于色视觉响应的线性性,这一过程相当于光谱分布函数与三个基底做内积,或者说,「投影」到这三个基底上。
从这个观点看,人类的色视觉,是相当于在自然界所有颜色的无穷维函数空间中取了一个三维的投影。这个三维空间的基底,既可以是视锥细胞的感光特性曲线(我们的大脑就用的是这套),当然也可以是选取三种颜色的光进行组合(CIE RGB 空间),甚至还可以是用实际中不存在的「光线」进行组合 (CIE XYZ 空间)。既然这几个空间实际上是同一个线性空间,只不过由于选择了不同的基底而有不同的表达形式,那么根据线性代数的结论,这几个空间的表述形式之间,只需要通过矩阵乘法就可以完成转换,这是完全的线性变换。
当然,色彩空间并不是真正数学意义上的三维线性空间。由于不存在真正数学意义的「减法」,在实际应用中是有所限制的。数学中的「线性组合」在这里就要被替换为「锥组合」,也就是每个分量都必须是大于等于 0 的。
为什么是三原色?因为人类对色彩的感知结果位于一个三维的线性空间中。最少需要三种颜色的光才能有足够的表达能力来表现各种颜色。为什么选 RGB 作为三原色?因为色彩空间不是真正数学意义上的线性空间,从工程角度考虑,以 RGB 作为三原色,能让显示器能够显示更多的颜色(此外,最初测试人眼对 RGB 三色光的色匹配曲线,也是希望能尽量单独地刺激三种视锥细胞)。
设备相关的 RGB 色彩空间
如前文所述,色彩空间的基底的选择有一定的任意性。事实上,如果允许真正的减法存在,那么选择哪三种颜色作为基底是无关紧要的。不过由于实际中我们不能对色光采用减法,只能使用「锥组合」而非「线性组合」,这时候到底如何选取基底就显得重要了。好的基底不仅能表达的颜色更丰富,而且工程上也易于稳定地实现。
由于 CIE XYZ 空间是一个很方便的线性空间,与具体设备无关,因此常用来做各种颜色空间转换的中间媒介。设想某个颜色的光,经过色匹配函数的计算,得到了三个 XYZ 的值,如果直接将这三个值作为 RGB 颜色显示到屏幕上,显然是不对的。我们必须把 XYZ 的值转换到屏幕的 RGB 空间中的值。
这里下标 代表线性空间,是转换矩阵。得到线性 RGB 空间的表达之后,还需要经过 gamma 校正,才是最终在屏幕上显示的 RGB 的值。一般的 gamma 校正过程为 ,其中代表 RGB 的某个分量,值通常为2.2。
对于 RGB 色彩空间来说,关键点在于两个:1. 如何选择三个作为基底的颜色;2. 如何定义白色。一旦选好这两个关键参数,那么从 CIE XYZ 空间到设备的 RGB 空间的转换就完全确定了。我们平时常说的 sRGB 空间和 Adobe RGB 空间,他们的区别就在于这两个关键参数的定义不同。常用的的 RGB 空间的转换矩阵如下表:
不同的 RGB 空间能表示的范围如下图所示:
可以看到,不同的 RGB 空间所能表示的颜色范围是不一样的,并且我们可以推断出,即使是同样的 RGB 分量,在不同的 RGB 空间中所代表的颜色也是不一样的。所以我们在描述一个 RGB 颜色的时候,不仅需要描述它的 RGB 三个分量,还要说明是在哪个空间,这就是 ICC 文件的作用。
很多数码相机都可以设置色彩空间,常见的有 sRGB 和 Adobe RGB,从上面的图中我们可以看到, Adobe RGB 所能表达的色彩比 sRGB 要丰富很多。然而常见的网络环境下图片的色彩空间是 sRGB,有很多浏览器不能正确地解析图片自带的色彩空间说明,默认按照 sRGB 来进行解析。
如果使用相机直出的 JPG 文件直接上传,或者说在后期处理过程中没有进行色彩空间转换,保留了相机设置的 Adobe RGB 空间,那么在浏览器中看到的图片很可能与 Photoshop 中看到的不一样。浏览器很可能会将一张 Adobe RGB 空间中的图片解释为 sRGB 空间下的图片,引起颜色偏差。由于 sRGB 是目前屏幕显示的「事实标准」,大多数屏幕空间都在 sRGB 内(这是颜色复现设备本身决定的),所以,对用于网络交流目的的图片,统一转换到 sRGB 中进行保存。
有关色彩空间是线性空间的数学论证
显然,交换不同色光叠加的顺序并不会改变叠加的结果。
加法零元就是全黑,什么光都没有。任何一种色光叠加一个全黑那还是它自身。
回想前文对实验中需要「负数」数量的光的处理手法,我们可以在左边叠加光线,这就相当于在右边减去光线。如果承认这种形式的「减法」,那么加法逆元也是顺理成章了:在另一边加入自身。
这也很明显,数字 1 就可以作为乘法幺元。
根据格拉斯曼定律,这一点也是实际上成立的。
综上所述,人类对色彩的感知在实验层面满足线性性质,人眼感知的色彩空间是一个3维线性空间。当然,容易想见,通常我们选取的基底(比如 CIE XYZ 空间的色匹配函数),是不正交的。
彩色空间表示与转换
我们看到人类的色视觉可以用一个三维的线性空间表示,人类对色彩的感知,相当于是在光谱分布这样一个无穷维的函数空间(巴拿赫空间)中,进行了一个三维投影。在此基础上,简单介绍了两个重要的线性色彩空间, CIE 1931 RGB 和 CIE 1931 XYZ,这两个色彩空间包含了所有人类可以感知的色彩。通过色匹配函数(Color Matching Function, CMF),可以将任何一种物理上的光谱分布,转换到线性色彩空间中。
虽然是同样一个线性空间,由于选取的基底不同,表示的形式也会不同,表达能力和方便程度也会有所不同。为了不同的用途和目的,人们发展了很多不同的线性色彩空间的表达形式。此外,人类的色视觉在某些方面还存在一定程度的非线性,所以在线性色彩空间基础上人们又发展了一些非线性的色彩空间。
由于 CIE RGB 和 CIE XYZ 两者其实是同一个线性空间的不同表达,因此两者的转换可以通过转换矩阵实现。
接下来会详细描述中间的计算过程:
1 CIE RGB 和 CIE XYZ
以色匹配函数作为基底,将物理上的光谱分布投影到三维空间中,就可以得到 CIE RGB 和 CIE XYZ 色彩空间。 CIE RGB 的色匹配函数(归一化后)是这样的:
注意这里进行了归一化处理,因此曲线与上一篇文章中的曲线形状有变化。
为了消除部分负数坐标,我们变换到 CIE XYZ 空间,满足一些约束条件:
1.所有坐标都是正的保持等能点(equal energy point)作为白色
2.使得新的 Y 坐标能够代表明度,也就是使得新的 Y 坐标等于视觉的明度响应
3.使得新的 Z 坐标在红光端保持为 0
4.使得所有色彩尽可能充满新的空间
在这些约束条件下,CIE 委员会设计了这两个空间之间最初的转换矩阵:
以及反变换的矩阵
虽然最开始是从 CIE RGB 转换到 CIE XYZ 空间的,但之后由于历史原因和技术原因,使得 CIE XYZ 空间更为广泛接受,逐渐作为更常用的转换空间。在最新的官方资料中,只保留了 XYZ 空间的色匹配函数,已经没有 RGB 空间的色匹配函数了。
色品图(Chromaticity Diagram)
那么,各个颜色在 CIE XYZ 空间中是怎么分布的呢?由于实际中不可能有光线的减法,所有的运算都是「锥组合」,因此可以想见实际所有可能的颜色,在 XYZ 空间中应该位于一个以原点为顶点的 「锥体」中(比如 xyz 三个正半轴围起来的第一卦限就是一个锥体)。我们把 CIE XYZ 空间切片看看(左右两列是从两个不同的视角进行观察):
可以感受到约靠近原点的切片越小,这正是锥体的表现。然而这个锥体到底是什么形状呢?如果把纯光谱色画在 CIE XYZ 空间中,得到下图这样的曲线。连接原点与这条曲线得到的无数条射线,包围出来一个「锥体」,这个锥体就是人所能感知的所有色彩。注意与上图(尤其是右侧一列,与下图视角接近)比较,可以清楚地看到红色一侧和蓝紫色一侧围出的倾斜的边界。
然而这个曲线毕竟在三维空间中,是一条极度扭曲的曲线,不论是用来展示还是用于辅助计算都不方便。我们可以将这条曲线投影到 的平面上(上图中的黄色平面)进行「归一化」,在这个归一化的平面上,光谱色曲线就是一条形状像舌头的曲线,如上图所示位于黄色平面上的弯曲的曲线。根据格拉斯曼定律,所有的颜色都是由纯光谱色混合而来的,经过投影后只能是光谱色的「锥组合」,都会落在这个曲线范围内。这个舌头形状的图,就叫「色品图(Chromaticity Diagram)」,所有纯光谱色,构成色品图的边界。在上面那个图中从上往下看,黄色平面上,色品图(的边界)是这个样子的:
图中蓝色数字标明了纯光谱色对应的波长。