OpenGL ES ->YUV图像基础知识

一文搞懂 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. YUVRGB 的区别

RGB
每个像素都包含 R G B
显示直观
数据量较大
YUV
Y 表示亮度
U/V 表示色度
可对色度降采样
更适合视频采集 编码 传输

直观理解

编码方式 含义 特点
RGB 红绿蓝直接表示颜色 适合显示,数据量较大
YUV 亮度 + 色度 适合采集、压缩、视频处理

4. YUV 最核心的点:UV 可以降采样

理解 YUV,关键不是 Y,而是 U/V 被压缩了多少

常见采样方式有三种:

  • YUV444
  • YUV422
  • YUV420

5. 三种采样方式怎么理解?

5.1 YUV444

每个像素都有完整的:

  • Y
  • U
  • V

也就是说,每个像素的亮度和颜色信息都完整保留。

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

典型格式:

  • I420
  • YV12

11.3 Semi-Planar(半平面格式)

Y 单独放一块,UV 交错放一块。

例如:

text 复制代码
YYYYYYYY
UVUVUVUV

典型格式:

  • NV12
  • NV21

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 一样直接三通道一起处理。特别是在这些操作里:

  • 旋转
  • 缩放
  • 裁剪

都要分别考虑:

  1. Y 平面怎么处理
  2. UV 平面怎么处理
  3. 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° 时,宽高会交换

  • NV21UVVU 顺序,不能弄反

旋转时的重点

原图
旋转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

相关推荐
山上三树1 小时前
Qt QObject介绍
开发语言·qt
2301_776508721 小时前
C++中的中介者模式
开发语言·c++·算法
Java成神之路-1 小时前
深度剖析 Java 类初始化机制:从<clinit>()/<init>() 字节码到静态内部类懒加载实战
java
乐观勇敢坚强的老彭1 小时前
C++信奥while循环基础01
开发语言·c++
arvin_xiaoting1 小时前
OpenClaw学习总结_I_核心架构系列_AgentLoop详解
java·学习·架构·llm·ai-agent·飞书机器人·openclaw
@大迁世界1 小时前
6 款轻量级 CLI 工具,取代了我臃肿的开发软件
开发语言·lua
不漫游1 小时前
Web聊天室测试报告
java
MegaDataFlowers2 小时前
依赖注入(DI)
java·开发语言
2501_915921432 小时前
常用iOS性能测试工具大全及使用指南
android·测试工具·ios·小程序·uni-app·cocoa·iphone