YUV 简介

示例图片和 YUV420 数据

图片和各分量的可视化

1.	左上:原始 RGB 图像(8x8 像素的红绿棋盘格)。
2.	右上:Y 分量(亮度),显示每个像素的灰度值。
3.	左下:U 分量(色度蓝),以 4:2:0 子采样后的灰度值表示。
4.	右下:V 分量(色度红),以 4:2:0 子采样后的灰度值表示。

YUV420 的具体数据

•	Y 分量(8x8 像素):

[[ 76.245, 149.685, 76.245, 149.685, 76.245, 149.685, 76.245, 149.685], [149.685, 76.245, 149.685, 76.245, 149.685, 76.245, 149.685, 76.245], [ 76.245, 149.685, 76.245, 149.685, 76.245, 149.685, 76.245, 149.685], [149.685, 76.245, 149.685, 76.245, 149.685, 76.245, 149.685, 76.245], [ 76.245, 149.685, 76.245, 149.685, 76.245, 149.685, 76.245, 149.685], [149.685, 76.245, 149.685, 76.245, 149.685, 76.245, 149.685, 76.245], [ 76.245, 149.685, 76.245, 149.685, 76.245, 149.685, 76.245, 149.685], [149.685, 76.245, 149.685, 76.245, 149.685, 76.245, 149.685, 76.245]]

•	U 分量(4x4 子采样):

[[90.48185, 90.48185, 90.48185, 90.48185], [90.48185, 90.48185, 90.48185, 90.48185], [90.48185, 90.48185, 90.48185, 90.48185], [90.48185, 90.48185, 90.48185, 90.48185]]

•	V 分量(4x4 子采样):

[[284.825, 284.825, 284.825, 284.825], [284.825, 284.825, 284.825, 284.825], [284.825, 284.825, 284.825, 284.825], [284.825, 284.825, 284.825, 284.825]]

数据解释

1.	Y 分量:
•	红色像素(较暗,亮度低):值约为 76。
•	绿色像素(较亮,亮度高):值约为 150。
2.	U 和 V 分量:
•	U 和 V 分量是每 2x2 像素块的平均值:
•	蓝色偏离量 U:约为 90(适中)。
•	红色偏离量 V:约为 285(较高)。

这种示例清晰展示了 RGB 到 YUV420 的转换过程,表明 YUV420 的色度信息是以较低分辨率存储的,这使得它适合视频压缩和存储。 

YUV420 的数据存储顺序和格式通常按照以下规则排列,以线性数据流的方式保存到文件中。具体顺序依赖于标准,但最常见的存储方法如下:

  1. 数据存储顺序

    1. Y 分量(亮度) • 按逐行顺序保存,包含每个像素点的亮度值。 • 大小为 (例如,128x128 图像保存 16,384 个字节)。
    2. U 分量(色度蓝) • 按照 4:2:0 的子采样,保存每 2×2 像素块中 U 分量的平均值。 • 大小为 。
    3. V 分量(色度红) • 同 U 分量,按 4:2:0 子采样保存每 2×2 像素块中 V 分量的平均值。 • 大小同样为 。
  2. 存储格式

内存布局

存储格式按顺序保存:

•	第一部分:亮度  数据。
•	第二部分:子采样的  数据。
•	第三部分:子采样的  数据。

文件示例(以 4×4 图像为例):

1.	Y 分量(16 个字节,逐行排列):

Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15

2.	U 分量(4 个字节,逐行排列):

U0 U1 U2 U3

3.	V 分量(4 个字节,逐行排列):

V0 V1 V2 V3

  1. 示例:如何存储到文件

示例代码

假设我们有一个 YUV420 数据的 4×4 图像:

import numpy as np

Dummy YUV data for a 4x4 image

Y = np.array([ [76, 149, 76, 149], [149, 76, 149, 76], [76, 149, 76, 149], [149, 76, 149, 76] ], dtype=np.uint8)

U = np.array([ [90, 90], [90, 90] ], dtype=np.uint8)

V = np.array([ [128, 128], [128, 128] ], dtype=np.uint8)

Save YUV420 to a file

with open(‘/mnt/data/output.yuv’, ‘wb’) as f: f.write(Y.tobytes()) # Write Y data f.write(U.tobytes()) # Write U data f.write(V.tobytes()) # Write V data

  1. 存储到文件后的数据顺序

以 YUV420 文件的内容为例:

1.	亮度 :

76 149 76 149 149 76 149 76 76 149 76 149 149 76 149 76

2.	色度蓝 :

90 90 90 90

3.	色度红 :

128 128 128 128

文件中存储顺序为:

76 149 76 149 149 76 149 76 76 149 76 149 149 76 149 76 90 90 90 90 128 128 128 128

  1. 存储的用途

    1. 视频编解码:YUV 数据直接传入 H.264/HEVC 等视频编码器。
    2. 帧存储:用于图像和视频帧的无压缩存储。

通过这种存储格式,可以紧凑地保存 YUV420 数据,减少色度存储所需的空间,同时保持视觉质量。