1. YUV色彩空间基础:从RGB到YUV的转换与存储

做图像处理这么多年,我接触最多的色彩空间就是YUV。说实话,刚入行时我也觉得RGB挺直观的,红绿蓝多好理解。但后来做视频编码、低光照增强,才发现YUV才是真正的工业标准。这一章,咱们就把YUV的底子打扎实。

1.1 为什么需要YUV?

RGB把颜色拆成红、绿、蓝三个分量,每个分量地位平等。但人眼对亮度敏感,对颜色细节没那么敏感。YUV正是利用了这个特点——用一个分量表示亮度(Y),两个分量表示颜色(U和V)。

我在项目中遇到过这样的场景:用RGB做低光照增强,三个通道都得处理,计算量翻倍不说,还容易引入色偏。换成YUV后,只增强Y通道,U和V基本不动,效果又好又快。

核心优势:
  • 亮度与色度分离,便于针对性处理
  • 兼容黑白显示设备(只看Y分量即可)
  • 支持色度采样压缩,节省带宽

1.2 YUV与RGB的转换原理

转换公式其实不复杂,但不同标准(BT.601、BT.709、BT.2020)的系数略有差异。这里以最常用的BT.601标准为例,给大家一个能直接用的版本。

RGB → YUV(正向转换)

Y =  0.299 * R + 0.587 * G + 0.114 * B
U = -0.147 * R - 0.289 * G + 0.436 * B + 128
V =  0.615 * R - 0.515 * G - 0.100 * B + 128

YUV → RGB(反向转换)

R = Y + 1.140 * (V - 128)
G = Y - 0.394 * (U - 128) - 0.581 * (V - 128)
B = Y + 2.032 * (U - 128)
我的习惯:实际工程中别用浮点运算,太慢了。我会把系数放大到整数(比如乘以1024),用移位操作代替除法。精度损失可以忽略,速度提升明显。

你想想看,为什么U和V要加128?因为RGB是0-255范围,而YUV的Y也是0-255,但U和V是有符号的(-128到127)。加上128后,就能用无符号字节存储了。嗯,这里要注意,解码时一定要减回去。

1.3 YUV采样格式

这是YUV最巧妙的地方。既然人眼对色度不敏感,那何必每个像素都存完整的U和V?采样格式就是干这个的。

采样格式 描述 压缩比 常见应用
4:4:4 每个像素都有完整的Y、U、V 无压缩 专业调色、医疗影像
4:2:2 每2个像素共享一组U、V 33% 广播级视频、HDMI
4:2:0 每4个像素(2x2块)共享一组U、V 50% H.264/H.265、网络视频

我曾经踩过一个坑:在低光照增强算法里,直接对4:2:0的U、V做插值放大,结果边缘出现彩色锯齿。后来改成先转4:4:4再处理,问题就解决了。说白了,采样格式的选择直接影响算法设计。

避坑指南:4:2:0的U、V分辨率是Y的一半(宽高各一半)。做图像处理时,一定要搞清楚当前数据是哪种采样格式,否则坐标映射会全乱套。

1.4 YUV数据在内存中的存储布局

理论讲完了,咱们看看实际内存里YUV长什么样。不同采样格式的存储方式完全不同,写代码时最容易出错的就是这里。

4:4:4 存储(平面模式)

YYYYYYYYYYYYYYYY...
UUUUUUUUUUUUUUUU...
VVVVVVVVVVVVVVVV...

三个平面分开存储,每个像素都有完整的Y、U、V。说白了就是三个独立的灰度图。

4:2:0 存储(NV12格式)

YYYYYYYYYYYYYYYY...  (宽×高个Y)
UVUVUVUVUVUVUV...    (宽×高/2个UV交错)

NV12是Android和大多数视频编码器的默认格式。Y平面单独存,U和V交错存储。我刚开始做视频处理时,总搞不清UV的排列顺序,后来记住一句话:NV12是U在前V在后,NV21反过来。

4:2:2 存储(YUYV格式)

Y0 U0 Y1 V0  Y2 U2 Y3 V2  ...

每两个像素共享一组U、V,但Y是每个像素都有的。这种格式在USB摄像头里很常见。

我的经验:做内存拷贝时,千万别用memcpy直接复制整个YUV帧。不同格式的stride(行跨度)可能不一样,尤其是做ROI裁剪时,要按行逐行拷贝,否则图像会歪掉。

1.5 本章知识体系

下面这张图把YUV的核心脉络串起来了,建议保存下来对照着看。

YUV色彩空间知识体系 YUV色彩空间 RGB ↔ YUV 转换 采样格式 内存存储布局 BT.601 BT.709 4:4:4 4:2:2 4:2:0 平面模式 交错模式 核心要点 • YUV分离亮度与色度,适合人眼视觉特性 • 转换公式有多个标准,BT.601最常用 • 4:2:0是工业标准,节省50%带宽 • 存储布局决定代码实现,NV12是主流

这一章的内容是后续所有YUV优化算法的基础。转换公式要记牢,采样格式要分清,存储布局要搞懂。后面讲低光照增强时,你会发现YUV域处理比RGB域高效得多——只处理Y通道,U和V基本不动,计算量直接减半。

一句话总结:YUV不是玄学,是工程智慧。它利用人眼特性,把亮度和颜色分开处理,让视频压缩和图像增强都有了更高效的手段。