离散余弦变换在jpeg中的应用
📚 离散余弦变换(DCT)数学计算过程详解
离散余弦变换(DCT)是一种将信号从时域(或空域)转换到频域的数学工具,其核心思想是将一个序列表示为一组不同频率余弦函数的加权和。DCT在图像和信号处理中应用广泛(尤其是JPEG压缩),因为它能将信号能量集中到少数低频系数上,便于后续的压缩和处理。下面我们分维度详细解释其数学计算过程。
🔢 一维离散余弦变换(1D-DCT)
一维DCT用于处理序列信号(如音频或图像的一行像素)。给定一个长度为 N 的实数序列 x[n](其中 n=0,1,…,N−1),其DCT变换后得到长度为 N 的系数序列 X[k](其中 k=0,1,…,N−1)。最常用的DCT-II形式公式如下:
正变换(Forward DCT):
X[k]=C[k]⋅n=0∑N−1x[n]⋅cos(2Nπ(2n+1)k)
逆变换(Inverse DCT):
x[n]=k=0∑N−1C[k]⋅X[k]⋅cos(2Nπ(2n+1)k)
其中,归一化系数 C[k] 定义为:
C[k]=⎩⎨⎧N1N2if k=0if k=1,2,…,N−1
一. 我将使用序列 x = [8, 6, 2, 4] 详细演示一维离散余弦变换(DCT-II)的计算过程,并解释结果与余弦基函数的关系。
第一步:列出四个余弦基函数
基函数的形式为 cos(8π(2n+1)k),对每个 k 计算其在 n=0,1,2,3 处的值(保留四位小数):
| k |
基函数(向量形式) |
物理意义 |
| 0 |
[1.0000, 1.0000, 1.0000, 1.0000] |
直流分量(恒定不变) |
| 1 |
[0.9239, 0.3827, −0.3827, −0.9239] |
最低频振荡,一个完整周期 |
| 2 |
[0.7071, −0.7071, −0.7071, 0.7071] |
中频振荡,两个周期(对称) |
| 3 |
[0.3827, −0.9239, 0.9239, −0.3827] |
高频振荡,三个周期(变化最快) |
第二步:逐项计算 DCT 系数 X[k]
正变换公式:
X[k]=C[k]⋅n=0∑3x[n]⋅cos(8π(2n+1)k)
1. 计算 X[0](DC 系数)
X[0]=C[0]⋅n=0∑3x[n]⋅1=0.5×(8×1.0000+6×1.0000+2×1.0000+4×1.0000)=0.5×20=10.0
2. 计算 X[1](第一 AC 系数)
先求内积(基函数 k=1 与 x 的点乘):
n∑x[n]⋅cos(8π(2n+1))=8×0.9239+6×0.3827+2×(−0.3827)+4×(−0.9239)=7.3912+2.2962−0.7654−3.6956=5.2264
乘以归一化系数:
X[1]=5.2264×0.70710678≈3.6955
3. 计算 X[2](第二 AC 系数)
内积(基函数 k=2):
n∑x[n]⋅cos(8π(2n+1)⋅2)=8×0.7071+6×(−0.7071)+2×(−0.7071)+4×0.7071=(8−6−2+4)×0.7071=4×0.7071=2.8284
乘以归一化系数:
X[2]=2.8284×0.70710678=2.0
4. 计算 X[3](第三 AC 系数)
内积(基函数 k=3):
n∑x[n]⋅cos(8π(2n+1)⋅3)=8×0.3827+6×(−0.9239)+2×0.9239+4×(−0.3827)=3.0616−5.5434+1.8478−1.5308=−2.1648
乘以归一化系数:
X[3]=−2.1648×0.70710678≈−1.5307
最终得到频域为:
X=[10.0, 3.6955, 2.0, −1.5307]
二. 根据频域 [10.0, 3.6955, 2.0, -1.5307] 计算每个点的重建值
IDCT(DCT-II 的逆变换)公式为:
x[n]=k=0∑N−1C[k]⋅X[k]⋅cos(2Nπ(2n+1)k)
IDCT 的本质是将 DCT 系数 X[k] 作为权重,与对应的余弦基函数进行线性组合,从而重建原始信号。具体来说:
- 权重计算:每个频率分量 k 的贡献权重为 W[k]=C[k]⋅X[k]。
- W[0]=0.5×10.0=5.0
- W[1]=0.70710678×3.6955≈2.6132
- W[2]=0.70710678×2.0≈1.4142
- W[3]=0.70710678×(−1.5307)≈−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
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
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
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
因此,逆变换完美重建了原始序列 x=[8.0,6.0,2.0,4.0]。
三. 模拟压缩:丢弃高频分量
情况一:丢弃权重最小的 W[3](最高频)
设 W[3]=0,重建序列 x1:
x1[0]x1[1]x1[2]x1[3]=5.0+2.6132×0.9239+1.4142×0.7071=5.0+2.4142+1.0=8.4142=5.0+2.6132×0.3827+1.4142×(−0.7071)=5.0+1.0+(−1.0)=5.0=5.0+2.6132×(−0.3827)+1.4142×(−0.7071)=5.0+(−1.0)+(−1.0)=3.0=5.0+2.6132×(−0.9239)+1.4142×0.7071=5.0+(−2.4142)+1.0=3.5858
得到 x1=[8.414,5.0,3.0,3.586]。
情况二:丢弃 W[2] 和 W[3](两个高频分量)
设 W[2]=0,W[3]=0,重建序列 x2:
x2[0]x2[1]x2[2]x2[3]=5.0+2.6132×0.9239=5.0+2.4142=7.4142=5.0+2.6132×0.3827=5.0+1.0=6.0=5.0+2.6132×(−0.3827)=5.0+(−1.0)=4.0=5.0+2.6132×(−0.9239)=5.0+(−2.4142)=2.5858
得到 x2=[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 |
四. 离散余弦变换可视化讲解