YUV 是一个颜色模型,通常用作彩色图像管道的一部分。它对彩色图像或视频进行编码时考虑到了人类的感知,与“直接”的 RGB 表示相比,允许减少色度分量的带宽。历史上,术语 YUV 和 Y’UV 用于电视系统中颜色信息的特定模拟编码。今天,YUV 这个术语在计算机行业通常用来描述使用 YCbCr 编码的色彩空间。
YUV 模型定义了一个亮度分量(Y),表示物理线性空间亮度,以及两个色度分量,分别称为 U(蓝色投影)和 V(红色投影)。它可以用于 RGB 模型和不同颜色空间之间的转换。
密切相关的 Y’UV 模型使用亮度分量(Y’)—— 非线性感知亮度,素数符号(‘)表示伽马校正。Y’UV 用于 PAL 模拟彩电标准(不包括 PAL-n)。之前的黑白系统只使用亮度(Y’)信息。彩色信息( U 和 V)通过子载波分别添加,使黑白接收机仍然能够接收和显示接收端原生黑白格式的彩色图像传输,而不需要额外的传输带宽。
至于 Y、Y’、U 和 V 均不是缩写。用字母 Y 表示亮度可以追溯到 XYZ 三原色的选择。这很自然地使得 luma(Y’) 中使用相同的字母,这近似于感知上均匀的亮度相关。同样,选择 U 和 V 是为了将 U 和 V 轴与其他空间(如 x 和 y 色度空间)区分开来。
伽马校正
实际上,研究表明,人类视觉系统是以对数函数的方式来感知光亮度。这意味着,人眼会提高暗部的敏感度,降低高光部分的敏感度。
从数学角度看,感知光强度和测量光强度之间存在一个近似的平方关系,具体如下式所示。
近似感知亮度=测量亮度近似感知亮度 = \sqrt{测量亮度} 近似感知亮度=测量亮度
由于人类视觉感知系统不是以线性方式工作的,因此必须使用非线性曲线来对线性数据进行变换,从而使得拍摄的图像色调与我们的视觉系统的工作方式相匹配。这个过程也就是我们所说的伽马校正。
Vout=AVinγV_{out} = AV_{in}^γ Vout=AVinγ
因此,在从线性 RGB 空间转换到非线性 RGB 空间时,需要 γ 作为转换参数。
一、背景
当工程师们希望在黑白基础设施中安装彩色电视时,Y’UV 就被发明了。他们需要一种既能与黑白电视兼容,又能添加色彩的信号传输方法。亮度分量已经作为黑白信号存在;他们将 UV 信号加入其中作为解决方案。
由于 U 和 V 是色差信号,因此选择了色度的 UV 表示而不是直接的 R 和 B 信号。换句话说,U 和 V 信号告诉电视在不改变亮度的情况下改变某个光点的颜色。或者,U 和 V 信号告诉显示器使得某个颜色亮度依某个基准偏移。U 和 V 值越高(或负值时越低),光点的饱和度(色彩)就越高。U 和 V 值越接近零,颜色偏移越小,这意味着红色、绿色和蓝色的光将更加明亮,产生一个灰色的点。这就是使用色差信号的好处,即它不是告诉颜色有多少红色,而是告诉它比绿色或蓝色多多少红色。反过来,这意味着当 U 和 V 信号为零或不存在时,它将显示一个灰度图像。如果要使用 R 和 B,即使在黑白场景中,它们也将具有非零值,需要所有三个数据携带信号。这在彩色电视的早期是很重要的,因为旧的黑白电视信号没有 U 和 V 信号存在,这意味着彩色电视只是当做黑白电视“开箱即用”。此外,黑白接收机可以接收 Y’ 色信号而忽略 U 和 V 色信号,使 Y’UV 向后兼容现有所有黑白设备的输入和输出。如果彩色电视标准没有使用色差信号,这可能意味着彩色电视会从黑白广播中产生奇怪的颜色,或者需要额外的电路将黑白信号转换为彩色。因为没有额外的可用带宽,有必要为色度信道分配一个较窄的带宽。如果一些亮度信息通过色度通道到达(就像使用 RB 信号而不是差分 UV 信号那样),黑白电视分辨率就会受到影响。
U-V 颜色平面的例子,Y’ 值 = 0.5,在 RGB 色域内表示:
下面是分别包含 Y’、U 和 V 分量的图像:
二、相关的颜色模型
术语 Y’UV、YUV、YCbCr、YPbPr 等的范围有时是模糊和重叠的。历史上,YUV 和 Y’UV 被用来指模拟电视系统。YCbCr 用于对颜色信息进行数字编码,以适应视频和图像的压缩和传输格式,如 MPEG 和 JPEG。同样,模拟分量视频中使用的 YPbPr 颜色模型有时也称为 Y’UV。
三、与 RGB 转换
Y’UV 信号通常由 RGB(红、绿、蓝)源创建。将 R、G 和 B 的加权值相加得到 Y’,Y’ 是整体亮度或亮度的度量。U 和 V 被计算为 Y’ 与 B 和 R 值之间的比例差。
SDTV(标准清晰度电视)与 BT.470
PAL 标准定义了以下常数,这些常数来自 BT.470(后来在 BT.601 中使用了称为矩阵系数的相同常数,尽管它使用了0.5 而不是 0.436 和 0.615):
Y’UV 中的 PAL 信号由 R’G’B’ 计算得到(只有 SECAM IV(SECAM 是三大彩色电视标准之一,其他则是欧洲 PAL 和北美 NTSC) 使用线性 RGB),如下所示:
Y’、U 和 V 的结果范围分别是 [0,1]、[−Umax, Umax] 和 [−Vmax, Vmax]。
将上面的转换应用于 Y’UV 转 RGB 上:
同样地,把这些常数的值(R’G’B’ 转 Y’UV 时需要将 Y’ 使用公式 (6) 展开)代入矩阵,就得到了 BT.470 System M (PAL)的公式:
对于较小的 Y’ 值,可能会得到 R、G 或 B 的负值,因此在实践中,我们将 RGB 结果规范在区间 [0,1] 内,或者在 Y’CbCr 中包含更准确的值。
HDTV(高清晰度数字电视)与 BT.709
对于高清晰度电视,ATSC 决定改变 WR 和 WB 的基本值,与之前在 SDTV 系统中选择的值相比。对于 HDTV,这些值由 Rec.709 提供。这个决定进一步影响了 Y’UV↔RGB 转换的矩阵,使其成员值也略有不同。因此,对于任何 RGB 三元组,SDTV 和 HDTV 通常有两种不同的 Y’UV 表示: SDTV-Y’UV 和 HDTV-Y’UV。这具体意味着,当直接在 SDTV 和 HDTV 之间转换时,亮度(Y’)信息大致相同,但色度(U & V)需要转换。
BT.709 定义了以下权重值:
BT.709 的模拟形式的转换矩阵如下,但没有证据表明它们曾经在实践中使用过:
R’G’B’ 与 Y’PbPr 转换
Y’CbCr 信号,在将信号转换为数字形式的缩放和偏移之前被称为 YPbPr,由相应的伽马调整 RGB(红、绿、蓝)源创建,使用三个定义的常数 KR、KG 和 KB:
其中 KR、KG 和 KB 通常由对应的 RGB 空间定义推导而来,需要满足:
等价的矩阵操作通常称为“颜色矩阵”(color matrix):
它的逆函数:
在这里,(‘)符号表示正在使用伽马校正,因此,R’、 G’ 和 B’ 的范围通常在 0 到 1 之间,0 代表最小强度(例如,用于显示黑色),1 代表最大强度(例如,用于显示白色)。得到的亮度(Y)值标称范围为从 0 到 1,色度(PB 和 PR)值标称范围为从 -0.5 到 +0.5。
Y’PbPr 转为 Y’CbCr
当以数字形式表示信号时,结果会被缩放和舍入,并且通常会加上偏移量。例如,根据规范(例如 MPEG-2)对 Y’ 组件进行缩放和偏移,在使用 8 位表示时,黑色的值为 16,白色的值为 235。该标准有 8 位数字化版本的 CB 和 CR,它们被缩放到 16 到 240 之间。因此,在 YCbCr 空间使用颜色矩阵或处理时,有时需要重新缩放分数 (235-16)/(240-16) = 219/224,当后续处理没有使用更高的比特深度时,会导致量化失真。
ITU-R BT.601 转换
用于数字组件视频的 ITU-R BT.601(原 CCIR 601)标准中为标准清晰度电视(SDTV)用途定义的 Y’CbCr 格式源自相应的 RGB 空间(ITU-R BT.470-6 System M primaries),这组系数上面已经提及过了,唯一的区别在于 Umax 和 Vmax 为 0.5,具体如下所示:
根据上述常数 ,可以推导出 ITU-R BT.601 的以下公式:
由模拟 R’G’B’ 推导出的模拟 Y’PbPr (代入 R’G’B’ 转 Y’PbPr 矩阵)如下:
数字 Y’CbCr(每个样本 8 位)由模拟 R’G’B’ 转化,如下所示:
以上的公式考虑了 Y’CbCr 分量上的偏移和缩放,具体地,Y’ 增加 16,而 Cb、Cr 由于范围为 [-0.5, 0.5],因此转化为 0 ~ 255 之间,需要加上偏移量 128,最后还需要考虑 235-16 = 219,240-16 = 224。也就是使用了如下公式:
Y’ 信号的最终范围为 16 ~ 235 (Cb 和 Cr 为 16 ~ 240);0 ~ 15 的值称为 footroom,236 ~ 255 的值称为 headroom。
另外,数字 Y’CbCr 也可以由数字R’d G’d B’d(每个样本 8 位,每位使用全量程,0 代表黑色,255 代表白色)根据以下公式导出:
在下面的公式中,缩放因子乘以(256/255)。这使得分母中的值 256 可以方便通过移位来计算,将上面的公式分子和分母同时乘以 (256/255)即可。
如果 R’d G’d B’d 数字源包括 footroom 和 headroom,则需要首先从每个信号中减去 footroom 偏移量 16,并在公式中包含比例因子 255/219。
不进行舍入,直接使用 ITU-R BT.601 推荐值的逆变换如下:
进一步以分母的值为 256 可得如下变换(比如 (255 / 219) * 256 = 298.0821917808219):
JPEG 转换
JFIF 使用 JPEG 支持修改的 Rec.601 Y’CbCr,其中 Y’,CB 和 CR 有完整的 8 位范围 [0…255]。下面是表示为六位小数精度的转换方程。注意,对于下面的公式,每个输入的范围(R,G,B)也是完整的 8 位范围 [0…255]。
逆变换如下:
基于 SDTV(ITU601)转 R’G’B’ 的另一个公式
R’、G’、B’ 的取值范围为 16 ~ 235,Y’ 的取值范围为 16 ~ 235,Cb/Cr 的取值范围为 16 ~ 240。 240 – 16 = 224,235 – 16 = 219。
逆变换如下:
进一步计算可得:
不少 OpenGL es GLSL 内部使用了这个公式从 YUV 转 RGB。根据上面谈及的 YUV 和 RGB 取值范围,这个公式输出的 RGB 取值范围是 16 ~ 235,而我们实际可能期望的是 0 ~ 255,也就是说转化公式其实用错了!
ITU-R BT.709 转换
ITU-R BT.709 标准规定了 Y’CbCr 的另一种形式,主要用于 HDTV。在一些面向计算机显示的应用程序中也使用了较新的形式,如 sRGB(但用于 YCbCr、sYCC 的 sRGB 形式的矩阵仍然是 BT.601)。在这种情况下,Kb 和 Kr 的值不同,但使用它们的公式是相同的。对于 ITU-R BT.709,常数如下:
这种形式的 Y’CbCr 是基于 RGB 模型,更符合较新的 CRT 和其他现代显示设备的荧光粉发射特性。BT.709的转换矩阵如下:
ITU-R BT.2020 转换
BT.2020-NCL 的解码矩阵有 14 位小数:
矩阵中较小的值没有舍入,它们是精确值。对于精度有限的系统(例如,8 或 10 位),可以使用上述矩阵的较低精度,例如,在小数点后仅保留 6 位。
四、YUV 格式
此处主要指 YCbCr。首先,我们可以将 YUV 格式按照数据大小分为三种格式:YUV 420、YUV 422 和 YUV 444。由于人眼对 Y 的敏感度远超于对 U 和 V 的敏感,所以有时候可以多个 Y 分量共用一组 UV,这样既可以极大得节省空间,又可以不太损失质量。这三种格式就是按照人眼的特性制定的。
- YUV 420,由 4 个 Y 分量共用一套 UV 分量
- YUV 422,由 2 个 Y 分量共用一套 UV 分量
- YUV 444,不共用,一个 Y 分量使用一套 UV 分量
按照 YUV 的排列方式,再次将 YUV 分成三个大类:Planar(平面)、Semi-Planar(半平面) 和 Packed(打包)。另外,Interleaved(交错) 是属于 Packed 的。
- Planar YUV 三个分量分开存放
- Semi-Planar Y 分量单独存放,UV 分量交错存放
- Packed YUV 三个分量全部交错存放
4.1 采样方式
YUV 图像的主流采样方式有如下三种:
- YUV 4:4:4 采样
- YUV 4:2:2 采样
- YUV 4:2:0 采样
YUV 4:4:4 采样,意味着 Y、U、V 三个分量的采样比例相同,因此在生成的图像里,每个像素的三个分量信息完整,都是 8 bit,也就是一个字节。
YUV 4:2:2 采样,意味着 UV 分量是 Y 分量采样的一半,Y 分量和 UV 分量按照 2:1 的比例采样。如果水平方向有 10 个像素点,那么采样了 10 个 Y 分量,而只采样了 5 个 UV 分量。
YUV 4:2:0 采样,并不是指只采样 U 分量而不采样 V 分量。而是指,在每一行扫描时,只扫描一种色度分量(U 或者 V),和 Y 分量按照 2:1 的方式采样。比如,第一行扫描时,YU 按照 2:1 的方式采样,那么第二行扫描时,YV 分量按照 2:1 的方式采样。对于每个色度分量来说,它的水平方向和竖直方向的采样和 Y 分量相比都是 2:1。
下面图中黑点表示采样该像素点的 Y 分量,以空心圆圈表示采用该像素点的 UV 分量。
4.2 具体格式
4.2.1 I420
I420 是 YUV 420 Planar 的一种,YUV 分量分别存放,先是 w * h 长度的 Y,后面跟 w * h * 0.25 长度的 U, 最后是 w * h * 0.25 长度的 V,总长度为 w * h * 1.5。
4.2.2 YV12
YV12 是 YUV 420 Planar 的一种,与 I420 唯一不同的是,YV12 是先 V 后 U。
4.2.3 NV12
NV12 是 YUV 420 Semi-Planar 的一种,Y 分量单独存放,UV 分量交错存放,UV 在排列的时候,从 U 开始(即 UVUV…)。总长度为 w * h * 1.5。
4.2.4 NV21
NV21 是 YUV 420 Semi-Planar 的一种,与 NV12 唯一不同的是,UV 在排列的时候,从 V 开始(即 VUVU…)。
假设一个分辨率为 6X4 的 YUV 图像(占用内存大小 6 ∗ 4 ∗ 1.5 = 36 字节),相同的背景色代表 Y 使用的 UV ,它们的 YUV 420 格式族如下图:
4.2.5 I422
I422 是 YUV 422 Planar 的一种,YUV 分量分别存放,先是 w * h 长度的 Y,后面跟 w * h * 0.5 长度的 U, 最后是 w * h * 0.5 长度的 V,总长度为 w * h * 2。
4.2.6 YV16
YV16 是 YUV 422 Planar 的一种,与 I422 唯一不同的是,YV16 是先 V 后 U。
4.2.7 NV16
NV16 是 YUV 422 Semi-Planar 的一种,Y 分量单独存放,UV 分量交错存放,UV 在排列的时候,从 U 开始(即 UVUV…)。总长度为 w * h * 2。
4.2.8 NV61
NV61 是 YUV 422 Semi-Planar 的一种,与 NV16 唯一不同的是,UV 在排列的时候,从 V 开始(即 VUVU…)。
4.2.9 YUVY
YUVY 属于 YUV 422 Interleaved 的一种。事实上,Interleaved 是属于 Packed 的,但是在 422 中,用 Interleaved 更加形象一些。在 Packed 内部,YUV 的排列顺序是 Y U V Y,两个 Y 共用一组 UV。
4.2.10 VYUY
VYUY 属于 YUV 422 Interleaved 的一种。在 Packed 内部,YUV 的排列顺序是 VYUY,两个 Y 共用一组 UV。
4.2.11 UYVY
UYVY 属于 YUV 422 Interleaved 的一种。在 Packed 内部,YUV 的排列顺序是 UYVY,两个 Y 共用一组 UV。
假设一个分辨率为 6X4 的 YUV 图像(占用内存大小 6 ∗ 4 ∗ 2 = 48 字节),相同的背景色代表 Y 使用的 UV ,它们的 YUV 422 格式族如下图:
4.2.12 I444
I444 属于 YUV 444 Plannar 的一种。YUV 分量分别存放,先是 w * h 长度的 Y,后面跟 w * h 长度的 U, 最后是 w * h 长度的 V,总长度为 w * h * 3。
4.2.13 YV24
YV24 属于 YUV 444 Plannar 的一种。与 I444 唯一不同的是,YV24 是先 V 后 U。
4.2.14 NV24
NV24 是 YUV 444 Semi-Planar 的一种,Y 分量单独存放,UV 分量交错存放,UV 在排列的时候,从 U 开始(即 UVUV…)。总长度为 w * h * 3。
4.2.15 NV42
NV42 是 YUV 444 Semi-Planar 的一种,与 NV24 唯一不同的是,UV 在排列的时候,从 V 开始(即 VUVU…)。
4.2.16 YUV 444 Packed
YUV 444 Packed 是 YUV 打包格式,YUV 排列方式为 YUV YUV YUV …,总长度为 w * h * 3。
假设一个分辨率为 6X4 的 YUV 图像(占用内存大小 6 ∗ 4 ∗ 3 = 72 字节),相同的背景色代表 Y 使用的 UV ,它们的 YUV 444 格式族如下图:
- https://handwiki.org/wiki/YUV
- https://handwiki.org/wiki/YCbCr
- https://zhuanlan.zhihu.com/p/498289926
- https://zhuanlan.zhihu.com/p/384455058