H.265帧间预测中的亚像素精度
为什么亮度块是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 亮度像素精度。因此,两者在物理空间上的插值位置是完全对齐的,精度是相同的。
为什么这样设计?
- 空间对齐 (Spatial Alignment):这是最根本的原因。为了避免运动补偿后出现颜色漂移(color bleeding)的现象,必须保证插值生成的亮度和色度样本在空间位置上是严格对齐的。如果它们的绝对精度不同,补偿后的色块就会相对于亮块产生偏移,尤其是在物体边缘会产生难看的彩色镶边。
- 实现简化 (Implementation Simplicity):在硬件或软件实现中,亮度和色度的运动矢量通常是用同一个整数对来表示,只是代表的含义(分母)不同。例如,一个亮度MV为 (5, 3) 可能代表 (5/4,3/4) 像素偏移。这个 (5, 3) 的整数对可以直接用于色度,代表 (5/8,3/8) 的色度像素偏移。这样,在进行插值时,只需要根据是亮度还是色度,选择不同的插值滤波器和分母即可,处理逻辑非常统一。
- 插值滤波器的需要:为了从整数像素位置生成亚像素位置的样本值,需要使用插值滤波器(如 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 像素精度“更高”,而是在其被稀疏采样的坐标系下,为了与亮度保持物理位置上完全对齐而产生的等效表示。