on
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 的数据存储顺序和格式通常按照以下规则排列,以线性数据流的方式保存到文件中。具体顺序依赖于标准,但最常见的存储方法如下:
-
数据存储顺序
- Y 分量(亮度) • 按逐行顺序保存,包含每个像素点的亮度值。 • 大小为 (例如,128x128 图像保存 16,384 个字节)。
- U 分量(色度蓝) • 按照 4:2:0 的子采样,保存每 2×2 像素块中 U 分量的平均值。 • 大小为 。
- V 分量(色度红) • 同 U 分量,按 4:2:0 子采样保存每 2×2 像素块中 V 分量的平均值。 • 大小同样为 。
-
存储格式
内存布局
存储格式按顺序保存:
• 第一部分:亮度  数据。
• 第二部分:子采样的  数据。
• 第三部分:子采样的  数据。
文件示例(以 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
- 示例:如何存储到文件
示例代码
假设我们有一个 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
- 存储到文件后的数据顺序
以 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
-
存储的用途
- 视频编解码:YUV 数据直接传入 H.264/HEVC 等视频编码器。
- 帧存储:用于图像和视频帧的无压缩存储。
通过这种存储格式,可以紧凑地保存 YUV420 数据,减少色度存储所需的空间,同时保持视觉质量。