为什么亮度块是1/4像素精度,但是色度块却要1/8的精度

问题的核心在于 坐标系的相对性。看似色度的精度更,但这是相对于其自身亚采样后的坐标系而言的。

如果将亮度和色度的运动矢量精度统一到同一个绝对坐标系下,它们的物理精度是完全相同的。

前提:色度亚采样

在绝大多数视频编码标准中,都采用了 YCbCr 色彩空间,并对色度分量(Cb 和 Cr)进行亚采样,最常见的就是 4:2:0 格式。这是因为人眼对亮度的敏感度远高于色度,减少色度信息可以大幅压缩数据量,而人眼却难以察觉。

在 4:2:0 格式中:

  • Cb 和 Cr 分量的水平分辨率和垂直分辨率都分别是亮度(Luma)分量的一半。
  • 这意味着,一个 2x2 的亮度像素块才对应一个色度像素点。

空间关系:

亮度 (Y) 采样网格:          色度 (Cb/Cr) 采样网格:

Y Y Y Y                     C       C
Y Y Y Y
Y Y Y Y                     C       C
Y Y Y Y

(每个 'Y' 代表一个亮度采样点)   (每个 'C' 代表一个色度采样点)

从图中可以清晰地看到,色度采样点之间的距离是亮度采样点之间距离的 两倍

运动矢量的派生与缩放

在进行帧间预测时,运动估计通常只在亮度分量上进行。这是因为亮度分量包含更多的图像细节和边缘信息,计算出的运动矢量更准确。

得到亮度块的运动矢量 MV_Y=(mv_x,mv_y) 后,色度块会直接复用这个结果,但需要根据其亚采样比例进行缩放

对于 4:2:0 格式,缩放关系如下:

MV_Cb = MV_Cr = 2MV_Y = (2mv_x, 2mv_y)$

如果亮度块的运动矢量是 (10, 8) 个像素,那么对应的色度块的运动矢量就是 (5, 4) 个像素(在它自己的坐标系下)。

精度的统一

编码器中定义的精度是相对于各自的采样网格的。

  • 亮度精度: 1/4 亮度像素 (quarter-pel)
  • 色度精度: 1/8 色度像素 (eighth-pel)

让我们把色度精度转换到亮度的坐标系下,看看它的“绝对物理精度”是多少。

因为 1 个色度像素的“宽度”或“高度”等于 2 个亮度像素的“宽度”或“高度”,所以:

1 色度像素单位=2 亮度像素单位

1 色度像素单位=2 亮度像素单位

现在,我们将 1/8 的色度精度进行转换:

81 色度像素单位=81×(2 亮度像素单位)=82 亮度像素单位=41 亮度像素单位

81 色度像素单位=81×(2 亮度像素单位)=82 亮度像素单位=41 亮度像素单位

结论: 当把色度的 1/8 像素精度转换到与亮度相同的坐标系下时,它等效于 1/4 亮度像素精度。因此,两者在物理空间上的插值位置是完全对齐的,精度是相同的。

为什么这样设计?

  1. 空间对齐 (Spatial Alignment):这是最根本的原因。为了避免运动补偿后出现颜色漂移(color bleeding)的现象,必须保证插值生成的亮度和色度样本在空间位置上是严格对齐的。如果它们的绝对精度不同,补偿后的色块就会相对于亮块产生偏移,尤其是在物体边缘会产生难看的彩色镶边。
  2. 实现简化 (Implementation Simplicity):在硬件或软件实现中,亮度和色度的运动矢量通常是用同一个整数对来表示,只是代表的含义(分母)不同。例如,一个亮度MV为 (5, 3) 可能代表 (5/4,3/4) 像素偏移。这个 (5, 3) 的整数对可以直接用于色度,代表 (5/8,3/8) 的色度像素偏移。这样,在进行插值时,只需要根据是亮度还是色度,选择不同的插值滤波器和分母即可,处理逻辑非常统一。
  3. 插值滤波器的需要:为了从整数像素位置生成亚像素位置的样本值,需要使用插值滤波器(如 AVC 中的 6-tap 或 HEVC 中的 7-tap/8-tap 滤波器)。亮度的亚像素位置有 3 个(1/4, 2/4, 3/4),而色度在进行运动矢量缩放后,可能产生更多的小数位置。例如,一个亮度的 1/4 像素偏移,对应到色度就是 (1/4)/2 = 1/8 的偏移。为了精确表示这些由亮度MV缩放而来的所有可能位置,色度需要一个更精细的分母,即 8。

总而言之,色度的 1/8 像素精度并非比亮度的 1/4 像素精度“更高”,而是在其被稀疏采样的坐标系下,为了与亮度保持物理位置上完全对齐而产生的等效表示。