2.15. 色彩空间¶
“颜色”是一个非常复杂的概念,它取决于物理、化学和生物学。仅仅因为您有三个数字来描述像素颜色的“红色”、“绿色”和“蓝色”分量,并不意味着您可以准确地显示该颜色。色彩空间定义了 RGB 值(例如 (255, 0, 0))的实际意义。也就是说,在完美校准的环境中,屏幕上应该再现哪种颜色。
为了做到这一点,我们首先需要对颜色有一个很好的定义,即某种唯一且明确地定义颜色的方法,以便其他人可以重现它。人类的颜色视觉是三色的,因为人眼有对三种不同波长的光敏感的颜色受体。因此需要使用三个数字来描述颜色。很高兴您不是螳螂虾,因为它们对 12 种不同的波长敏感,因此我们将使用 ABCDEFGHIJKL 色彩空间而不是 RGB ...
颜色只存在于眼睛和大脑中,是颜色受体受到刺激的强度的结果。这是基于光谱功率分布(SPD),这是一个图表,显示进入眼睛时可见光谱范围内光强度的辐射功率。色彩学是关于 SPD 与人脑感知的颜色之间的关系。
由于人眼只有三种颜色受体,因此完全有可能不同的 SPD 会导致对这些受体的相同刺激,并且被感知为相同的颜色,即使光的 SPD 不同。
在 1920 年代,人们设计了实验来确定 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',除了 openGL 使用线性 RGB。在处理 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 色彩空间 文章也非常有用。