如果你知道有关 RGB 颜色的任何信息,你知道(255、255、255)是颜色 白色的 8 位 RGB 三重。 但是,这三重体定义的实际 颜色 是什么?
答案可能令人惊讶:如果没有一些额外的信息,这个三重体没有定义任何特定的颜色! 任何 RGB 值的含义取决于 颜色空间。 如果我们不知道颜色空间,那么严格地说,我们不知道颜色。
颜色空间定义如何将给定颜色值的数值表示形式重现为物理光。 当视频在一个颜色空间中编码,但在另一个颜色空间中显示时,除非视频经过颜色更正,否则会导致颜色扭曲。 为了实现准确的颜色保真度,因此,了解源视频的颜色空间至关重要。 以前,Windows 中的视频管道未携带有关预期颜色空间的信息。 从 Windows Vista 开始,DirectShow 和 Media Foundation 都支持媒体类型中的扩展颜色信息。 此信息也可用于 DirectX 视频加速(DXVA)。
以数学方式描述颜色空间的标准方法是使用国际照明委员会(CIE)定义的 CIE XYZ 颜色空间。 直接在视频中使用 CIE XYZ 值并不实用,但在颜色空间之间转换时,CIE XYZ 颜色空间可用作中间表示形式。
若要准确重现颜色,需要以下信息:
- 颜色初选。 颜色初选定义 CIE XYZ 三元数值如何表示为 RGB 组件。 实际上,颜色初选定义了给定 RGB 值的“含义”。
- 传输函数。 传输函数是一个函数,可将线性 RGB 值转换为非线性 R'G'B' 值。 此函数也称为 gamma 更正。
- 传输矩阵。 传输矩阵定义 R'G'B' 如何转换为 Y'PbPr。
- 色度采样。 大多数 YUV 视频的分辨率在色度组件中传输的分辨率低于 luma。 色度采样由视频格式的 FOURCC 指示。 例如,YUY2 是一种 4:2:2 格式,这意味着色度样本水平采样的系数为 2。
- 色度坐着。 对色度进行采样时,色度样本相对于 luma 样本的位置决定了应如何内插缺失的样本。
- 名义范围。 名义范围定义如何将 Y'PbPr 值缩放到 Y'CbCr。
媒体类型中的颜色空间
DirectShow、Media Foundation 和 DirectX 视频加速(DXVA)都有不同的表示视频格式的方法。 幸运的是,很容易将颜色空间信息从一个转换为另一个,因为相关的枚举是相同的。
DXVA 1.0: DXVA_ExtendedFormat结构中 提供了颜色空间信息。
DXVA 2.0: DXVA2_ExtendedFormat 结构中提供了颜色空间信息。 此结构与 DXVA 1.0 结构相同,字段的含义相同。
DirectShow: VIDEOINFOHEADER2结构中 提供了颜色空间信息。 信息存储在 dwControlFlags 字段的上 24 位中。 如果存在颜色空间信息,请设置 dwControlFlags 中的AMCONTROL_COLORINFO_PRESENT标志。 设置此标志时, dwControlFlags 字段应解释为 DXVA_ExtendedFormat 结构,只是为 AMCONTROL_xxx 标志保留结构较低的 8 位。
视频捕获驱动程序: KS_VIDEOINFOHEADER2结构中 提供了颜色空间信息。 此结构与 VIDEOINFOHEADER2 结构相同,字段的含义相同。
媒体基础:颜色空间信息以媒体类型中的属性的形式存储:
颜色信息 特征 颜色初选 MF_MT_VIDEO_PRIMARIES 传输函数 MF_MT_TRANSFER_FUNCTION 传输矩阵 MF_MT_YUV_MATRIX 色度子采样 MF_MT_SUBTYPE
(由 FOURCC 提供,该 ID 存储在子类型 GUID 的第一个 DWORD 中。色度坐坐 MF_MT_VIDEO_CHROMA_SITING 名义范围 MF_MT_VIDEO_NOMINAL_RANGE
颜色空间转换
从一个 Y'CbCr 空间转换为另一个空间需要执行以下步骤。
反量化:使用源名义范围将 Y'CbCr 表示形式转换为 Y'PbPr 表示形式。
向上采样:通过内插色度值将采样的色度值转换为 4:4:4。
YUV 到 RGB 转换:使用源传输矩阵从 Y'PbPr 转换为非线性 R'G'B'。
逆传输函数:使用传输函数的反转函数将非线性 R'G'B' 转换为线性 RGB。
RGB 颜色空间转换:使用颜色初选从源 RGB 空间转换为目标 RGB 空间。
传输函数:使用目标传输函数将线性 RGB 转换为非线性 R'G'B。
RGB 到 YUV 转换:使用目标传输矩阵将 R'G'B' 转换为 Y'PbPr。
向下采样:通过筛选色度值将 4:4:4 转换为 4:2:2、4:2:0 或 4:1:1。
量化:使用目标名义范围将 Y'PbPr 转换为 Y'CbCr。
步骤 1-4 发生在源颜色空间中,步骤 6-9 发生在目标颜色空间中。 在实际实现中,中间步骤可以是近似步骤,相邻步骤可以组合在一起。 准确性与计算成本之间通常存在权衡。
例如,若要从 RT.601 转换为 RT.709,需要以下阶段:
反量化:Y'CbCr(601) 到 Y'PbPr(601)
向上采样:Y'PbPr(601)
YUV 到 RGB:Y'PbPr(601) 到 R'G'B'(601)
逆传输函数:R'G'B'(601) 到 RGB(601)
RGB 颜色空间转换:RGB(601) 到 RGB(709)
传输函数:RGB(709) 到 R'G'B'(709)
RGB 到 YUV:R'G'B'(709) 到 Y'PbPr(709)
向下采样:Y'PbPr(709)
量化:Y'PbPr(709) 到 Y'CbCr(709)
使用扩展颜色信息
若要在整个管道中保留颜色保真度,必须在源或解码器处引入颜色空间信息,并一直通过管道传送到接收器。
视频捕获设备
大多数模拟捕获设备在捕获视频时使用定义完善的颜色空间。 捕获驱动程序应提供包含颜色信息的 KS_VIDEOINFOHEADER2 格式块的格式。 为了向后兼容,驱动程序应接受不包含颜色信息的格式。 这将使驱动程序能够使用不接受扩展颜色信息的组件。
基于文件的源
分析视频文件时,媒体源(或 DirectShow 中的分析程序筛选器)可能可以提供一些颜色信息。 例如,DVD 导航器可以根据 DVD 内容确定颜色空间。 解码器可能提供其他颜色信息。 例如,MPEG-2 基本视频流提供sequence_display_extension字段中的颜色信息。 如果未在源中显式描述颜色信息,则可能由内容类型隐式定义。 例如,DV 视频的 NTSC 和 PAL 品种分别使用不同的颜色空间。 最后,解码器可以使用从源媒体类型获取的任何颜色信息。
其他组件
其他组件可能需要在媒体类型中使用颜色空间信息:
- 选择转换算法时,软件颜色空间转换器应使用颜色空间信息。
- 视频混音器(如增强的视频呈现器(EVR)混音器在混合不同类型的视频流时应使用颜色信息。
- DXVA 视频处理 API 和 DDI 使调用方能够指定颜色空间信息。 GPU 在执行硬件视频混合时应使用此信息。
相关主题