YUV色彩空间详解(数字视频与图像处理)

目录

    1. 核心概念
    1. YUV 与 Y’CbCr 的关系
    1. 转换矩阵与范围
    1. 色度子采样与定位
    1. 像素格式与内存布局
    1. 压缩优势与应用
    1. 处理流程与注意事项
    1. OpenCV 与 FFmpeg 示例
    1. 常见坑与排查清单
    1. 快速心智模型

1. 核心概念

  • 将图像拆分为明度与色度:Y'表示伽马后的明度(非线性),U/V表示颜色偏向的差分分量。
  • 人眼对亮度更敏感、对色度更不敏感,便于对色度更强压缩而不显著损伤感知质量。

2. YUV 与 Y’CbCr 的关系

  • 工程实践中“YUV”多指数字视频的 Y'CbCrY'是伽马后的明度,Cb/Cr是蓝/红与明度的差分,经缩放与偏移形成整数域表示。
  • 经典线性关系(8-bit,全范围)用于理解与近似实现,但具体标准定义以 BT.601/709/2020 为准。

3. 转换矩阵与范围

  • BT.601(SDTV):

    • Y' = 0.299R + 0.587G + 0.114B
    • Cb = −0.168736R − 0.331264G + 0.5B + 128
    • Cr = 0.5R − 0.418688G − 0.081312B + 128
  • BT.709(HD/UHD):

    • Y' = 0.2126R + 0.7152G + 0.0722B
    • Cb = −0.114572R − 0.385428G + 0.5B + 128
    • Cr = 0.5R − 0.454153G − 0.045847B + 128
  • 范围(Range):

    • 电视范围(limited):Y'∈[16,235]Cb/Cr∈[16,240]
    • 全范围(full):[0,255]
    • 范围或矩阵选择错误会导致黑场抬升/压黑、整体发灰或明显色偏(肤色最敏感)。

4. 色度子采样与定位

  • 采样格式:
    • 4:4:4Y,U,V同分辨率,质量最佳,带宽最高。
    • 4:2:2:水平方向色度减半,每两个亮度像素共享一组色度。
    • 4:2:0:水平与垂直都减半,四个亮度像素共享一组色度,最常用于压缩视频。
  • 色度定位(Chroma Siting):色度像素相对亮度像素的对齐位置(居中/共址)因标准不同而异;上采样需使用正确滤波与对齐避免色边与锯齿。

5. 像素格式与内存布局

  • 平面(planar):
    • yuv420p/I420YW×H)+ UW/2×H/2)+ VW/2×H/2
    • yuv422pYW×H)+ UW/2×H)+ VW/2×H
  • 半平面(semi-planar):
    • NV12Y平面 + UV交错平面(W×H/2
    • NV21Y平面 + VU交错平面(W×H/2
  • 打包(packed):
    • YUY2/YUYV:字节序 Y U Y V ... 行内交织,常见于采集设备输出。
  • 遍历像素需考虑每平面的 stride 与对齐填充,而非单纯使用图像宽度。

6. 压缩优势与应用

  • 编码器优先保护 Y' 的细节,在 U,V 上更强量化与子采样;人眼对细微色差不敏感,使整体压缩率显著提升而感知质量保持良好。
  • 视频编解码与传输链路、硬件ISP/编解码器、GPU纹理等广泛以YUV工作。

7. 处理流程与注意事项

  • 编码链:RGB→YUV→压缩→传输;显示链:YUV→RGB→显示设备
  • 选择正确的色彩矩阵(BT.601/709/2020)与范围(limited/full);链路内保持一致性。
  • 4:2:0→4:4:4 上采样时使用合适滤波与正确对齐,避免色边与伪影。
  • Y'为伽马后的明度,涉及物理计算或合成时应在线性空间操作再映射到显示空间。

8. OpenCV 与 FFmpeg 示例

import cv2

src = cv2.imread('input.jpg')
ycrcb = cv2.cvtColor(src, cv2.COLOR_BGR2YCrCb)
i420 = cv2.cvtColor(src, cv2.COLOR_BGR2YUV_I420)
restored = cv2.cvtColor(i420, cv2.COLOR_YUV2BGR_I420)
cv2.imwrite('ycrcb.png', ycrcb)
cv2.imwrite('restored.png', restored)
ffmpeg -i input.mp4 -pix_fmt yuv420p -colorspace bt709 -color_primaries bt709 -color_trc bt709 out_yuv420p.mp4
ffmpeg -i input.mp4 -vf scale=in_color_matrix=bt709:out_color_matrix=bt709 -pix_fmt nv12 out_nv12.mp4

9. 常见坑与排查清单

  • 范围错用:limited内容按full显示会发灰;full内容按limited显示会压黑/过曝。
  • 矩阵错用:用BT.601处理BT.709内容会整体色偏,肤色偏差尤为明显。
  • 上采样错位:UVY未对齐导致彩色边缘晕染或锯齿。
  • 平面顺序误解:I420Y U V)与 YV12Y V U)顺序不同,交换将导致紫/绿偏色。

10. 快速心智模型

  • Y'视为高质量黑白图,承载绝大多数细节与纹理;U,V是颜色倾向的低分辨率附图。
  • 压缩时优先保护 Y',对 U,V更大胆量化与子采样以提升效率。

11. U/V 的含义与实践

  • 核心理解

    • UV 是色度差分轴:U 近似描述“蓝色相对亮度”的差分,V 近似描述“红色相对亮度”的差分;它们不承载亮度,只描述颜色方向与强度。
    • 心智模型:将灰色点视为平面中心 (128,128)U–V 平面上的向量方向对应“色相”,长度对应“饱和度”。
  • 数学关系(以 BT.601 全范围为例)

    • Y' = 0.299R + 0.587G + 0.114B
    • U (Cb) ≈ −0.168736R − 0.331264G + 0.5B + 128 ≈ k·(B − Y') + 128
    • V (Cr) ≈ 0.5R − 0.418688G − 0.081312B + 128 ≈ k·(R − Y') + 128
    • 逆变换(示意):R ≈ Y' + 1.402·(V−128), B ≈ Y' + 1.772·(U−128), G ≈ Y' − 0.344·(U−128) − 0.714·(V−128)(系数随标准略有变化)。
  • 直观含义与方向解释

    • 中心值:U=128, V=128 表示“无色”(灰);偏离中心越远,颜色越“饱和”。
    • U 增大(>128)→ 偏蓝/青;U 减小(<128)→ 偏黄/绿。
    • V 增大(>128)→ 偏红/洋红;V 减小(<128)→ 偏青绿/黄。
    • 亮度独立:改变 UV 不改变明暗(由 Y' 决定),只改变色相/饱和。
  • 范围与标准

    • 电视范围(limited):Y'∈[16,235]U/V∈[16,240];全范围(full):[0,255]
    • 系数随标准(BT.601/709/2020)变化;矩阵或范围错用会导致发灰、压黑或明显色偏(肤色尤敏感)。
  • 子采样与压缩

    • 4:4:4 不子采样;4:2:2 水平减半;4:2:0 水平+垂直减半。
    • 人眼对色度不敏感,U/V 可低分辨率存储并更强量化,显著提升压缩效率;Y' 保留细节。
  • 像素格式差异与注意

    • 平面:yuv420p/I420Y + U + V)。
    • 半平面:NV12Y + 交错 UV)、NV21Y + 交错 VU)。
    • 打包:YUY2/YUYV 行内交织。
    • 注意 UV 顺序与色度定位(居中/共址),错用会出现紫/绿反转或色边。
  • 应用场景

    • 肤色检测:在 U–V 平面内,肤色落在稳定椭圆区域,用于 AWB 与人脸优先。
    • 蓝绿幕抠像:利用 UV 维度的集中性构建阈值/概率模型。
    • 编码调优:对 U/V 更强量化与更大步长,平衡带宽与感知质量。
  • 常见坑与排查

    • NV12/NV21 顺序反:颜色紫/绿颠倒。
    • 矩阵/范围混用:BT.601 处理 BT.709 内容、limited 当 full 显示导致色偏/发灰。
    • 上采样错位:4:2:0→4:4:4 还原时,色度对齐错误引起彩边。
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐