3、YUV色彩空间:RGB与YUV的区别,YUV采样格式(4:4:4、4:2:2、4:2:0),YUV在H264中的存储与处理。
做视频编码这么多年,我经常被问到的一个问题是:“为什么不用RGB,非要搞个YUV?”
这个问题其实很关键。你想想看,如果直接用RGB去压缩视频,效率会低得吓人。H.264之所以能成为主流,YUV色彩空间的引入功不可没。今天我们就来彻底搞懂它。
3.1 RGB与YUV:本质区别在哪?
RGB大家都熟,红绿蓝三原色。每个像素用三个分量表示,直接对应显示器的物理发光单元。但RGB有一个“致命”问题——三个分量的重要性是平等的。
YUV就不一样了。它把亮度(Luma,记为Y)和色度(Chroma,记为U和V)分开了。
核心区别一句话:人眼对亮度变化极其敏感,对颜色变化相对迟钝。YUV正是利用了这个生理特性。
我在项目中遇到过不少新手,上来就问:“YUV是不是比RGB更高级?”其实不是高级不高级的问题,而是分工不同。RGB适合显示,YUV适合传输和压缩。
| 特性 | RGB | YUV |
|---|---|---|
| 分量含义 | 红、绿、蓝三原色 | 亮度Y + 色度U/V |
| 人眼敏感度 | 三个分量同等重要 | Y最重要,U/V次之 |
| 压缩潜力 | 低,三个分量都得保 | 高,可以砍色度数据 |
| 主要用途 | 显示、图像处理 | 视频编码、传输 |
从RGB到YUV的转换,说白了就是一个线性变换。标准公式是这样的:
Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.147 * R - 0.289 * G + 0.436 * B
V = 0.615 * R - 0.515 * G - 0.100 * B
嗯,这里要注意,实际编码中用的系数可能略有不同(比如BT.601和BT.709标准),但原理是一样的。
3.2 YUV采样格式:4:4:4、4:2:2、4:2:0
这才是YUV真正的杀手锏。既然人眼对色度不敏感,那我们能不能少存一些色度信息?
答案是肯定的。这就是采样格式的由来。
我的经验:在H.264实际应用中,90%以上的场景都在用4:2:0。你看到的网络视频、直播、短视频,几乎全是它。
先看一张图,直观理解这三种格式的区别:
具体来说:
- 4:4:4:每个像素都保留完整的Y、U、V。数据量最大,质量最高。一般用于专业影视制作、高端医疗影像。
- 4:2:2:水平方向每两个像素共享一组U/V。垂直方向不变。常用于广播级设备、视频采集卡。
- 4:2:0:水平和垂直方向都每两个像素共享一组U/V。数据量只有4:4:4的一半。H.264最常用的格式。
我曾经踩过的坑:有一次做视频采集,设备输出的是4:2:2,我直接当4:2:0处理了。结果画面颜色边缘出现锯齿,排查了半天才发现是采样格式不匹配。所以一定要确认输入源的采样格式,别想当然。
3.3 YUV在H.264中的存储与处理
搞清楚了采样格式,接下来就是实际存储问题了。H.264里YUV怎么摆?
最常见的存储方式是平面存储(Planar)。说白了就是:所有Y数据放一块,所有U数据放一块,所有V数据放一块。
以4:2:0为例,一张1920x1080的图像:
- Y平面:1920 x 1080 = 2,073,600 字节
- U平面:960 x 540 = 518,400 字节
- V平面:960 x 540 = 518,400 字节
- 总计:约3.1 MB
对比一下RGB24:1920 x 1080 x 3 = 约6.2 MB。直接省了一半。
我建议:在代码里处理YUV数据时,一定要搞清楚内存布局。很多bug都是因为指针偏移算错了。比如Y平面之后紧跟着U平面,偏移量就是Y平面的总字节数。
H.264编码器内部是怎么处理YUV的?大致流程如下:
- 输入:原始YUV数据(通常是4:2:0平面格式)
- 分块:把图像分成16x16的宏块(Macroblock)
- 预测:对每个宏块做帧内或帧间预测,得到残差
- 变换:对残差做DCT变换(离散余弦变换)
- 量化:丢掉不重要的高频信息
- 熵编码:最终压缩成二进制码流
这里有个关键点:Y和U/V的处理方式不同。Y分量因为包含更多视觉信息,编码器会分配更多码率给它。U/V分量则可以更“粗暴”地量化。
我举个例子,在码率控制中,编码器通常会这样分配:
| 分量 | 码率占比(典型值) | 量化步长 |
|---|---|---|
| Y(亮度) | 70% - 80% | 较小(精细) |
| U(蓝色差) | 10% - 15% | 较大(粗糙) |
| V(红色差) | 10% - 15% | 较大(粗糙) |
你看,Y分量占了绝大部分码率。这就是为什么4:2:0能保持高视觉质量的原因——亮度信息一点没少,只是砍了人眼不敏感的色度信息。
总结一下:YUV色彩空间是H.264编码的基石。理解RGB与YUV的区别、掌握4:2:0采样格式、熟悉YUV的平面存储方式,是做好视频编码的第一步。我在实际项目中,80%的编码问题都出在对YUV的理解不够深入上。
嗯,这一章的内容就到这里。记住,YUV不是玄学,它是工程智慧的结晶。搞懂了它,你就拿到了H.264编码的第一把钥匙。