本次的文章参考知乎章佳杰的文章:
色彩空间基础
色彩空间表示与转换
基础
大部分人类的视网膜上有三种感知颜色的感光细胞,叫做锥细胞,分别对不同波长的光线敏感,称为L/M/S型细胞。
三种视锥细胞最敏感的波长分别是橙红色(长波,Long),绿色(中波,Medium),蓝色(短波,Short)。这三种视锥细胞的归一化感光曲线如下图:
大自然的这千千万万种颜色,在人类的眼里看到,最后传送到大脑里的信号,就只有这三种视锥细胞的电信号而已。根据这三种电信号的强弱,大脑解读成了不同的颜色。这就是三原色理论的生物学依据。
人类眼睛对不同颜色光线混合的反应是线性叠加的。
CIE RGB 色彩空间
使用三种颜色RGB叠加,三种颜色的强度分别为rgb,来模拟某个波长的颜色。
纯光谱色的混合叠加数据,就叫做色匹配函数。这个基准下定义的色彩空间,就是CIE RGB色彩空间。
通过色匹配函数(Color Matching Function, CMF),可以将任何一种物理上的光谱分布,转换到线性色彩空间中。
CIE XYZ 色彩空间
因为有部分出现了负数,在使用和计算上都有不方便,因此就对这个匹配函数进行了一下线性变换,变换到一个所有分量都是正的空间中。变换后的色彩空间就是 CIE XYZ 色彩空间。
从线性空间的角度理解色彩空间
人类的色视觉,是相当于在自然界所有颜色的无穷维函数空间中取了一个三维的投影。这个三维空间的基底,既可以是视锥细胞的感光特性曲线(我们的大脑就用的是这套),当然也可以是选取三种颜色的光进行组合(CIE RGB 空间),甚至还可以是用实际中不存在的「光线」进行组合 (CIE XYZ 空间)。
既然这几个空间实际上是同一个线性空间,只不过由于选择了不同的基底而有不同的表达形式,那么根据线性代数的结论,这几个空间的表述形式之间,只需要通过矩阵乘法就可以完成转换,这是完全的线性变换。
设备相关的RGB色彩空间
如前文所述,色彩空间的基底的选择有一定的任意性。事实上,如果允许真正的减法存在,那么选择哪三种颜色作为基底是无关紧要的。不过由于实际中我们不能对色光采用减法,只能使用「锥组合」而非「线性组合」,这时候到底如何选取基底就显得重要了。好的基底不仅能表达的颜色更丰富,而且工程上也易于稳定地实现。
CIE XYZ空间是一个很方便的线性空间,与具体的设备无关,因此经常用来做各种颜色空间转换的中间媒介。
要想要某个颜色的光,经过色匹配函数的计算,得到了XYZ的值,如果直接将这三个值作为RGB颜色显示到屏幕上,显然是不对的。必须将XYZ的值转换到RGB空间中的值。
得到线性RGB空间的表示之后,还需要经过伽马校正,才是最终在屏幕上显示的RGB的值。
对于 RGB 色彩空间来说,关键点在于两个:1. 如何选择三个作为基底的颜色;2. 如何定义白色。一旦选好这两个关键参数,那么从 CIE XYZ 空间到设备的 RGB 空间的转换就完全确定了。我们平时常说的 sRGB 空间和 Adobe RGB 空间,他们的区别就在于这两个关键参数的定义不同。
不同的RGB色彩空间所能表示的颜色的范围是不一样的,即使是相同的RGB分量,在不同的RGB空间中所代表的颜色也是不一样的。
很多的数码相机都可以设置色彩空间,常见的有Adobe RGB和sRGB,sRGB是目前屏幕显示的事实标准,大多数屏幕都在sRGB内。
色彩椎体
如果把纯光谱色画在 CIE XYZ 空间中,得到下图这样的曲线。
连接原点与这条曲线得到的无数条射线,包围出来一个「锥体」,这个锥体就是人所能感知的所有色彩。
这个曲线在三维空间中是一个极度扭曲的曲线,不论是用来展示还是辅助计算都不方便。我们可以将这条曲线投影到x+y+z=1的平面(上图中的黄色平面)上,进行归一化。在这个归一化的平面上,光谱色曲线就是一条形状像是舌头的曲线。这个舌头形状的图,就叫「色品图(Chromaticity Diagram)」,所有纯光谱色,构成色品图的边界。在上面那个图中从上往下看,黄色平面上,色品图(的边界)是这个样子的:
图中蓝色数字标明了纯光谱色对应的波长。
XYZ空间到RGB空间的转换
之前的文章说到,定义一个 RGB 空间,关键在于两个参数:
1. RGB 三点的坐标;
2. 白色点的位置。
这里就以 sRGB 空间为例,说说如何根据这两个参数确定转换关系的。
根据定义,sRGB 的三原色以及白色点的 XYZ 坐标是:
白色点的意义在于校准三原色在向量空降中的长度,使得当 RGB = (1, 1, 1) 的时候正好对应的是白色。也就是列出这个方程:
W=wrR+wgG+wbB W = w r R + w g G + w b B
或者写成矩阵形式
W=[R,G,B]w W = [ R , G , B ] w
求解出 wr w r , wg w g , wb w b 各个系数。这是个三元一次方程,在计算机上非常容易求解,即使手工求解也不难。
w=[R,G,B]−1W