2.17. 详细色彩空间描述

2.17.1. 色彩空间 SMPTE 170M (V4L2_COLORSPACE_SMPTE170M)

SMPTE 170M 标准定义了 NTSC 和 PAL 以及一般 SDTV 使用的色彩空间。默认的传递函数是 V4L2_XFER_FUNC_709。默认的 Y’CbCr 编码是 V4L2_YCBCR_ENC_601。默认的 Y’CbCr 量化是有限范围。原色和白色参考的色度是

SMPTE 170M 色度

颜色

x

y

红色

0.630

0.340

绿色

0.310

0.595

蓝色

0.155

0.070

白色参考 (D65)

0.3127

0.3290

红色、绿色和蓝色的色度也通常被称为 SMPTE C 集,因此该色彩空间有时也称为 SMPTE C。

为 SMPTE 170M 定义的传递函数与 Rec. 709 中定义的相同。

L' = -1.099(-L)^{0.45} + 0.099 \text{, for } L \le-0.018

L' = 4.5L \text{, for } -0.018 < L < 0.018

L' = 1.099L^{0.45} - 0.099 \text{, for } L \ge 0.018

反向传递函数

L = -\left( \frac{L' - 0.099}{-1.099} \right) ^{\frac{1}{0.45}} \text{, for } L' \le -0.081

L = \frac{L'}{4.5} \text{, for } -0.081 < L' < 0.081

L = \left(\frac{L' + 0.099}{1.099}\right)^{\frac{1}{0.45} } \text{, for } L' \ge 0.081

使用以下 V4L2_YCBCR_ENC_601 编码获得亮度 (Y’) 和色差 (Cb 和 Cr)

Y' = 0.2990R' + 0.5870G' + 0.1140B'

Cb = -0.1687R' - 0.3313G' + 0.5B'

Cr = 0.5R' - 0.4187G' - 0.0813B'

Y’ 被钳位在 [0…1] 范围内,Cb 和 Cr 被钳位在 [-0.5…0.5] 范围内。这种到 Y’CbCr 的转换与 ITU BT.601 标准中定义的转换相同,该色彩空间有时也称为 BT.601,即使 BT.601 没有提及任何颜色原色。

默认量化是有限范围,但全范围也是可能的,尽管很少见。

2.17.2. 色彩空间 Rec. 709 (V4L2_COLORSPACE_REC709)

ITU BT.709 标准定义了 HDTV 一般使用的色彩空间。默认的传递函数是 V4L2_XFER_FUNC_709。默认的 Y’CbCr 编码是 V4L2_YCBCR_ENC_709。默认的 Y’CbCr 量化是有限范围。原色和白色参考的色度是

Rec. 709 色度

颜色

x

y

红色

0.640

0.330

绿色

0.300

0.600

蓝色

0.150

0.060

白色参考 (D65)

0.3127

0.3290

该标准的完整名称是 Rec. ITU-R BT.709-5。

传递函数。通常,L 的范围是 [0…1],但对于扩展色域 xvYCC 编码,允许该范围之外的值。

L' = -1.099(-L)^{0.45} + 0.099 \text{, for } L \le -0.018

L' = 4.5L \text{, for } -0.018 < L < 0.018

L' = 1.099L^{0.45} - 0.099 \text{, for } L \ge 0.018

反向传递函数

L = -\left( \frac{L' - 0.099}{-1.099} \right)^\frac{1}{0.45} \text{, for } L' \le -0.081

L = \frac{L'}{4.5}\text{, for } -0.081 < L' < 0.081

L = \left(\frac{L' + 0.099}{1.099}\right)^{\frac{1}{0.45} } \text{, for } L' \ge 0.081

使用以下 V4L2_YCBCR_ENC_709 编码获得亮度 (Y’) 和色差 (Cb 和 Cr)

Y' = 0.2126R' + 0.7152G' + 0.0722B'

Cb = -0.1146R' - 0.3854G' + 0.5B'

Cr = 0.5R' - 0.4542G' - 0.0458B'

Y’ 被钳位在 [0…1] 范围内,Cb 和 Cr 被钳位在 [-0.5…0.5] 范围内。

默认量化是有限范围,但全范围也是可能的,尽管很少见。

上面描述的 V4L2_YCBCR_ENC_709 编码是此色彩空间的默认编码,但可以使用 V4L2_YCBCR_ENC_601 覆盖它,在这种情况下,将使用 BT.601 Y’CbCr 编码。

此色彩空间还可以使用两种额外的扩展色域 Y’CbCr 编码

xvYCC 709 编码 (V4L2_YCBCR_ENC_XV709xvYCC) 与 Rec. 709 编码类似,但它允许 R’、G’ 和 B’ 的值超出 [0…1] 范围。根据有限范围公式缩放和偏移所得的 Y’、Cb 和 Cr 值

Y' = \frac{219}{256} * (0.2126R' + 0.7152G' + 0.0722B') + \frac{16}{256}

Cb = \frac{224}{256} * (-0.1146R' - 0.3854G' + 0.5B')

Cr = \frac{224}{256} * (0.5R' - 0.4542G' - 0.0458B')

xvYCC 601 编码 (V4L2_YCBCR_ENC_XV601xvYCC) 与 BT.601 编码类似,但它允许 R’、G’ 和 B’ 的值超出 [0…1] 范围。根据有限范围公式缩放和偏移所得的 Y’、Cb 和 Cr 值

Y' = \frac{219}{256} * (0.2990R' + 0.5870G' + 0.1140B') + \frac{16}{256}

Cb = \frac{224}{256} * (-0.1687R' - 0.3313G' + 0.5B')

Cr = \frac{224}{256} * (0.5R' - 0.4187G' - 0.0813B')

Y’ 被钳位在 [0…1] 范围内,Cb 和 Cr 被钳位在 [-0.5…0.5] 范围内,并进行量化,无需进一步缩放或偏移。可以通过选择 V4L2_YCBCR_ENC_XV709V4L2_YCBCR_ENC_XV601 来使用非标准 xvYCC 709 或 xvYCC 601 编码。从 xvYCC 公式可以看出,这些编码始终使用有限范围量化,没有全范围变体。这些扩展色域编码的重点在于,超出有限范围的值仍然有效,尽管它们映射到超出 [0…1] 范围的 R’、G’ 和 B’ 值,因此超出了 Rec. 709 色彩空间的色域。

2.17.3. 色彩空间 sRGB (V4L2_COLORSPACE_SRGB)

sRGB 标准定义了大多数网络摄像头和计算机图形使用的色彩空间。默认的传递函数是 V4L2_XFER_FUNC_SRGB。默认的 Y’CbCr 编码是 V4L2_YCBCR_ENC_601。默认的 Y’CbCr 量化是有限范围。

请注意,sYCC 标准指定了全范围量化,但是内核支持的所有当前捕获硬件都将 R’G’B’ 转换为有限范围的 Y’CbCr。因此,将全范围选择为默认值会破坏应用程序解释量化范围的方式。

原色和白色参考的色度是

sRGB 色度

颜色

x

y

红色

0.640

0.330

绿色

0.300

0.600

蓝色

0.150

0.060

白色参考 (D65)

0.3127

0.3290

这些色度与 Rec. 709 色彩空间相同。

传递函数。请注意,L 的负值仅由 Y’CbCr 转换使用。

L' = -1.055(-L)^{\frac{1}{2.4} } + 0.055\text{, for }L < -0.0031308

L' = 12.92L\text{, for }-0.0031308 \le L \le 0.0031308

L' = 1.055L ^{\frac{1}{2.4} } - 0.055\text{, for }0.0031308 < L \le 1

反向传递函数

L = -((-L' + 0.055) / 1.055) ^{2.4}\text{, for }L' < -0.04045

L = L' / 12.92\text{, for }-0.04045 \le L' \le 0.04045

L = ((L' + 0.055) / 1.055) ^{2.4}\text{, for }L' > 0.04045

根据 sYCC 的定义,使用以下 V4L2_YCBCR_ENC_601 编码获得亮度 (Y’) 和色差 (Cb 和 Cr)

Y' = 0.2990R' + 0.5870G' + 0.1140B'

Cb = -0.1687R' - 0.3313G' + 0.5B'

Cr = 0.5R' - 0.4187G' - 0.0813B'

Y’ 被钳位在 [0…1] 范围内,Cb 和 Cr 被钳位在 [-0.5…0.5] 范围内。此转换与 SMPTE 170M/BT.601 中定义的转换相同。Y’CbCr 量化是有限范围。

2.17.4. 色彩空间 opRGB (V4L2_COLORSPACE_OPRGB)

opRGB 标准定义了使用 opRGB 色彩空间的计算机图形使用的色彩空间。默认的传递函数是 V4L2_XFER_FUNC_OPRGB。默认的 Y’CbCr 编码是 V4L2_YCBCR_ENC_601。默认的 Y’CbCr 量化是有限范围。

请注意,opRGB 标准指定了全范围量化,但是内核支持的所有当前捕获硬件都将 R’G’B’ 转换为有限范围的 Y’CbCr。因此,将全范围选择为默认值会破坏应用程序解释量化范围的方式。

原色和白色参考的色度是

opRGB 色度

颜色

x

y

红色

0.6400

0.3300

绿色

0.2100

0.7100

蓝色

0.1500

0.0600

白色参考 (D65)

0.3127

0.3290

传递函数

L' = L ^{\frac{1}{2.19921875}}

反向传递函数

L = L'^{(2.19921875)}

使用以下 V4L2_YCBCR_ENC_601 编码获得亮度 (Y’) 和色差 (Cb 和 Cr)

Y' = 0.2990R' + 0.5870G' + 0.1140B'

Cb = -0.1687R' - 0.3313G' + 0.5B'

Cr = 0.5R' - 0.4187G' - 0.0813B'

Y’ 被钳位在 [0…1] 范围内,Cb 和 Cr 被钳位在 [-0.5…0.5] 范围内。此转换与 SMPTE 170M/BT.601 中定义的转换相同。Y’CbCr 量化是有限范围。

2.17.5. 色彩空间 BT.2020 (V4L2_COLORSPACE_BT2020)

ITU BT.2020 标准定义了超高清电视 (UHDTV) 使用的色彩空间。默认的传递函数是 V4L2_XFER_FUNC_709。默认的 Y’CbCr 编码是 V4L2_YCBCR_ENC_BT2020。默认的 Y’CbCr 量化是有限范围。原色和白色参考的色度是

BT.2020 色度

颜色

x

y

红色

0.708

0.292

绿色

0.170

0.797

蓝色

0.131

0.046

白色参考 (D65)

0.3127

0.3290

传递函数(与 Rec. 709 相同)

L' = 4.5L\text{, for }0 \le L < 0.018

L' = 1.099L ^{0.45} - 0.099\text{, for } 0.018 \le L \le 1

反向传递函数

L = L' / 4.5\text{, for } L' < 0.081

L = \left( \frac{L' + 0.099}{1.099}\right) ^{\frac{1}{0.45} }\text{, for } L' \ge 0.081

请注意,虽然 ITU BT.2020 标准将 Rec. 709 定义为默认传递函数,但在实践中,此色彩空间通常与 传递函数 SMPTE 2084 (V4L2_XFER_FUNC_SMPTE2084) 一起使用。特别是超高清蓝光光盘使用这种组合。

使用以下 V4L2_YCBCR_ENC_BT2020 编码获得亮度 (Y’) 和色差 (Cb 和 Cr)

Y' = 0.2627R' + 0.6780G' + 0.0593B'

Cb = -0.1396R' - 0.3604G' + 0.5B'

Cr = 0.5R' - 0.4598G' - 0.0402B'

Y’ 被钳位在 [0…1] 范围内,Cb 和 Cr 被钳位在 [-0.5…0.5] 范围内。Y’CbCr 量化是有限范围。

还有一种替代的恒定亮度 R’G’B’ 到 Yc’CbcCrc (V4L2_YCBCR_ENC_BT2020_CONST_LUM) 编码

亮度

\begin{align*}
Yc' = (0.2627R + 0.6780G + 0.0593B)'& \\
B' - Yc' \le 0:& \\
    &Cbc = (B' - Yc') / 1.9404 \\
B' - Yc' > 0: & \\
    &Cbc = (B' - Yc') / 1.5816 \\
R' - Yc' \le 0:& \\
    &Crc = (R' - Y') / 1.7184 \\
R' - Yc' > 0:& \\
    &Crc = (R' - Y') / 0.9936
\end{align*}

Yc’ 被钳位在 [0…1] 范围内,Cbc 和 Crc 被钳位在 [-0.5…0.5] 范围内。Yc’CbcCrc 量化是有限范围。

2.17.6. 色彩空间 DCI-P3 (V4L2_COLORSPACE_DCI_P3)

SMPTE RP 431-2 标准定义了使用 DCI-P3 色彩空间的电影放映机使用的色彩空间。默认的传递函数是 V4L2_XFER_FUNC_DCI_P3。默认的 Y’CbCr 编码是 V4L2_YCBCR_ENC_709。默认的 Y’CbCr 量化是有限范围。

注意

请注意,此色彩空间标准未指定 Y’CbCr 编码,因为它不打算编码为 Y’CbCr。因此,选择此默认 Y’CbCr 编码是因为它是 HDTV 编码。

原色和白色参考的色度是

DCI-P3 色度

颜色

x

y

红色

0.6800

0.3200

绿色

0.2650

0.6900

蓝色

0.1500

0.0600

白色参考

0.3140

0.3510

传递函数

L' = L^{\frac{1}{2.6}}

反向传递函数

L = L'^{(2.6)}

未指定 Y’CbCr 编码。V4L2 默认使用 Rec. 709。

2.17.7. 色彩空间 SMPTE 240M (V4L2_COLORSPACE_SMPTE240M)

SMPTE 240M 标准是高清电视早期(1988-1998 年)使用的一个临时标准。它已被 Rec. 709 取代。默认的传递函数是 V4L2_XFER_FUNC_SMPTE240M。默认的 Y’CbCr 编码是 V4L2_YCBCR_ENC_SMPTE240M。默认的 Y’CbCr 量化是有限范围。原色和白色参考的色度是

SMPTE 240M 色度

颜色

x

y

红色

0.630

0.340

绿色

0.310

0.595

蓝色

0.155

0.070

白色参考 (D65)

0.3127

0.3290

这些色度与 SMPTE 170M 色彩空间相同。

传递函数

L' = 4L\text{, for } 0 \le L < 0.0228

L' = 1.1115L ^{0.45} - 0.1115\text{, for } 0.0228 \le L \le 1

反向传递函数

L = \frac{L'}{4}\text{, for } 0 \le L' < 0.0913

L = \left( \frac{L' + 0.1115}{1.1115}\right) ^{\frac{1}{0.45} }\text{, for } L' \ge 0.0913

亮度 (Y’) 和色差 (Cb 和 Cr) 是通过以下 V4L2_YCBCR_ENC_SMPTE240M 编码获得的

Y' = 0.2122R' + 0.7013G' + 0.0865B'

Cb = -0.1161R' - 0.3839G' + 0.5B'

Cr = 0.5R' - 0.4451G' - 0.0549B'

Y’ 被钳位在 [0…1] 范围内,Cb 和 Cr 被钳位在 [-0.5…0.5] 范围内。Y’CbCr 量化是有限范围。

2.17.8. 色彩空间 NTSC 1953 (V4L2_COLORSPACE_470_SYSTEM_M)

此标准定义了 1953 年 NTSC 使用的色彩空间。实际上,此色彩空间已过时,应使用 SMPTE 170M 代替。默认的传递函数是 V4L2_XFER_FUNC_709。默认的 Y’CbCr 编码是 V4L2_YCBCR_ENC_601。默认的 Y’CbCr 量化是有限范围。原色和白色参考的色度是

NTSC 1953 色度

颜色

x

y

红色

0.67

0.33

绿色

0.21

0.71

蓝色

0.14

0.08

白色参考 (C)

0.310

0.316

注意

此色彩空间使用照明体 C 而不是 D65 作为白色参考。要正确地将此色彩空间中的图像转换为使用 D65 的另一个色彩空间,你需要应用一种色度适应算法,例如 Bradford 方法。

NTSC 1953 的传递函数从未被正确定义。文献中推荐使用 Rec. 709 传递函数。

L' = 4.5L\text{, for } 0 \le L < 0.018

L' = 1.099L ^{0.45} - 0.099\text{, for } 0.018 \le L \le 1

反向传递函数

L = \frac{L'}{4.5} \text{, for } L' < 0.081

L = \left( \frac{L' + 0.099}{1.099}\right) ^{\frac{1}{0.45} }\text{, for } L' \ge 0.081

使用以下 V4L2_YCBCR_ENC_601 编码获得亮度 (Y’) 和色差 (Cb 和 Cr)

Y' = 0.2990R' + 0.5870G' + 0.1140B'

Cb = -0.1687R' - 0.3313G' + 0.5B'

Cr = 0.5R' - 0.4187G' - 0.0813B'

Y’ 被限制在 [0…1] 的范围内,Cb 和 Cr 被限制在 [-0.5…0.5] 的范围内。Y’CbCr 量化是有限范围。此变换与 SMPTE 170M/BT.601 中定义的变换相同。

2.17.9. 色彩空间 EBU Tech. 3213 (V4L2_COLORSPACE_470_SYSTEM_BG)

EBU Tech 3213 标准定义了 1975 年 PAL/SECAM 使用的色彩空间。请注意,HDMI 接口不支持此色彩空间。相反,EBU Tech 3321 建议 HDMI 改用 Rec. 709。默认的传递函数是 V4L2_XFER_FUNC_709。默认的 Y’CbCr 编码是 V4L2_YCBCR_ENC_601。默认的 Y’CbCr 量化是有限范围。原色和白色参考的色度是

EBU Tech. 3213 色度

颜色

x

y

红色

0.64

0.33

绿色

0.29

0.60

蓝色

0.15

0.06

白色参考 (D65)

0.3127

0.3290

此色彩空间的传递函数从未被正确定义。文献中推荐使用 Rec. 709 传递函数。

L' = 4.5L\text{, for } 0 \le L < 0.018

L' = 1.099L ^{0.45} - 0.099\text{, for } 0.018 \le L \le 1

反向传递函数

L = \frac{L'}{4.5} \text{, for } L' < 0.081

L = \left(\frac{L' + 0.099}{1.099} \right) ^{\frac{1}{0.45} }\text{, for } L' \ge 0.081

使用以下 V4L2_YCBCR_ENC_601 编码获得亮度 (Y’) 和色差 (Cb 和 Cr)

Y' = 0.2990R' + 0.5870G' + 0.1140B'

Cb = -0.1687R' - 0.3313G' + 0.5B'

Cr = 0.5R' - 0.4187G' - 0.0813B'

Y’ 被限制在 [0…1] 的范围内,Cb 和 Cr 被限制在 [-0.5…0.5] 的范围内。Y’CbCr 量化是有限范围。此变换与 SMPTE 170M/BT.601 中定义的变换相同。

2.17.10. 色彩空间 JPEG (V4L2_COLORSPACE_JPEG)

此色彩空间定义了大多数(动态)JPEG 格式使用的色彩空间。原色和白色参考的色度与 sRGB 相同。使用的传递函数是 V4L2_XFER_FUNC_SRGB。Y’CbCr 编码是 V4L2_YCBCR_ENC_601,带有全范围量化,其中 Y’ 缩放到 [0…255],Cb/Cr 缩放到 [-128…128],然后裁剪到 [-128…127]。

注意

JPEG 标准实际上不存储色彩空间信息。因此,如果使用 sRGB 以外的其他色彩空间,则驱动程序必须明确设置该信息。实际上,V4L2_COLORSPACE_JPEG 可以被认为是 V4L2_COLORSPACE_SRGBV4L2_XFER_FUNC_SRGBV4L2_YCBCR_ENC_601V4L2_QUANTIZATION_FULL_RANGE 的缩写。

2.18. 详细传递函数描述

2.18.1. 传递函数 SMPTE 2084 (V4L2_XFER_FUNC_SMPTE2084)

SMPTE ST 2084 标准定义了高动态范围内容使用的传递函数。

常量

m1 = (2610 / 4096) / 4

m2 = (2523 / 4096) * 128

c1 = 3424 / 4096

c2 = (2413 / 4096) * 32

c3 = (2392 / 4096) * 32

传递函数

L’ = ((c1 + c2 * Lm1) / (1 + c3 * Lm1))m2

反向传递函数

L = (max(L’1/m2 - c1, 0) / (c2 - c3 * L’1/m2))1/m1

在 此传递函数 和 非 HDR 传递函数 之间转换时要小心:HDR 内容的线性 RGB 值 [0…1] 映射到 0 到 10000 cd/m2 的亮度范围,而非 HDR(又名标准动态范围或 SDR)的线性 RGB 值映射到 0 到 100 cd/m2 的亮度范围。

要从 SDR 转换为 HDR,你必须先将 L 除以 100。要朝另一个方向转换,你必须将 L 乘以 100。当然,这会将所有超过 100 cd/m2 的亮度值钳位到 100 cd/m2

有更好的方法,例如,请参阅 colimg 以获取有关此的更深入信息。