2.15. 颜色空间

“颜色”是一个非常复杂的概念,它取决于物理学、化学和生物学。仅仅因为您有三个数字来描述像素颜色的“红色”、“绿色”和“蓝色”分量,并不意味着您能够准确显示该颜色。颜色空间定义了 RGB 值(例如 255, 0, 0)的实际*含义*。也就是说,在完美校准的环境中,屏幕上应该再现哪种颜色。

为此,我们首先需要对颜色有一个清晰的定义,即以某种方式唯一且明确地定义一种颜色,以便其他人能够再现它。人类的颜色视觉是三色的,因为人眼具有对三种不同波长的光敏感的颜色感受器。因此需要使用三个数字来描述颜色。庆幸你不是一只螳螂虾,因为它们对 12 种不同的波长敏感,所以我们可能要使用 ABCDEFGHIJKL 颜色空间而不是 RGB...

颜色只存在于眼睛和大脑中,是颜色感受器受刺激强度的结果。这基于光谱功率分布 (SPD),它是一个图表,显示光在进入眼睛时,覆盖可见光谱的波长处的强度(辐射功率)。色度学是研究 SPD 与人脑感知颜色之间关系的科学。

由于人眼只有三个颜色感受器,因此即使光的 SPD 不同,不同的 SPD 也完全可能导致这些感受器产生相同的刺激,并被感知为相同的颜色。

在 20 世纪 20 年代,人们设计了实验来确定 SPD 与感知颜色之间的关系,由此产生了 CIE 1931 标准,该标准定义了模拟颜色感知的光谱加权函数。具体来说,该标准定义了可以接受 SPD 并计算每个颜色感受器刺激的函数。经过进一步的数学变换后,这些刺激被称为 *CIE XYZ 三刺激*值,这些 X、Y 和 Z 值明确地描述了人感知的颜色。这些 X、Y 和 Z 值都在 [0…1] 的范围内。

CIE XYZ 颜色空间中的 Y 值对应于亮度。CIE XYZ 颜色空间通常会转换为归一化的 CIE xyY 颜色空间

x = X / (X + Y + Z)

y = Y / (X + Y + Z)

x 和 y 值是色度坐标,可以用来定义不含亮度分量 Y 的颜色。这些颜色空间有如此相似的名称非常容易混淆。请注意,如果颜色用小写“x”和“y”指定,则使用 CIE xyY 颜色空间。大写“X”和“Y”指的是 CIE XYZ 颜色空间。此外,y 与亮度无关。x 和 y 一起指定颜色,而 Y 指定亮度。从实践角度来看,这就是您需要记住的全部内容。如果您感兴趣,本节末尾将提供更详细的阅读资源。

显示器或电视通过发射三种不同波长的光来再现颜色,这些光的组合将刺激眼睛中的颜色感受器,从而引起颜色感知。历史上,这些波长是由显示器中使用的红色、绿色和蓝色荧光粉定义的。这些*基色*是定义颜色空间的一部分。

不同的显示设备将具有不同的基色,并且某些基色比其他基色更适合某些显示技术。这导致了用于不同显示技术或用途的各种颜色空间。要定义一个颜色空间,您需要定义三个基色(这些通常定义为 CIE xyY 颜色空间中的 x, y 色度坐标),还需要定义白点参考:即当所有三个基色都处于最大功率时获得的颜色。这决定了基色的相对功率或能量。这通常选择接近日光,日光已被定义为 CIE D65 标准光源。

总结一下:CIE XYZ 颜色空间唯一地识别颜色。其他颜色空间由 CIE xyY 颜色空间中定义的三个色度坐标定义。基于这些坐标,可以构建一个 3x3 矩阵,将 CIE XYZ 颜色转换为新颜色空间中的颜色。

CIE XYZ 和源自特定色度基色的 RGB 颜色空间都是线性颜色空间。但无论是眼睛还是显示技术都不是线性的。将线性颜色空间中所有分量的值加倍,并不会被感知为两倍的颜色强度。因此,每个颜色空间还定义了一个传输函数,该函数将线性颜色分量值转换为非线性分量值,这与眼睛和显示器的非线性性能更匹配。线性分量值表示为 RGB,非线性分量值表示为 R’G’B’。通常,图形中使用的颜色都是 R’G’B’,除了使用线性 RGB 的 OpenGL。在处理 OpenGL 时应特别注意提供线性 RGB 颜色或使用内置的 OpenGL 支持来应用逆传输函数。

定义颜色空间的最后一部分是将非线性 R’G’B’ 转换为非线性 Y’CbCr 的函数。此函数由所谓的亮度系数确定。同一个颜色空间可能允许有多种 Y’CbCr 编码。许多颜色编码更倾向于使用亮度 (Y’) 和色度 (CbCr) 而不是 R’G’B’。由于人眼对亮度差异比对颜色差异更敏感,这种编码允许人们相对于亮度数据减少颜色信息量。请注意,亮度 (Y’) 与 CIE XYZ 颜色空间中的 Y 无关。另请注意,Y’CbCr 通常被称为 YCbCr 或 YUV,尽管严格来说这些称呼是错误的。

有时人们会将 Y’CbCr 误认为是颜色空间。这是不正确的,它只是将 R’G’B’ 颜色编码为亮度和色度值。与 R’G’B’ 颜色关联的底层颜色空间也与 Y’CbCr 颜色关联。

最后一步是 RGB、R’G’B’ 或 Y’CbCr 值如何量化。CIE XYZ 颜色空间中 X、Y 和 Z 在 [0…1] 范围内描述了人类可以感知的所有颜色,但转换为另一个颜色空间会产生超出 [0…1] 范围的颜色。一旦被限制在 [0…1] 范围内,这些颜色就无法在该颜色空间中再现。这种限制就是减少颜色空间范围或色域的原因。将 [0…1] 范围转换为 [0…255](或更高,取决于色深)范围内的整数值称为量化。这*不*是颜色空间定义的一部分。实际上,RGB 或 R’G’B’ 值是全范围的,即它们使用完整的 [0…255] 范围。另一方面,Y’CbCr 值是有限范围的,其中 Y’ 使用 [16…235],Cb 和 Cr 使用 [16…240]。

不幸的是,在某些情况下也使用了有限范围的 RGB,其中分量使用 [16…235] 范围。并且也存在使用 [0…255] 范围的全范围 Y’CbCr。

为了正确解释颜色,您需要知道量化范围、它是 R’G’B’ 还是 Y’CbCr、所使用的 Y’CbCr 编码以及颜色空间。根据这些信息,您可以计算出相应的 CIE XYZ 颜色,并再次将其映射到您的显示设备所使用的任何颜色空间。

颜色空间定义本身由三个色度基色、白点色度、传输函数以及将 R’G’B’ 转换为 Y’CbCr 所需的亮度系数组成。虽然一些颜色空间标准正确定义了所有这四个方面,但通常颜色空间标准只定义了其中一些,您必须依赖其他标准来补充缺失的部分。颜色空间通常是不同标准的混合体这一事实也导致了非常容易混淆的命名约定,其中标准名称被用来命名颜色空间,而实际上该标准也是其他各种颜色空间的一部分。

如果您想阅读更多关于颜色和颜色空间的信息,以下资源很有用:poynton 对视频工程师来说是一本很好的实用书籍,colimg 具有更广泛的范围,描述了颜色的更多方面(物理学、化学、生物学等)。http://www.brucelindbloom.com 网站是一个优秀的资源,尤其是在颜色空间转换背后的数学方面。维基百科的 CIE 1931 颜色空间 文章也很有用。