变换将空间域的残差信号转换为频域系数。

在进行帧内或帧间预测后,会得到一个**残差块。这个块虽然数据范围比原始图像小,但仍然存在大量的空间相关性。

变换的目的有:

  1. 去相关: 打破像素之间的空间依赖性,使得每个值都尽可能独立。
  2. 能量集中: 将信号的大部分能量集中到少数几个低频系数上。

变换之后,我们会得到一个系数块。这个块的特点:

  • 大部分能量(即较大的数值)都集中在左上角(低频区域)
  • 右下角(高频区域)则充满了大量接近于零的值。

后续的量化步骤就可以将这些高频的小系数直接置为0,从而实现高效压缩

整数变换

H.264的一个重大创新是采用了整数变换,完全避免了浮点运算,保证了编码器和解码器之间可以精确匹配。

4x4 整数变换

4x4 整数变换应用于亮度和色度残差的 4x4 块

假设我们有一个 4x4 的残差块 X:

\[X = \begin{bmatrix} x_{00} & x_{01} & x_{02} & x_{03} \\ x_{10} & x_{11} & x_{12} & x_{13} \\ x_{20} & x_{21} & x_{22} & x_{23} \\ x_{30} & x_{31} & x_{32} & x_{33} \end{bmatrix}\]

变换后的系数块 $Y$ 通过以下公式计算:

\[Y = C \cdot X \cdot C^T\]

其中 $C$ 是变换矩阵,$C^T$ 是它的转置。变换矩阵 $C$ 是:

\[C = \begin{bmatrix} 1 & 1 & 1 & 1 \\ 2 & 1 & -1 & -2 \\ 1 & -1 & -1 & 1 \\ 1 & -2 & 2 & -1 \end{bmatrix}\]

关键点

  • 这是一个二维变换,等效于先对 $X$ 的每一行进行一维变换(乘以 $C^T$),再对结果的每一列进行一维变换(乘以 $C$)。
  • 矩阵中只有整数 1 和 2,在硬件或软件实现中可以完全用加法和位移(shift)运算来代替乘法,效率极高。
  • 变换后的左上角系数 $y_{00}$ 称为 DC 系数(直流分量),它代表了该 4x4 块的平均能量。其他 15 个系数称为 AC 系数(交流分量),代表不同频率的细节。

Hadamard 变换

亮度DC系数的二次变换

在进行了 4x4 变换后,每个 4x4 块都会产生一个 DC 系数。对于一个 16x16 的亮度宏块,就会有 16 个 DC 系数。些 DC 系数之间仍然存在相关性。

H.264 会将这 16 个 DC 系数组织成一个 4x4 的块,并对其进行一次额外的 Hadamard 变换

\[Y_{DC} = H \cdot D \cdot H^T\]

其中 $D$ 是由 16 个 DC 系数组成的 4x4 块, $H$ 是 Hadamard 变换矩阵:

\[H = \begin{bmatrix} 1 & 1 & 1 & 1 \\ 1 & 1 & -1 & -1 \\ 1 & -1 & -1 & 1 \\ 1 & -1 & 1 & -1 \end{bmatrix}\]

同样,这个变换也只包含 +1-1,计算非常高效。色度块(Chroma)的 DC 系数也会进行一个 2x2 的 Hadamard 变换。

色度DC系数的二次变换

对于色度分量,一个16x16宏块对应一个8x8的色度块。这个8x8块会被划分为4个4x4的小块。

流程如下:

  1. 对这4个4x4的色度残差块分别进行核心4x4整数变换
  2. 每个块产生一个DC系数,总共得到4个色度DC系数。
  3. 这4个DC系数被组织成一个2x2的块。
  4. 对这个2x2的DC块进行2x2的哈达玛变换

2x2 哈达玛变换矩阵:

\[H = \begin{bmatrix} 1 & 1 \\ 1 & -1 \end{bmatrix}\]

8x8 整数变换

H.264 的 High Profile 引入了 8x8 的整数变换。其原理与 4x4 变换类似,但使用了更大的变换块和更复杂的 8x8 变换矩阵。

  • 当编码器选择使用8x8的帧间预测分区时,可以对8x8的残差块直接使用8x8变换,而不是先切分成4个4x4块。
  • 对于平坦区域的大块残差,8x8变换通常能比4x4变换获得更好的能量集中效果,从而提高压缩率。
  • 它同样是8x8 DCT的一个整数近似,保证了无失配和高效计算。