本文参考自 A Beginner’s Guide to (CIE) ColorimetryColor: From Hexcodes to Eyeballs,感谢Chandler AbrahamJamie Wong的分享。
本站适用CC 4.0国际许可协议

下图是对整篇文章的概况,我们接下来会一点点的解释图中每一个部分的意义。

Color: From Hexcodes to Eyeballs

一个简单的问题: 为什么我们看到background-color: #9B51E0会是这种特别的紫色呢?

Purple

我原以为我早已知道答案,可是当我检查自己的理解时,发现事实远非想象的那么简单。 通过对电磁辐射,光学生物学,色度学和显示硬件的探索,我希望开始填补其中的一些空白。 如果你想跳过, 请参照下面的目录,这是我们将要覆盖的知识点:

首先,让我们从物理学开始吧。

电磁辐射

无论是无线电波,微波,红外线,可见光,紫外线,X射线,还是伽马射线,它们都是电磁辐射的形式。 虽然这些东西都有不同的名称,但其实这些名称只标记了电磁波谱内的不同波长范围而已。

The electromagnetic spectrum
电磁辐射的波长

最小的电磁辐射单位是光子。一个光子中所包含的能量与其相应波的频率成比例,频波越高,能量越大。 要真正理解颜色,我们需要先了解辐射。 让我们先来仔细看看白炽灯泡的辐射。


Photo by Alex Iby

你可能想知道灯泡散发出多少能量。 物体的辐射通量(radiant flux)$ \Phi_e $ 是每秒发射的总能量,以瓦特(Watts)为单位测量。 100W白炽灯泡的辐射通量约为80W,其余20W直接转换为非辐射热量。

如果我们想知道每个波长有多少能量,我们可以看一下光谱通量(spectral flux)。 物体的光谱通量( $ \Phi_{e,\lambda} $ )是每单位波长的辐射通量,并且通常以瓦特/纳米测量。如果我们将白炽灯泡的光谱通量绘制为波长的函数,它可能看起来像这样:

该曲线下的面积表示辐射通量。 作为等式,$\Phi_e=\int_0^{\infty} \Phi_{e,\lambda}^{bulb}(\lambda)d{\lambda} $。 在这种情况下,曲线下面积约为80W。

你很可能已经从环保运动中听说白炽灯泡效率相当的低下,不过看了这组数据之后,你也许会觉得:“还好吧,80%看起来也不那么糟糕”。 没错!白炽灯泡确实非常有效地将电能转换为了辐射。 但不幸的是,这是将电能转换为人类可见辐射(即可见光)的效率则低得可怕。

可见光

可见光是波长范围从380nm到750nm的电磁辐射。 在我们的白炽灯泡的光谱通量图上,可见光是下面的阴影区域。

OK,可见光谱内的辐射能量为8.7W,对于一个100W的灯泡来说效率仅为8.7%, 这看起来太糟糕了。 不过坏消息还在后头呢! 为了理解原因,让我们考虑一下为什么可见光是可见的

人体感知亮度

就如同白炽灯泡并不是在所有波长下都会有同等的辐射量一样,我们的眼睛也并不是对所有波长的辐射都具有同样的敏感度。 如果我们测量人眼对每个波长的敏感度,我们就会得到光度函数(luminosity function)。 标准光度函数$\bar{y}(\lambda)$如下所示:

该发光度函数的界限定义了可见光的范围。 超出此范围的任何东西都是不可见的,因为我们的眼睛对它根本不敏感! 曲线还表明,我们的眼睛对550nm处的辐射比对650nm或450nm处的辐射更敏感。 其他动物的眼睛对不同波长范围敏感,因此具有不同的光度函数。 鸟类可以看到$\lambda$= 300nm 到$\lambda$=400nm$ 范围内的紫外线辐射,所以如果让鸟类来定义电磁波谱 ,那么紫外线也将成为他们“可见光”范围的一部分!

通过将光谱通量图与光度函数$\bar{y}(\lambda)$相乘,我们得到一个函数,该函数描述了光源发出的每个波长对人类感知亮度的影响。

上图中通过光谱通量与光度函数相乘得到的结果就叫光谱光通量(spectal luminous flux) $\Phi_{v,\lambda}$。 为了强调这是关于人类的主观感知而不是客观能量,我们通常使用流明(lumens)而不是瓦特(Watts)来测量光通量。 两者之间的转换比率是683.002lm/W。

$$\Phi_{v,\lambda}(\lambda) = 683.002\frac{lm}{W}\cdot\bar{y}(\lambda) \cdot\Phi_{v,\lambda}(\lambda)$$

光源的光通量(luminous flux, $\Phi_v$)是人类能感知到的该光源的总功率。 就像我们通过采用光谱通量曲线下的面积来计算辐射通量一样,我们可以通过瓦特到流明的恒定转换,从获取光谱光通量曲线下的面积来计算光通量,:

$$\Phi_{v}^{bulb}=\int_0^{\infty}\bar{y}(\lambda) \cdot \Phi_{v,\lambda}^{bulb}(\lambda)d\lambda=683.002\frac{lm}{W} \cdot 2.4W \approx 1600lm$$

因此,我们100W白炽灯泡的光通量仅为2.4W或1600lm! 即灯泡的发光效率为2.4%,这与将电能转换为辐射80%的效率相差甚远! 如果我们有一个光源能将其发射的能量集中到可见范围内,我们就能够获得更高效的照明。 让我们比较一下白炽灯,荧光灯和LED灯泡的光谱:

事实上,我们可以感知到的荧光灯或led灯泡发射的辐射远远少于人类无法看到的波长。 如果白炽灯泡的效率可能达到1-3%的话,那么荧光灯泡的效率可以达到10%左右,而LED灯泡的效率则可高达20%!

关于亮度就讲到这里,让我们回到这篇文章的焦点:颜色!

量化颜色

人们是如何识别颜色的呢? 举个例子,如果我面前有个柠檬,我怎么能通过电话告诉你它是什么颜色? 我也许会告诉你“柠檬是黄色的”,但到底是哪种黄色呢? 而你如何精确地识别这些黄色呢?

在已经知道了颜色是人类对电磁辐射的一种“翻译”后,我们可能会试图通过光谱通量在数学上去定义颜色。 任何人类可见颜色都是单色(单波长)颜色的一些加权组合。 单色(Monochromatic)也称为光谱色(spectral color)。对于任何给定的物体,我们可以测量其发射(或反射)的光谱,并使用它来精确识别颜色。 如果我们可以重现光谱,我们当然可以重现颜色!

从柠檬上的点反射的阳光可能具有如下所示的反射光谱:

注意:到达你眼睛的辐射的功率和光谱分布将取决于1)光源的功率和光谱,2)光源与被照物体的距离,3)物体的大小和形状,4)吸收光谱物体的距离,以及5)物体的距离。如果以光源为基准,需要考虑的因素很多,所以让我们只关注当光线进入到你的眼睛时会发生什么。我们现在也忽视单位,仅仅专注于概念。

当具有这种光谱分布的能量照射到我们的眼睛时,我们将其视为“黄色”。OK,现在让我们说我拍一张柠檬的照片并将其上传到我的电脑。接下来,我仔细调整屏幕上的颜色,直到自己察觉不出屏幕上的柠檬与实际的柠檬在颜色上有何不同为止。

如果你要测量屏幕上的光谱功率分布,你希望分布看起来像什么?你可能会预测它看起来与实际的柠檬的反射光谱相似。但它实际上看起来像这样:

Emission Spectrum

同样的颜色,屏幕发射的光谱和实际柠檬的光谱竟然完全不一样!这怎么可能呢? 对于人类观察者来说,这种肉眼看起来相同但实际不同的光谱功率分布称为同色异谱(Metamerism)。为了理解这种现象,让我们先来看看关于眼睛的生物学。

光学生物学

我们眼中称为“棒”和“锥体”的特殊细胞感应光的刺激。 棒细胞在低光照条件下占主导地位,并且在色觉方面不起作用,因此我们将重点放在视锥细胞上。

人类通常有3种视锥细胞。 这三种不同的视锥细胞使人类感知到“三原色”。 然而,有极少数的人有更多种的视锥细胞,甚至可以分辨上亿种颜色,他们被称为Tetrachromats! 其他动物的视锥细胞的种类可能更多, 比如螳螂虾就有十六种不同的锥体。

这三种视锥细胞分别感应不同但又部分重叠的光谱。如果我们将每种视锥细胞用它们感知的光波长范围来标记,可以得到下图。根据能够感知的波长,这三种视锥细胞分别被称为“S(Short)”,“M(Median)”和“L(Long)”。

Human cone Sensitivites

上图中的三条曲线分别表示相应锥体对每个波长的敏感程度。 每条曲线上的最高点称为“峰值波长”,表示对于该锥体最敏感的辐射波长。

知道了眼睛的感光原理,现在再让我们回过头来看看刚才的疑问:为何完全不一样的光谱竟然在肉眼看来是一样的? 视锥细胞又是如何处理手中柠檬的光线的?

通过观察曲线之下的区域,我们可以看到每种视锥细胞接收了多少真实柠檬反射的辐射。 在这种情况下,S,M和L锥的标准化后的值分别为0.02,0.12和0.16。 现在让我们重复屏幕上柠檬的过程。

如上图所示,尽管到达眼睛的辐射光谱完全不同,但视锥细胞接收到的刺激是相同的(S = 0.02,M = 0.12,L = 0.16)。 这就是为什么真正的柠檬和屏幕上的柠檬在我们看来是一样的!

我们的3组视锥细胞将任何光谱通量$\Phi_e(\lambda)$曲线简化为包含三个数字(S,M,L)的三元组,而每个不同的(S,M,L)三元组都对应着不同的颜色! 这非常方便,因为(0.02,0.12,0.16)这样的三元组交流起来比复杂的连续函数要容易得多。利用数字,我们的眼睛正将一个无限维空间的问题简化到三维!

事实上,这个(S,M,L)三元组是我们色彩空间的第一个例子。

色彩空间

色彩空间允许我们用数字精度定义我们正在谈论的颜色。 在上一节中,我们看到特定的黄色可以在SML颜色空间中表示为(0.02,0.12,0.16),这通常被称为LMS颜色空间

因为这个颜色空间用视锥细胞的刺激来描述色彩,所以根据定义,任何人类可见颜色都可以用正LMS坐标表示(不包括非常罕见的四色人,他们需要四个坐标而不是三个坐标)。

但是,这个色彩空间有个缺点,即并非所有的三元组在物理上都是可能的。 我们来考虑一下LMS坐标(0,1,0)。 为了物理上真实地实现这个坐标所代表的颜色,我们需要找到一些刺激M锥体而不刺激L或S锥体的方法。 如下图所示,因为M锥的灵敏度曲线在所有波长上与L或S锥都有重叠,所以这个颜色根本不可能存在!

这个事实的一个副作用就是,仅增加一种视锥细胞的刺激是非常困难的。 而这,将使LMS颜色空间无法成为构建显示硬件的理想选择。

另一个历史问题是视锥细胞的灵敏度直到20世纪90年代才被准确地测定,并且需要开发出数学上精确的颜色模型。 这方面的第一个重大进展是在1920年代后期才出现的。

Wright和Guild的配色实验

在20世纪20年代后期,William David Wright和John Guild进行了实验,根据3种特定波长的光的强度来精确定义颜色。

即使他们可能不知道眼睛中的三类视锥细胞,但至少在一百年前就提出了一个超前的想法,即所有可见颜色都可以作为三种颜色的组合而产生。

Wright&Guild的想法是构建一种装置,通过三个固定波长光源的组合来重建颜色, 该装置看起来像这样:

如上图,实验者将底部的灯设置为目标波长(例如,600nm),然后一边观察测试对象,一边小心地调整三盏固定波长的灯的功率,直到上下的颜色看起来完全一样为止。这样我们就能用三原色(红绿蓝)来定义600nm的波长。接下来目标波长每5nm就重复以上过程,我们就能得到一个为重建特定波长所需红(700nm),绿(546nm),蓝(435nm)光的强度的曲线。 这些曲线所对应的函数就称为color matching function(CMF)。 这些函数用$\bar{r}(\lambda)$, $\bar{g}(\lambda)$, $\bar{b}(\lambda)$来表示。

CIE 1931 RGB color matching functions

这样我们就能用一个简单的三元组(R,G,B)来表示一个特定的纯光谱的颜色,比如光谱600nm就可用(0.34, 0.062, 0.00)来表示。这个值就来自CIE 1931 RGB 色彩空间(CIE 1931 RGB color space)

等等,大家看看下图里虚线标出的位置,红色的数值怎么成了负数?这意味着什么呢?

CIE 1931 RGB color matching functions

为了回答这些问题,我们需要用更好的方式来可视化色彩空间。

色彩空间和色度的可视化

到目前为止,在我们的2D图形中一直用横轴来表示波长。而现在我们试着在3D坐标里绘制(R,G,B)。
3D plot

RGB plot

色域和光谱轨迹

#CIE XYZ色彩空间

#屏幕的子像素

#sRGB

#sRGB十六进制码

#伽玛校正

#从十六进制码到眼球

#关于亮度设置的简要说明

#拾遗

#参考文献
(未完待续)