一文搞懂 YUV 图像:格式、采样、NV12/NV21 区别全解析
做音视频开发、相机开发、编解码时,
YUV是绕不开的基础知识。本文用最通俗的方式,帮你快速搞懂
YUV是什么、YUV420为什么最常见、NV12/NV21/I420/YV12到底有什么区别。
1. 什么是 YUV?
YUV 是一种颜色编码方式。 和 RGB 直接表示红绿蓝不同,YUV 把颜色拆成了:
Y:亮度(明暗信息)U / V:色度(颜色信息)
你可以简单理解为:
Y决定图像清不清楚,UV决定颜色准不准。
2. 为什么会有 YUV?
YUV 的核心思想是:
- 保留亮度细节
- 适当压缩颜色信息
因为人眼对亮度更敏感,对颜色变化没那么敏感。所以工程上常常这样做:
Y保持完整U/V适当减少采样
这样可以显著降低:
- 存储空间
- 传输带宽
- 编码压力
3. YUV 和 RGB 的区别
RGB
每个像素都包含 R G B
显示直观
数据量较大
YUV
Y 表示亮度
U/V 表示色度
可对色度降采样
更适合视频采集 编码 传输
直观理解
| 编码方式 | 含义 | 特点 |
|---|---|---|
| RGB | 红绿蓝直接表示颜色 | 适合显示,数据量较大 |
| YUV | 亮度 + 色度 | 适合采集、压缩、视频处理 |
4. YUV 最核心的点:UV 可以降采样
理解 YUV,关键不是 Y,而是 U/V 被压缩了多少。
常见采样方式有三种:
YUV444YUV422YUV420
5. 三种采样方式怎么理解?
5.1 YUV444
每个像素都有完整的:
YUV
也就是说,每个像素的亮度和颜色信息都完整保留。
5.2 YUV422
每 2 个像素共享一组 U/V。也就是:
Y不变U/V水平方向减半
5.3 YUV420
每 4 个像素共享一组 U/V。也就是:
Y不变U/V在水平和垂直方向都减半
6. 用图看懂 444 / 422 / 420
6.1 YUV444
Y
U
V
Y
U
V
Y
U
V
Y
U
V
每个像素一组完整 YUV,画质最好,空间最大。
6.2 YUV422
像素1:Y
共享U/V
像素2:Y
像素3:Y
共享U/V
像素4:Y
每 2 个像素共用一组 U/V。
6.3 YUV420
2x2像素块
Y1
Y2
Y3
Y4
共享1组U
共享1组V
每个 2×2 像素块,共享一组 U/V,这也是最常见的方案。
7. 三种采样方式对比表
| 采样格式 | 含义 | 每像素大小 | 特点 |
|---|---|---|---|
| YUV444 | 每像素独立 YUV | 3 字节 | 画质最好,体积最大 |
| YUV422 | 每 2 像素共享 UV | 2 字节 | 折中方案 |
| YUV420 | 每 4 像素共享 UV | 1.5 字节 | 最常见,最省空间 |
8. 为什么 YUV420 最常见?
因为它在画质和空间之间平衡最好。以 1920 × 1080 为例:
RGB24
text
1920 × 1080 × 3 ≈ 6MB
YUV420
text
1920 × 1080 × 1.5 ≈ 3MB
结论:
YUV420 大约只需要 RGB24 一半的空间。
所以它被广泛用于:
- 摄像头输出
- 视频编码
- 移动端图像处理
- 音视频传输
9. YUV 按存储方式又分什么?
除了采样方式,YUV 还常按内存布局分为:
Packed(打包)Planar(平面)Semi-Planar(半平面)
10. 一张图看懂存储方式
YUV存储方式
Packed 打包
Planar 平面
Semi-Planar 半平面
YUYV 交错存储
Y一块 U一块 V一块
Y一块 UV交错一块
11. Packed、Planar、Semi-Planar 分别是什么?
11.1 Packed(打包格式)
Y/U/V 数据交错在一起存储。
例如:
text
Y0 U0 Y1 V0
代表:
- 两个像素共享一组
U/V - 数据是交错排列的
典型格式:YUYV
11.2 Planar(平面格式)
Y、U、V 各自放在独立区域。
例如:
text
YYYYYYYY
UU
VV
典型格式:
I420YV12
11.3 Semi-Planar(半平面格式)
Y 单独放一块,UV 交错放一块。
例如:
text
YYYYYYYY
UVUVUVUV
典型格式:
NV12NV21
12. 常见格式重点解析
12.1 YUYV
- 属于
YUV422 - 属于
Packed
排列方式:
text
Y0 U0 Y1 V0
Y2 U1 Y3 V1
特点:
- 每两个像素共享一组
U/V - 常见于某些摄像头输出
12.2 I420 / YU12
- 属于
YUV420 - 属于
Planar
存储顺序:
text
YYYYYYYY
UU
VV
即:
- 先
Y - 再
U - 再
V
12.3 YV12
- 属于
YUV420 - 属于
Planar
存储顺序:
text
YYYYYYYY
VV
UU
和 I420 的唯一区别就是:
U 和 V 的顺序反了。
12.4 NV12
- 属于
YUV420 - 属于
Semi-Planar
存储顺序:
text
YYYYYYYY
UVUVUVUV
即:
Y单独一块UV交错一块
12.5 NV21
- 属于
YUV420 - 属于
Semi-Planar
存储顺序:
text
YYYYYYYY
VUVUVUVU
和 NV12 的区别就是:
NV12 是 UV,NV21 是 VU。
13. 一张总图看懂常见格式差异
YUV常见格式
YUYV
I420 / YU12
YV12
NV12
NV21
YUV422
Packed
Y U Y V
YUV420
Planar
Y + U + V
YUV420
Planar
Y + V + U
YUV420
Semi-Planar
Y + UV
YUV420
Semi-Planar
Y + VU
14. 一张表记住所有重点
| 格式 | 采样方式 | 存储方式 | 排列特点 |
|---|---|---|---|
| YUYV | YUV422 | Packed | YUYV 交错 |
| I420 / YU12 | YUV420 | Planar | Y + U + V |
| YV12 | YUV420 | Planar | Y + V + U |
| NV12 | YUV420 | Semi-Planar | Y + UVUV |
| NV21 | YUV420 | Semi-Planar | Y + VUVU |
15. YUV420 为什么总要"特殊处理"?
因为在 YUV420 中:
- Y 是满分辨率
- UV 是低分辨率
所以做图像处理时,不能像 RGB 一样直接三通道一起处理。特别是在这些操作里:
- 旋转
- 缩放
- 裁剪
都要分别考虑:
Y平面怎么处理UV平面怎么处理UV的采样对齐问题
16. 用图看懂 YUV420 的采样关系
2x2像素区域
Y1
Y2
Y3
Y4
1个U
1个V
也就是说:
| 区域 | Y 数量 | U 数量 | V 数量 |
|---|---|---|---|
| 2×2 像素块 | 4 | 1 | 1 |
这就是为什么:
UV不能随便拆- 裁剪时要偶数对齐
- 缩放时
UV也必须同步处理
17. YUV 图像处理中的三个关键操作
17.1 旋转
YUV 图像旋转时,一般要:
-
单独旋转
Y平面 -
单独旋转
UV平面注意:
-
90° / 270°时,宽高会交换 -
NV21中UV是VU顺序,不能弄反
旋转时的重点
原图
旋转Y平面
旋转UV平面
合成结果
17.2 缩放
缩放时:
Y按完整分辨率处理UV按低分辨率处理
如果只处理Y,不处理UV,结果就是:- 黑白轮廓正常
- 颜色完全错乱
17.3 裁剪
裁剪时最大坑点是:
起始坐标最好是偶数。
例如:
x_offset为偶数y_offset为偶数
原因很简单:UV对应的是2×2区域- 从奇数位置裁剪,
UV就可能错位
18. 记忆口诀
如果你只想快速记住,背这几句就够了:
text
Y 看明暗,UV 看颜色
444 最完整,420 最省空间
I420 是 Y-U-V
YV12 是 Y-V-U
NV12 是 Y-UV
NV21 是 Y-VU
YUV420 裁剪旋转要注意 UV 对齐
19. 总结
YUV 真正难的不是原理,而是格式名字太多、排列太像。
你只要抓住这条主线,基本就不会乱:
YUV = 亮度(Y) + 色度(UV)
444/422/420 = 色度压缩程度不同
Packed / Planar / Semi-Planar = 存储方式不同
NV12/NV21、I420/YV12 的区别,本质上只是顺序不同
20 最后用一张脑图收尾
YUV
组成
Y 亮度
U 色度
V 色度
采样
YUV444
YUV422
YUV420
存储
Packed
Planar
Semi-Planar
常见格式
YUYV
I420
YV12
NV12
NV21
易错点
NV12和NV21混淆
裁剪不偶数对齐
旋转后宽高没交换
只处理Y不处理UV