变换将残差块的能量集中到了少数低频系数上,但这些系数仍然是精度较高的数值,需要大量比特来表示。量化的核心作用有两个:

  1. 信息减少: 这是压缩过程中最主要的信息损失源。它通过降低变换系数的精度来大幅减少需要编码的数据量。这是一个不可逆的过程,丢失的精度在解码端无法恢复。
  2. 创造零值: 量化过程会将大量(特别是高频区域的)小系数直接映射为零。一个充满了零的系数块非常利于后续的熵编码**,能够极大地提升压缩率。

简单来说,量化就是用变换系数去除以一个量化步长,然后取整。这个除法操作就是信息减少的核心。

量化

编码器端 对于变换后的一个系数 $Y_{ij}$,其量化后的系数 $Z_{ij}$ 计算公式如下:

\[Z_{ij} = \text{round} \left( \frac{Y_{ij}}{Q_{step}} \right)\]

这里的 $Q_{step}$ 是量化步长

在 H.264 中,标准没有直接定义 $Q_{step}$,而是引入了一个量化参数

  • QP: 一个从 0 到 51 的整数。QP 越小,量化越精细,质量越高,码率也越高。QP 越大,量化越粗糙,质量越低,码率也越低。
  • QP 与 $Q_{step}$ 的关系: $ Qstep(QP) = 2^{(QP - 4) / 6} $
    • QP 每增加 6,量化步长 $Q_{step}$ 就翻倍。这是一种对数量化策略,符合人眼的视觉感知特性。

量化的简化形式:

\[Z_{ij} = \text{round} \left( \frac{W_{ij} \cdot \text{ScalingFactor}}{Q_{step}} \right)\]

反量化

解码器端 解码器接收到量化后的系数 $Z_{ij}$,需要将其恢复。这个过程称为反量化。

\[Y{ij} = Z_{ij} \cdot Q_{step} \cdot \text{ScalingFactor}\]

注意,这里的 $Y{ij}$ 已经不是原始的变换系数 $Y{ij}$ 了,因为量化过程中的取整操作导致了信息丢失。这就是有损压缩的根源。 $Y{ij} \approx Y_{ij}$, 解码器就用这个近似恢复的系数 $Y’_{ij}$ 进行反变换,得到重建的残差块。

量化矩阵

H.264 还支持使用缩放矩阵 (Scaling Matrix) 来进行更精细的量化控制。编码器可以定义 4x4 或 8x8 的矩阵,让不同频率位置的系数使用不同的量化权重。

\[Z_{ij} = \text{round} \left( \frac{W_{ij} \cdot \text{ScalingFactor}}{Q_{step} \cdot \text{ScalingMatrix}_{ij}} \right)\]

这利用了人眼对高频噪声不敏感的特性。通过为高频位置的系数(矩阵右下角)设置更大的缩放值,可以对它们进行更粗糙的量化,从而在主观质量几乎不变的情况下节省码率。