1207 字
6 分钟
4:2:0 到底省掉了什么?从色度抽样到重建相位

一帧 1920×1080 的 8-bit YCbCr 4:4:4 有三张同尺寸平面。若改成 4:2:0,Y′ 仍保持全分辨率,Cb 和 Cr 各自在水平、垂直方向减半;总样本数从每像素 3 个降为平均 1.5 个。

它利用的是视觉系统通常对亮度结构比色度细节更敏感,而不是“人眼看不见颜色”。高饱和文字、UI 截图、色键和细线仍可能明显受损。

三个数字描述什么#

4:4:4、4:2:2 与 4:2:0 采样网格

Y′ 保留每个像素;圆点表示同一位置是否保存独立的 Cb/Cr 样本。

每个方格仍有一个 Y′;色度样本覆盖的像素区域随格式扩大
采样格式

“4:2:0”不表示四个通道,也不等于把分辨率整体减半;它描述两个色度平面相对亮度平面的采样密度。

Y′ 样本32
Cb+Cr 样本16
相对 4:4:450%
  • 4:4:4:每个 Y′ 位置都有独立 Cb、Cr;
  • 4:2:2:水平方向每两个 Y′ 共享一组色度,垂直方向不降采样;
  • 4:2:0:色度在水平、垂直方向都约减半,一个 Cb/Cr 样本通常覆盖 2×2 亮度区域。

这种记法源自固定宽度参考区域,并不是通道数量比例的普通分数。不同标准对 4:2:0 的色度位置还有不同约定。

下采样之前必须低通#

直接每隔一个像素丢掉色度会把超过新 Nyquist 频率的内容折叠到低频,形成彩色锯齿和摩尔纹。正确流程是先沿要降采样的方向低通,再取样:

Clow=Ch,Cs[m,n]=Clow[2m,2n]C_{low}=C*h,\qquad C_s[m,n]=C_{low}[2m,2n]

滤波器越窄越能抑制混叠,但也会让彩色边缘更软;滤波器太弱则保留锐利感,同时增加 aliasing。编码器需要在带宽、清晰度与伪影之间取舍。

实拍图像的 4:4:4 / 4:2:2 / 4:2:0

花朵、树叶与人物边缘包含丰富色度细节;切换采样格式可以观察颜色边缘怎样变软。

4:2:0 重建
色度抽样

这里先对每个 2×1 或 2×2 区域的 Cb、Cr 做 box 平均,再以最近邻重建;它刻意放大了简单上采样的局限,不代表所有视频解码器的质量。

原始样本预算50%
RGB RMSE0.00 / 255
许可CC0 1.0

样片:Baap8969 / Wikimedia Commons,CC0 1.0;本站缩放并转为 WebP。

重建不是找回原始样本#

下采样之后怎样还原色度

最近邻保持硬边,线性插值更平滑;两者都无法恢复已经跨样本平均掉的细节。

虚线:原始 Cb 实线:重建 Cb
上采样

演示只是一维 4:2:2 box 预滤波。实际 4:2:0 还要考虑垂直滤波、chroma siting 与隔行扫描。

保留样本8/16
重建 RMSE0.122
边缘相位7

解码器将稀疏色度重新插值到亮度网格。最近邻便宜但容易形成台阶,双线性更平滑,高质量 polyphase filter 能更好地控制频率响应。无论哪种方法,都只能估计低通后未采样的位置,不能恢复已经丢弃的高频。

Chroma Siting:样本究竟在哪里#

Chroma Siting 必须随数据一起传递

相同的 4:2:0 标签仍可能采用居中或共址的色度位置;解码假设错误会让彩边偏移。

YYYYYYYYCbCrCbCrCbCrCbCr
水平 siting

标准、容器与编解码器必须约定采样位置。格式转换时若只复制数值、不补偿半像素相位,红蓝边缘会出现系统性偏移。

水平相位+0.5 px
亮度采样每像素
色度覆盖2 × 2

色度可以与左侧亮度样本共址,也可以位于两点或 2×2 区域中心。若编码器按居中采样、解码器按共址重建,相当于让色度相对亮度偏移半个像素。高对比红蓝边缘会出现明显彩边。

JPEG/JFIF、MPEG-2、H.264/AVC 等生态中的默认或可选 siting 并不完全相同。格式转换器必须读取并正确传递元数据,不能只看平面尺寸。

带宽收益#

色度抽样节省了多少数据

在相同分辨率和位深下,4:2:0 的未压缩样本量约为 4:4:4 的一半。

格式
总样本数3.11 M
相对 4:4:450%
60 fps 数据率1.49 Gb/s

忽略 padding、对齐与元数据,宽 WW、高 HH、位深 bb 时:

S444=3WHbS_{444}=3WHbS422=2WHbS_{422}=2WHbS420=1.5WHbS_{420}=1.5WHb

因此 4:2:0 是 4:4:4 原始样本量的一半,是 4:2:2 的 75%。这只是进入压缩器之前的样本预算;最终文件大小还由内容、量化和熵编码决定。

为什么在 YCbCr 上做#

RGB 三通道都同时包含亮度与颜色结构,直接减少某个通道分辨率会引起强烈亮度误差。YCbCr 把主要结构集中在 Y′,使 Cb/Cr 可以采用不同带宽。

典型链路是:

R′G′B′ → Y′CbCr → 色度低通 → 4:2:2 / 4:2:0 取样
→ 编码 → 解码 → 色度上采样 → R′G′B′

这里通常使用非线性编码信号。若直接在场景线性 RGB 上套用常规视频权重和抽样假设,视觉误差分布会不同。

格式与内存布局不是一回事#

“4:2:0”只描述采样结构,不说明内存怎样排列。I420/YUV420P 使用三个平面,NV12 把 CbCr 交错,NV21 则交换成 CrCb。还需知道:

  • 色度顺序是 CbCr 还是 CrCb;
  • 每行 stride、plane offset 和 padding;
  • 位深以及 10/12-bit 在 16-bit 字中的对齐方式;
  • 范围与矩阵标准;
  • siting 和画面裁切是否保持偶数边界。

把 NV12 当 NV21 会整体交换红蓝色差;把 stride 当宽度则会让画面逐行错位。

哪些内容不适合 4:2:0#

  • 红色小字、蓝色小字和彩色 UI 边缘;
  • 屏幕录制、远程桌面和像素级图形;
  • 色键抠像与需要独立通道边缘的后期素材;
  • 反复转码、缩放和旋转的中间格式;
  • 机器视觉中依赖颜色边界定位的输入。

自然影像分发常可接受 4:2:0;采集和后期则可能选择 4:2:2 或 4:4:4,避免多代处理累积损失。

验证清单#

  1. 单像素和彩色棋盘测试低通是否充分;
  2. 红/蓝垂直、水平边缘检查水平与垂直相位;
  3. 4:4:4→4:2:0→4:4:4 往返的 PSNR 与边缘位置;
  4. 奇数宽高、crop、stride 和 plane offset;
  5. I420、NV12、NV21 的通道顺序;
  6. progressive 与 interlaced 4:2:0 的垂直布局;
  7. 矩阵、range、bit depth 与 siting 元数据全链路一致。

4:2:0 省掉的是色度的空间采样密度,不是亮度分辨率,也不是“半张图片”。理解预滤波、采样位置和重建方法,才能解释为什么它对自然画面很高效,却可能把一行红色小字变得模糊不堪。

4:2:0 到底省掉了什么?从色度抽样到重建相位
https://cloudsir.top/posts/how-chroma-subsampling-works/
作者
CloudSir
发布于
2026-08-25
许可协议
CC BY-NC-SA 4.0
色彩滤波阵列怎样采样颜色?从 Bayer Pattern 到颜色混叠
JPEG 怎样压缩一张图片?从 8×8 DCT 到量化与 Zigzag