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

相关推荐
云烟成雨TD1 分钟前
Spring AI Alibaba 1.x 系列【56】SAA Admin 平台功能介绍
java·人工智能·spring
Gauss松鼠会1 分钟前
GaussDB(DWS) 资源监控Topsql
java·网络·数据库·算法·oracle·性能优化·gaussdb
夏日听雨眠2 分钟前
数据结构(快速排序)
java·数据结构·算法
薇茗3 分钟前
【初阶数据结构】 升沉有序的平仄 排序 3
c语言·开发语言·数据结构·算法·排序算法·文件归并排序
字节高级特工5 分钟前
C++11(一) 革新:右值引用与移动语义
java·开发语言·c++·人工智能·后端
郝学胜-神的一滴6 分钟前
系统设计 012:从用户系统出发,吃透缓存、数据库与高并发设计
java·数据库·python·缓存·php·软件构建
小离a_a8 分钟前
uniapp小程序封装圆环显示比例数据
android·小程序·uni-app
三少爷的鞋9 分钟前
Android 面试系列:runBlocking 到底该在哪用?
android
AI科技星10 分钟前
强哥德巴赫猜想(1+1)终极证明(2026 年5月 21 日)
开发语言·人工智能·算法·计算机视觉·量子计算
人道领域10 分钟前
【LeetCode刷题日记】654.最大二叉树:递归算法详解
java·算法·leetcode