色彩空间与采样:从 RGB 到 YUV,再到 4:2:0

做视频编解码,第一个绕不开的概念就是色彩空间。说白了,就是计算机怎么用数字来描述颜色。

我刚入行那会儿,总觉得 RGB 挺直观的——红绿蓝三个分量,每个 8 bit,组合出 1600 万色,够用了。但后来发现,视频编码里几乎没人直接用 RGB。为什么?因为人眼对亮度敏感,对颜色没那么敏感。RGB 三个通道地位平等,压缩时没法区别对待。YUV 就不一样了,它把亮度和颜色分开,这就给压缩留了很大的操作空间。

RGB 与 YUV:两种世界观

RGB 是加法混色,显示器、摄像头、手机屏幕都用它。每个像素三个值,简单直接。

YUV 呢?Y 是亮度(Luma),U 和 V 是色度(Chroma)。Y 分量基本决定了画面的细节,U 和 V 负责颜色信息。人眼对 Y 的分辨率要求高,对 U、V 可以容忍模糊。这就是 YUV 能省带宽的根本原因。

转换公式其实不复杂,但要注意标准。BT.601 是标清用的,BT.709 是高清用的,BT.2020 是 4K/HDR 用的。混用标准,颜色就偏了。

核心要点:视频编码几乎全部基于 YUV 色彩空间。RGB 只在采集和显示端出现。中间传输、压缩、存储,全是 YUV 的天下。

色度采样:4:4:4、4:2:2、4:2:0

采样格式决定了色度信息的密度。数字表示法里,第一个数字是亮度样本数,后面两个是色度样本数。标准写法是 J:a:b,J 通常等于 4。

采样格式 亮度样本 色度样本 数据量(相对 4:4:4) 典型用途
4:4:4 每像素 1 个 每像素 1 对 U/V 100% 专业调色、屏幕录制、文字图像
4:2:2 每像素 1 个 每 2 像素 1 对 U/V 66% 广播级视频、高端制作
4:2:0 每像素 1 个 每 4 像素 1 对 U/V 50% 流媒体、视频通话、消费级编码

4:2:0 是绝对的主流。H.264、H.265、AV1 的消费级配置,几乎全是 4:2:0。为什么?因为人眼对色度的分辨率确实低,省掉 75% 的色度信息,肉眼几乎看不出区别。但带宽省了一半,这笔账太划算了。

我的习惯:做编码器测试时,先用 4:4:4 跑一遍作为参考,再用 4:2:0 跑一遍。对比 PSNR 和 SSIM,你会发现 4:2:0 的亮度 PSNR 几乎不变,但色度 PSNR 掉得厉害。不过主观看起来,差别不大。这就是人眼视觉系统的神奇之处。

色度下采样对人眼视觉的影响

4:2:0 下采样时,色度信息被压缩到原来的四分之一。解码后上采样恢复,色度边缘会变模糊。但人眼对彩色边缘的锐度不敏感,所以看起来还行。

不过,有几种情况会露馅:

  • 纯色文字 + 彩色背景:比如红底白字。4:2:0 下,文字边缘会出现彩色渗色,看起来像没对齐。
  • 细线条:黄色细线在蓝色背景上,4:2:0 会让线条变淡甚至消失。
  • 颜色渐变区域:天空、肤色这些平滑渐变区,4:2:0 可能出现色块感。

所以,屏幕录制、远程桌面、医学影像这些场景,必须用 4:4:4。视频会议、短视频、直播,4:2:0 完全够用。

注意:4:2:0 不是无损的。如果你做后期调色、抠像、特效合成,一定要用 4:4:4 源。用 4:2:0 素材做绿幕抠像,边缘会有一圈鬼影,很难处理。

我在项目中遇到的色彩空间转换坑

踩坑经历,说多了都是泪。分享几个典型的:

  • 坑一:RGB 和 YUV 的转换范围搞混了。RGB 有 full range(0-255)和 limited range(16-235)。YUV 也有对应的 full 和 limited。转换时范围不匹配,画面要么发灰,要么过曝。我曾经在某个项目中,解码出来的画面一直偏暗,查了两天才发现是解码器默认输出 limited range,而显示模块用了 full range 的转换矩阵。
  • 坑二:转换矩阵用错了标准。BT.601 和 BT.709 的系数不一样。用 BT.601 的矩阵处理高清视频,颜色会偏绿。我见过一个产品,标清转高清时直接套用了同一套矩阵,结果颜色全偏了。后来加了标准检测逻辑,根据分辨率自动选择矩阵。
  • 坑三:色度上采样算法太糙。4:2:0 解码后要上采样回 4:4:4。最简单的 nearest neighbor 会出锯齿,bilinear 会模糊。我建议用 lanczos 或 bicubic,虽然计算量大一点,但画质好很多。移动端可以用 bilinear,省电。
  • 坑四:YUV 的存储布局搞错了。YUV 有 planar 和 packed 两种布局。planar 是 Y 平面、U 平面、V 平面分开存;packed 是 YUYV、UYVY 这种交错存。传数据时布局不匹配,画面会花掉。我踩过这个坑,后来统一用 planar,并在接口文档里写死。

避坑指南:做色彩空间转换时,先确认源和目标的 range 和 matrix。写一个单元测试,用已知的纯色和灰阶图验证。不要相信任何“默认值”。

知识体系:色彩空间与采样核心逻辑

下面这张图,把本章的核心关系串起来了。从采集到显示,色彩空间和采样格式的变化路径,一目了然。

色彩空间与采样核心逻辑图 色彩空间与采样:从采集到显示 摄像头/传感器 RGB 原始数据 色彩空间转换 YUV 4:4:4 色度下采样 YUV 4:2:0 视频编码器 传输 / 存储 视频解码器 色度上采样 显示器 / 屏幕 注意: 转换矩阵 必须匹配 注意: 上采样算法 影响画质

从图上可以清楚看到:采集端拿到 RGB,转成 YUV 4:4:4,然后色度下采样到 4:2:0,编码、传输、解码,再上采样回 4:4:4,最后转回 RGB 显示。每一步都有坑,每一步都值得仔细推敲。

嗯,色彩空间和采样这块,说难不难,说简单也不简单。关键是理解人眼视觉特性,以及工程实现中的各种细节。下次做编码器选型或调试画质时,记得先看看色彩空间和采样格式对不对。这个基础打牢了,后面学 H.264、H.265、AV1 的编码工具,会轻松很多。