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

亮度 (Y') 和色差 (Cb 和 Cr) 通过以下 V4L2_YCBCR_ENC_601 编码获得:

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

亮度 (Y') 和色差 (Cb 和 Cr) 通过以下 V4L2_YCBCR_ENC_709 编码获得:

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

亮度 (Y') 和色差 (Cb 和 Cr) 通过 sYCC 定义的以下 V4L2_YCBCR_ENC_601 编码获得:

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)}

亮度 (Y') 和色差 (Cb 和 Cr) 通过以下 V4L2_YCBCR_ENC_601 编码获得:

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) 结合使用。特别是超高清蓝光光盘使用这种组合。

亮度 (Y') 和色差 (Cb 和 Cr) 通过以下 V4L2_YCBCR_ENC_BT2020 编码获得:

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 标准是 HDTV 早期(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)

此标准定义了 NTSC 在 1953 年使用的色彩空间。实际上,此色彩空间已过时,应改用 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

亮度 (Y') 和色差 (Cb 和 Cr) 通过以下 V4L2_YCBCR_ENC_601 编码获得:

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

亮度 (Y') 和色差 (Cb 和 Cr) 通过以下 V4L2_YCBCR_ENC_601 编码获得:

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)

此色彩空间定义了大多数 (Motion-)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