📄 一句话概括
人眼对亮度敏感、对色度不敏感,所以把颜色拆成 YUV 之后,色度可以少采——4:2:0 直接省掉一半数据。
📝 本节和前面几节的关系
5.1.1 讲了像素,这一节讲像素的颜色用什么方式存。
一、RGB:最直观的存法
RGB 把颜色拆成红、绿、蓝三个分量,各占一个字节。 它的好处是直接对应屏幕的发光方式——显示时红绿蓝三盏灯一混就行。 但它的坏处也很明显:三个分量同等重要,一点都省不了。
二、YUV:按人眼的敏感度拆
YUV 换了一种拆法:Y 是亮度,U 和 V 是色度。 关键事实是:人眼对亮度极其敏感,对色度却相当迟钝。 所以完全可以把亮度完整保留、色度采稀一点——这就是【色度采样】。 这不是偷工减料,而是利用人眼特性做的一次等价交换。
三、三种采样方式
4:4:4:色度不缩水,每像素 3 字节——和 RGB 一样大。 4:2:2:色度横向减半,每像素 2 字节——省三分之一。 4:2:0:色度横纵都减半,每像素 1.5 字节——省掉一半。 视频领域最常用的就是 4:2:0,几乎所有的在线视频都用它。
四、为什么这一节值得单独讲
因为它解释了一个常见疑问:为什么视频能比图片省这么多? 答案的一部分就在这里——压缩还没开始,色彩空间已经先省了一半。 所以在排查【颜色不对】【边缘发绿】这类问题时,第一步就是看它的色彩格式。
五、动手 Demo:RGB 换成 YUV,一帧小了多少
人眼对亮度敏感、对色度不敏感,所以可以把色度采样得稀一些。
w, h = 1920, 1080
for name, bpp in [("RGB 24bit", 3.0), ("YUV 4:4:4", 3.0),
("YUV 4:2:2", 2.0), ("YUV 4:2:0", 1.5)]:
print("%-12s %.1f 字节/像素 %.2f MB" % (name, bpp, w * h * bpp / 1024.0 / 1024))
实跑输出:
--------------------------------------------------------------------
RGB 换成 YUV,一帧小了多少
--------------------------------------------------------------------
人眼对亮度敏感、对色度不敏感,所以可以把色度采样得稀一些。
色彩格式 每像素字节 1080p 一帧
----------------------------------------
RGB 24bit 3.0 5.93 MB
YUV 4:4:4 3.0 5.93 MB
YUV 4:2:2 2.0 3.96 MB
YUV 4:2:0 1.5 2.97 MB
关键一项是 **YUV 4:2:0**:Y 全采、U 和 V 各只采四分之一——
**每像素从 3 字节降到 1.5 字节,直接省掉一半。**
压缩还没开始,色彩空间已经替我省了一次。
关键一项是 YUV 4:2:0:Y 全采、U 和 V 各只采四分之一—— 每像素从 3 字节降到 1.5 字节,直接省掉一半。 压缩还没开始,色彩空间已经替我省了一次。
30 秒实验
- 用 MediaInfo 看一眼你手上视频的【色彩空间】一项。
- 如果是 4:2:0,算一下它比 4:4:4 省了多少。
常见误区
- 以为 YUV 是【劣化版 RGB】。它在亮度上是完整的,丢的只是人眼分辨不出的色度。
- 把色彩空间和编码混为一谈。前者是取样方式,后者是压缩方式。
自测三问(点开对答案)
1. YUV 里的 Y、U、V 分别是什么? —— Y 是亮度,U 和 V 是色度。 2. YUV 4:2:0 每像素占几个字节? —— 1.5 字节(亮度完整,色度各采四分之一)。 3. 为什么色度可以少采? —— 因为人眼对色度的敏感度远低于对亮度。- ☐ 下一节(5.1.3 数字视频)
相关笔记
- 图像与像素 — 像素的一个颜色怎么表示
- 视频编码基础知识 — 往下走:还有哪几种冗余
- 数字音频 — 采样这件事在声音上的对照
- 🎬 FFmpeg入门详解 · 索引