2、YUV色彩空间基础:YUV与RGB的数学关系、YUV420/YUV422/YUV444采样格式详解、色度子采样原理

2.1 YUV色彩空间概述

YUV(亦称YCbCr)是一种将亮度(Luma)与色度(Chroma)分离的色彩编码体系。在视频压缩与传输领域,YUV占据主导地位,其核心优势在于:人眼对亮度变化敏感,对色度变化相对迟钝。利用这一视觉特性,YUV允许对色度分量进行降采样,从而在不显著降低主观画质的前提下,大幅压缩数据带宽。

在V4L2驱动开发中,理解YUV是进行格式协商、裁剪、格式转换与性能优化的前提。YUV与RGB的转换精度直接影响图像质量,而采样格式决定了内存布局与DMA搬运效率。

关键概念: Y = 亮度(Luma),U = 蓝色色差(Cb = B − Y),V = 红色色差(Cr = R − Y)。在数字视频标准中,Y、Cb、Cr通常以8位或10位无符号整数存储。

2.2 YUV与RGB的数学关系

YUV与RGB之间的转换遵循线性矩阵变换。以下给出最常用的BT.601标准(标清视频)下的8位量化转换公式。所有分量取值范围为[0, 255]。

2.2.1 RGB → YUV(正向转换)

Y  =  0.299 * R + 0.587 * G + 0.114 * B
Cb = -0.169 * R - 0.331 * G + 0.500 * B + 128
Cr =  0.500 * R - 0.419 * G - 0.081 * B + 128

2.2.2 YUV → RGB(逆向转换)

R = Y + 1.402 * (Cr − 128)
G = Y − 0.344 * (Cb − 128) − 0.714 * (Cr − 128)
B = Y + 1.772 * (Cb − 128)
精度陷阱: 浮点运算在嵌入式平台开销极高。实际驱动中应使用整数定点运算(如Q16格式)或查表法(LUT)加速。转换过程中需做饱和裁剪(Clamp),防止RGB值溢出[0, 255]范围。

2.2.3 不同标准对比

标准 应用场景 Y系数 (R/G/B) 色域
BT.601 标清电视 (SDTV) 0.299 / 0.587 / 0.114 较窄
BT.709 高清电视 (HDTV) 0.2126 / 0.7152 / 0.0722 较宽
BT.2020 超高清 (UHDTV) 0.2627 / 0.6780 / 0.0593 最宽

V4L2驱动中,V4L2_PIX_FMT_YUYV 等格式默认遵循BT.601标准。若摄像头传感器输出BT.709数据,驱动需在格式转换时切换系数矩阵。

YUV ↔ RGB 转换流程与系数矩阵 YUV ↔ RGB 转换流程与系数矩阵 RGB 输入 R/G/B [0-255] 正向矩阵 BT.601/BT.709 Y = 0.299R + ... YUV 输出 Y/Cb/Cr 逆向矩阵 BT.601/BT.709 R = Y + 1.402Cr YUV 输入 Y/Cb/Cr RGB 输出 R/G/B [0-255] 整数定点运算 + 饱和裁剪

2.3 色度子采样原理

色度子采样(Chroma Subsampling)是YUV体系的核心压缩手段。其原理是:对亮度分量Y保留全分辨率,对色度分量Cb/Cr进行水平或垂直方向的降采样。采样格式用“J:a:b”表示法描述,其中J表示亮度采样参考宽度(通常为4),a表示第一行色度采样数,b表示第二行色度采样数。

2.3.1 三种主流采样格式

格式 表示法 色度水平 色度垂直 压缩比 典型应用
YUV444 4:4:4 全采样 全采样 1:1(无压缩) 专业制作、屏幕采集
YUV422 4:2:2 1/2采样 全采样 2:1 广播级视频、HDMI
YUV420 4:2:0 1/2采样 1/2采样 3:2 流媒体、H.264/H.265
V4L2驱动视角: YUV420是嵌入式摄像头最常用的输出格式,因其数据量仅为RGB24的1/2,可显著降低ISP带宽与DMA压力。裁剪操作在YUV420上需注意2像素对齐约束。
YUV444 / YUV422 / YUV420 采样结构对比 YUV444 / YUV422 / YUV420 采样结构对比 Y 采样点 Cb/Cr 采样点 YUV444 (4:4:4) 每像素都有Y+Cb+Cr YUV422 (4:2:2) 水平每2像素共享Cb/Cr YUV420 (4:2:0) 水平+垂直每2像素共享Cb/Cr 数据量对比(8位/像素) YUV444: 3 bytes/pixel YUV422: 2 bytes/pixel YUV420: 1.5 bytes/pixel RGB24: 3 bytes/pixel YUV420 比 RGB24 节省 50% V4L2 常用: V4L2_PIX_FMT_NV12

2.4 YUV420/YUV422/YUV444 内存布局详解

在V4L2驱动中,理解内存布局是正确配置v4l2_format、v4l2_plane以及实现裁剪/缩放的关键。不同采样格式对应不同的像素存储顺序与对齐要求。

2.4.1 YUV444 平面布局

YUV444通常以打包(Packed)或平面(Planar)形式存储。平面布局下,三个独立平面分别存放Y、Cb、Cr数据,每个像素对应一个Y、一个Cb、一个Cr。分辨率W×H时,总数据量为 W × H × 3 字节。

2.4.2 YUV422 打包布局(YUYV格式)

YUYV是V4L2中最常见的YUV422打包格式。内存中按 [Y0, U0, Y1, V0] 的4字节宏像素排列,每2个像素共享一对Cb/Cr。行跨度(Stride)必须为2的倍数。

// YUYV 内存布局示例(4像素)
// 像素0: Y0, U0
// 像素1: Y1, V0
// 像素2: Y2, U1
// 像素3: Y3, V1
// 内存: [Y0][U0][Y1][V0] [Y2][U1][Y3][V1]

2.4.3 YUV420 平面布局(NV12格式)

NV12是V4L2驱动中最常用的YUV420半平面格式。Y平面大小为 W × H 字节,CbCr交错平面大小为 W × H / 2 字节。总数据量为 W × H × 1.5 字节。

// NV12 内存布局(4×4图像)
// Y平面: [Y00 Y01 Y02 Y03]  [Y10 Y11 Y12 Y13]
//        [Y20 Y21 Y22 Y23]  [Y30 Y31 Y32 Y33]
// UV平面: [U00 V00 U01 V01]  [U10 V10 U11 V11]
//         (UV平面宽度 = W, 高度 = H/2)
V4L2驱动对齐规则: YUV420裁剪时,起始坐标(x, y)必须为偶数,裁剪宽度和高度也必须为偶数。YUV422裁剪时,x坐标必须为偶数。违反对齐会导致图像错位或驱动报错(EINVAL)。

2.5 采样格式选择对性能的影响

维度 YUV444 YUV422 YUV420
内存带宽 高(3B/pixel) 中(2B/pixel) 低(1.5B/pixel)
ISP处理延迟 低(无降采样) 中 高(需插值)
裁剪对齐约束 1像素 2像素(水平) 2像素(水平+垂直)
格式转换开销 低(直接映射) 中 高(需色度上采样)
推荐场景 屏幕采集/专业应用 广播/HDMI输入 摄像头/编码/流媒体
性能优化建议: 在嵌入式Linux摄像头驱动中,优先选择YUV420(NV12)作为ISP输出格式,以最小化DMA带宽占用。若后续需要RGB格式,可在GPU或NEON协处理器中执行YUV420→RGB的批量转换,利用SIMD指令并行处理。

2.6 本章小结

  • YUV核心优势:亮度与色度分离,支持色度子采样,人眼视觉特性适配。
  • 转换公式:BT.601/BT.709/BT.2020标准,驱动中需使用整数定点运算避免浮点开销。
  • 采样格式:YUV444(无损)、YUV422(水平降采样)、YUV420(水平+垂直降采样)。
  • 内存布局:YUYV打包格式与NV12半平面格式是V4L2驱动中最常见的两种布局。
  • 对齐约束:YUV420裁剪需2像素对齐,YUV422需水平2像素对齐,违反对齐是驱动bug的常见来源。