离散余弦变换在jpeg中的应用

离散余弦变换在jpeg中的应用

📚 离散余弦变换(DCT)数学计算过程详解

离散余弦变换(DCT)是一种将信号从时域(或空域)转换到频域的数学工具,其核心思想是将一个序列表示为一组不同频率余弦函数的加权和。DCT在图像和信号处理中应用广泛(尤其是JPEG压缩),因为它能将信号能量集中到少数低频系数上,便于后续的压缩和处理。下面我们分维度详细解释其数学计算过程。

🔢 一维离散余弦变换(1D-DCT)

一维DCT用于处理序列信号(如音频或图像的一行像素)。给定一个长度为 NN 的实数序列 x[n]x[n](其中 n=0,1,,N1n = 0, 1, \dots, N-1),其DCT变换后得到长度为 NN 的系数序列 X[k]X[k](其中 k=0,1,,N1k = 0, 1, \dots, N-1)。最常用的DCT-II形式公式如下:

正变换(Forward DCT)
X[k]=C[k]n=0N1x[n]cos(π(2n+1)k2N)X[k] = C[k] \cdot \sum_{n=0}^{N-1} x[n] \cdot \cos\left( \frac{\pi (2n + 1)k}{2N} \right)
逆变换(Inverse DCT)
x[n]=k=0N1C[k]X[k]cos(π(2n+1)k2N)x[n] = \sum_{k=0}^{N-1} C[k] \cdot X[k] \cdot \cos\left( \frac{\pi (2n + 1)k}{2N} \right)
其中,归一化系数 C[k]C[k] 定义为:
C[k]={1Nif k=02Nif k=1,2,,N1C[k] = \begin{cases} \sqrt{\frac{1}{N}} & \text{if } k = 0 \\ \sqrt{\frac{2}{N}} & \text{if } k = 1, 2, \dots, N-1 \end{cases}


一. 我将使用序列 x = [8, 6, 2, 4] 详细演示一维离散余弦变换(DCT-II)的计算过程,并解释结果与余弦基函数的关系。

第一步:列出四个余弦基函数

基函数的形式为 cos(π(2n+1)k8)\cos\left( \frac{\pi (2n+1)k}{8} \right),对每个 kk 计算其在 n=0,1,2,3n=0,1,2,3 处的值(保留四位小数):

kk 基函数(向量形式) 物理意义
0 [1.0000, 1.0000, 1.0000, 1.0000][1.0000,\ 1.0000,\ 1.0000,\ 1.0000] 直流分量(恒定不变)
1 [0.9239, 0.3827, 0.3827, 0.9239][0.9239,\ 0.3827,\ -0.3827,\ -0.9239] 最低频振荡,一个完整周期
2 [0.7071, 0.7071, 0.7071, 0.7071][0.7071,\ -0.7071,\ -0.7071,\ 0.7071] 中频振荡,两个周期(对称)
3 [0.3827, 0.9239, 0.9239, 0.3827][0.3827,\ -0.9239,\ 0.9239,\ -0.3827] 高频振荡,三个周期(变化最快)

第二步:逐项计算 DCT 系数 X[k]X[k]

正变换公式:

X[k]=C[k]n=03x[n]cos(π(2n+1)k8)X[k] = C[k] \cdot \sum_{n=0}^{3} x[n] \cdot \cos\left( \frac{\pi (2n + 1)k}{8} \right)

1. 计算 X[0]X[0](DC 系数)

X[0]=C[0]n=03x[n]1=0.5×(8×1.0000+6×1.0000+2×1.0000+4×1.0000)=0.5×20=10.0\begin{aligned} X[0] &= C[0] \cdot \sum_{n=0}^{3} x[n] \cdot 1 \\ &= 0.5 \times (8 \times 1.0000 + 6 \times 1.0000 + 2 \times 1.0000+4\times 1.0000) \\ &= 0.5 \times 20 = \mathbf{10.0} \end{aligned}

2. 计算 X[1]X[1](第一 AC 系数)

先求内积(基函数 k=1k=1xx 的点乘):
nx[n]cos(π(2n+1)8)=8×0.9239+6×0.3827+2×(0.3827)+4×(0.9239)=7.3912+2.29620.76543.6956=5.2264\begin{aligned} \sum_{n} x[n] \cdot \cos\left( \frac{\pi (2n+1)}{8} \right) &= 8 \times 0.9239 + 6 \times 0.3827 + 2 \times (-0.3827) + 4 \times (-0.9239) \\ &= 7.3912 + 2.2962 - 0.7654 - 3.6956 \\ &= 5.2264 \end{aligned}
乘以归一化系数:
X[1]=5.2264×0.707106783.6955X[1] = 5.2264 \times 0.70710678 \approx \mathbf{3.6955}

3. 计算 X[2]X[2](第二 AC 系数)

内积(基函数 k=2k=2):
nx[n]cos(π(2n+1)28)=8×0.7071+6×(0.7071)+2×(0.7071)+4×0.7071=(862+4)×0.7071=4×0.7071=2.8284\begin{aligned} \sum_{n} x[n] \cdot \cos\left( \frac{\pi (2n+1) \cdot 2}{8} \right) &= 8 \times 0.7071 + 6 \times (-0.7071) + 2 \times (-0.7071) + 4 \times 0.7071 \\ &= (8 - 6 - 2 + 4) \times 0.7071 \\ &= 4 \times 0.7071 = 2.8284 \end{aligned}
乘以归一化系数:
X[2]=2.8284×0.70710678=2.0X[2] = 2.8284 \times 0.70710678 = \mathbf{2.0}

4. 计算 X[3]X[3](第三 AC 系数)

内积(基函数 k=3k=3):
nx[n]cos(π(2n+1)38)=8×0.3827+6×(0.9239)+2×0.9239+4×(0.3827)=3.06165.5434+1.84781.5308=2.1648\begin{aligned} \sum_{n} x[n] \cdot \cos\left( \frac{\pi (2n+1) \cdot 3}{8} \right) &= 8 \times 0.3827 + 6 \times (-0.9239) + 2 \times 0.9239 + 4 \times (-0.3827) \\ &= 3.0616 - 5.5434 + 1.8478 - 1.5308 \\ &= -2.1648 \end{aligned}
乘以归一化系数:
X[3]=2.1648×0.707106781.5307X[3] = -2.1648 \times 0.70710678 \approx \mathbf{-1.5307}

最终得到频域为:

X=[10.0, 3.6955, 2.0, 1.5307]\boxed{X = [10.0,\ 3.6955,\ 2.0,\ -1.5307]}


二. 根据频域 [10.0, 3.6955, 2.0, -1.5307] 计算每个点的重建值

IDCT(DCT-II 的逆变换)公式为:

x[n]=k=0N1C[k]X[k]cos(π(2n+1)k2N)x[n] = \sum_{k=0}^{N-1} C[k] \cdot X[k] \cdot \cos\left( \frac{\pi (2n+1)k}{2N} \right)

IDCT 的本质是将 DCT 系数 X[k]X[k] 作为权重,与对应的余弦基函数进行线性组合,从而重建原始信号。具体来说:

  • 权重计算:每个频率分量 kk 的贡献权重为 W[k]=C[k]X[k]W[k] = C[k] \cdot X[k]
    • W[0]=0.5×10.0=5.0W[0] = 0.5 \times 10.0 = 5.0
    • W[1]=0.70710678×3.69552.6132W[1] = 0.70710678 \times 3.6955 \approx 2.6132
    • W[2]=0.70710678×2.01.4142W[2] = 0.70710678 \times 2.0 \approx 1.4142
    • W[3]=0.70710678×(1.5307)1.0824W[3] = 0.70710678 \times (-1.5307) \approx -1.0824

四个余弦基函数在各点的值如下(保留四位小数):

基函数 k n=0 n=1 n=2 n=3
k=0 1.0000 1.0000 1.0000 1.0000
k=1 0.9239 0.3827 -0.3827 -0.9239
k=2 0.7071 -0.7071 -0.7071 0.7071
k=3 0.3827 -0.9239 0.9239 -0.3827
  • 原始序列的每个点由四个基函数的加权和构成:

x[0]=W[0]1.0000+W[1]0.9239+W[2]0.7071+W[3]0.3827=5.0+2.6132×0.9239+1.4142×0.7071+(1.0824)×0.3827=5.0+2.4142+1.0+(0.4142)=8.0\begin{aligned} x[0] &= W[0] \cdot 1.0000 + W[1] \cdot 0.9239 + W[2] \cdot 0.7071 + W[3] \cdot 0.3827 \\ &= 5.0 + 2.6132 \times 0.9239 + 1.4142 \times 0.7071 + (-1.0824) \times 0.3827 \\ &= 5.0 + 2.4142 + 1.0 + (-0.4142) = 8.0 \\ \end{aligned}

x[1]=W[0]1.0000+W[1]0.3827+W[2](0.7071)+W[3](0.9239)=5.0+2.6132×0.3827+1.4142×(0.7071)+(1.0824)×(0.9239)=5.0+1.0+(1.0)+1.0=6.0\begin{aligned} x[1] &= W[0] \cdot 1.0000 + W[1] \cdot 0.3827 + W[2] \cdot (-0.7071) + W[3] \cdot (-0.9239) \\ &= 5.0 + 2.6132 \times 0.3827 + 1.4142 \times (-0.7071) + (-1.0824) \times (-0.9239) \\ &= 5.0 + 1.0 + (-1.0) + 1.0 = 6.0 \\ \end{aligned}

x[2]=W[0]1.0000+W[1](0.3827)+W[2](0.7071)+W[3]0.9239=5.0+2.6132×(0.3827)+1.4142×(0.7071)+(1.0824)×0.9239=5.0+(1.0)+(1.0)+(1.0)=2.0\begin{aligned} x[2] &= W[0] \cdot 1.0000 + W[1] \cdot (-0.3827) + W[2] \cdot (-0.7071) + W[3] \cdot 0.9239 \\ &= 5.0 + 2.6132 \times (-0.3827) + 1.4142 \times (-0.7071) + (-1.0824) \times 0.9239 \\ &= 5.0 + (-1.0) + (-1.0) + (-1.0) = 2.0 \\ \end{aligned}

x[3]=W[0]1.0000+W[1](0.9239)+W[2]0.7071+W[3](0.3827)=5.0+2.6132×(0.9239)+1.4142×0.7071+(1.0824)×(0.3827)=5.0+(2.4142)+1.0+0.4142=4.0\begin{aligned} x[3] &= W[0] \cdot 1.0000 + W[1] \cdot (-0.9239) + W[2] \cdot 0.7071 + W[3] \cdot (-0.3827) \\ &= 5.0 + 2.6132 \times (-0.9239) + 1.4142 \times 0.7071 + (-1.0824) \times (-0.3827) \\ &= 5.0 + (-2.4142) + 1.0 + 0.4142 = 4.0 \\ \end{aligned}

因此,逆变换完美重建了原始序列 x=[8.0,6.0,2.0,4.0]x = [8.0, 6.0, 2.0, 4.0]


三. 模拟压缩:丢弃高频分量

情况一:丢弃权重最小的 W[3]W[3](最高频)

W[3]=0W[3] = 0,重建序列 x1x_1
x1[0]=5.0+2.6132×0.9239+1.4142×0.7071=5.0+2.4142+1.0=8.4142x1[1]=5.0+2.6132×0.3827+1.4142×(0.7071)=5.0+1.0+(1.0)=5.0x1[2]=5.0+2.6132×(0.3827)+1.4142×(0.7071)=5.0+(1.0)+(1.0)=3.0x1[3]=5.0+2.6132×(0.9239)+1.4142×0.7071=5.0+(2.4142)+1.0=3.5858\begin{aligned} x_1[0] &= 5.0 + 2.6132 \times 0.9239 + 1.4142 \times 0.7071 = 5.0 + 2.4142 + 1.0 = 8.4142 \\ x_1[1] &= 5.0 + 2.6132 \times 0.3827 + 1.4142 \times (-0.7071) = 5.0 + 1.0 + (-1.0) = 5.0 \\ x_1[2] &= 5.0 + 2.6132 \times (-0.3827) + 1.4142 \times (-0.7071) = 5.0 + (-1.0) + (-1.0) = 3.0 \\ x_1[3] &= 5.0 + 2.6132 \times (-0.9239) + 1.4142 \times 0.7071 = 5.0 + (-2.4142) + 1.0 = 3.5858 \\ \end{aligned}
得到 x1=[8.414,5.0,3.0,3.586]x_1 = [8.414, 5.0, 3.0, 3.586]

情况二:丢弃 W[2]W[2]W[3]W[3](两个高频分量)

W[2]=0,W[3]=0W[2] = 0, W[3] = 0,重建序列 x2x_2
x2[0]=5.0+2.6132×0.9239=5.0+2.4142=7.4142x2[1]=5.0+2.6132×0.3827=5.0+1.0=6.0x2[2]=5.0+2.6132×(0.3827)=5.0+(1.0)=4.0x2[3]=5.0+2.6132×(0.9239)=5.0+(2.4142)=2.5858\begin{aligned} x_2[0] &= 5.0 + 2.6132 \times 0.9239 = 5.0 + 2.4142 = 7.4142 \\ x_2[1] &= 5.0 + 2.6132 \times 0.3827 = 5.0 + 1.0 = 6.0 \\ x_2[2] &= 5.0 + 2.6132 \times (-0.3827) = 5.0 + (-1.0) = 4.0 \\ x_2[3] &= 5.0 + 2.6132 \times (-0.9239) = 5.0 + (-2.4142) = 2.5858 \\ \end{aligned}
得到 x2=[7.414,6.0,4.0,2.586]x_2 = [7.414, 6.0, 4.0, 2.586]

📈 结果对比与分析

序列 x[0] x[1] x[2] x[3] 与原始序列的均方误差 (MSE)
原始序列 x 8.0 6.0 2.0 4.0 0
丢弃 W[3] 8.414 5.0 3.0 3.586 0.553
丢弃 W[2],W[3] 7.414 6.0 4.0 2.586 1.034

四. 离散余弦变换可视化讲解