你有没有想过,为什么一张 5MB 的 BMP 图片,转成 JPEG 后只有 200KB,而且肉眼几乎看不出区别?
在这个流量为王的时代,压缩算法是互联网的基石。没有它,我们的 5G 也会被抖音和 Netflix 瞬间塞爆。但压缩不仅仅是简单的“打包”(像 zip 那样),对于图像和音频来说,它的本质是一场关于“舍弃”的艺术。
今天我们不谈哈夫曼编码那种“无损”的统计学游戏,我们来聊聊有损压缩的核心灵魂:基变换(Basis Transformation)。
我们要聊的三位主角是:傅里叶变换 (DFT)、离散余弦变换 (DCT) 和 奇异值分解 (SVD)。它们都在做同一件事:换个角度看世界,然后把不重要的东西扔掉。
0. 核心思想:从“平铺”到“堆叠”
在一个未经压缩的灰度图像矩阵里,每个像素都是独立的。
- 空间域 (Spatial Domain):你记录的是 $(1,1)$ 点是黑色,$(1,2)$ 点是白色… 这就像是在记录每一个乐高积木的位置。
- 频域 (Frequency Domain):压缩算法认为,任何图片都不是杂乱无章的,而是由各种“波”叠加而成的。
压缩的逻辑很简单:
- 变换:不要用“像素坐标”来描述图片,改用“频率系数”。
- 集中:你会发现,图片的主要能量(大轮廓)都集中在几个特定的“低频”系数上。
- 截断:那些代表噪点和微小细节的“高频”系数,数值很小,直接归零也没人发现。
1. 傅里叶变换 (DFT):理论的巨人
我们先请出欧拉和傅里叶。傅里叶变换告诉我们:任何周期函数都可以写成正弦波和余弦波的叠加。
对于数字图像,我们使用的是 离散傅里叶变换 (DFT)。
\[F(u, v) = \sum_{x=0}^{M-1} \sum_{y=0}^{N-1} f(x, y) e^{-j2\pi(\frac{ux}{M} + \frac{vy}{N})}\]它的压缩逻辑
把图片转到频域后,图像中心通常代表低频(大轮廓),四周代表高频(边缘/噪点)。如果你保留中心,切掉四周,再逆变换回去,图片依然清晰,只是边缘会变模糊。
为什么现在的图片压缩不用它?
DFT 虽然理论完美,但在工程上有两个致命伤:
- 复数运算:DFT 会产生虚部(复数),计算机存复数需要双倍空间(实部+虚部),这对于“压缩”这个目标来说是本末倒置。
- 吉布斯效应(Gibbs Phenomenon):DFT 假设信号是周期的。如果图片左边是白的,右边是黑的,DFT 会认为这张图是无限循环的,导致在边界处产生剧烈的振铃效应(波纹)。
所以,DFT 是信号处理的祖师爷,但不是图像压缩的救星。
2. 离散余弦变换 (DCT):JPEG 的心脏
为了解决 DFT 的问题,DCT 横空出世。它只使用余弦函数 (Cosine),这让它成为了图像压缩的绝对王者(JPEG, H.264, MP3 都靠它)。
它是怎么做的?
DCT 的核心优势是能量集中(Energy Compaction)。它通常把图像切成 $8 \times 8$ 的小块来处理。
- 变换:对每个块做 DCT。你会得到一个 8x8 的系数矩阵。
- 左上角 (DC系数):代表这个块的平均颜色(低频能量)。
- 右下角 (AC系数):代表这个块里最尖锐的噪点和细节(高频能量)。
- 量化 (The Magic Trick):
- 这是压缩发生的时刻!我们用一张“量化表”去除以这些系数。
- 结果:左上角的数字被保留,右下角的数字大概率变成了 0。
- 编码:利用 Z 字形扫描(Zigzag Scan),把那一连串的 0 变成简单的指令(比如“后面全是 0”),文件大小瞬间缩小。
为什么它比 DFT 强?
它全是实数运算(没有 $i$),而且它通过“镜像延拓”解决了边界不连续的问题,不会出现难看的波纹。这就是为什么 JPEG 图片只有在压缩率极高时才会出现“方块效应”,而通常情况下非常清晰。
3. 奇异值分解 (SVD):矩阵的手术刀
如果说 DCT 是给所有图片准备的一套“通用积木”(标准的余弦波),那么 SVD 就是为每一张图片量身定做的“私人定制”。
线性代数告诉我们,任何矩阵 $A$ 都可以分解为三个矩阵的乘积:
\[A = U \Sigma V^T\]其中 $\Sigma$ 是一个对角矩阵,里面的数字 $\sigma_1, \sigma_2, \dots$ 叫作奇异值,按从大到小排列。
它是怎么压缩的?
奇异值的大小代表了信息的重要程度。
- 最大的奇异值 $\sigma_1$ 代表了图像最主要的特征(主骨架)。
- 后面的奇异值代表了越来越细微的纹理。
低秩近似 (Low Rank Approximation):
我们不需要保留所有的奇异值。我们只保留前 $k$ 个最大的奇异值,就能还原出图像的大概样子。
\[A_{compressed} \approx \sigma_1 u_1 v_1^T + \sigma_2 u_2 v_2^T + \dots + \sigma_k u_k v_k^T\]SVD vs. DCT
- DCT 的基是固定的:所有图片都用同一套余弦波来拼。计算极快,适合通用标准(如 JPEG)。
- SVD 的基是计算出来的:$U$ 和 $V$ 取决于图片本身。它是数学上最优的低秩逼近,但计算量巨大($O(N^3)$)。
所以 SVD 通常不用于通用的图像存储,但它在去噪、推荐系统(Netflix 算法)和降维(PCA)里是大神级的存在。
4. 小波变换 (DWT):把“频率”装进不同尺度的放大镜
DFT/DCT 的“频率”是全局的:一个系数会影响整张图。对图像来说,这会带来一个天然矛盾:我们既想知道“有哪些频率”,又想知道“这些频率出现在哪里”。
小波变换 (Wavelet Transform) 的核心想法是:不用无限长的正弦波,而用一段短小、可伸缩、可平移的“波包”(母小波)去匹配信号,从而得到时空/局部化的表示。
它在图像里长什么样?
工程上最常用的是 离散小波变换 (DWT):用滤波器组把图像分解成不同“尺度”的子带。
对一张图做一次 2D-DWT,你会得到四块信息:
- LL:低频里的低频(大轮廓,最重要)
- LH / HL / HH:不同方向的细节(边缘、纹理、噪声)
然后你就可以像 DCT 一样做“舍弃”:
- 保留 LL(或者对 LL 继续分解,做多层金字塔)
- 阈值化/量化 高频子带(把小系数直接变 0)
- 编码:因为大量系数会变成 0,后续熵编码会很吃香
为什么它常被拿来对标 DCT?
- 更少块效应:DCT 以 $8 \times 8$ 为单位,压狠了会出现方块;DWT 是多尺度分解,往往更平滑自然(但压到极致也可能出现“振铃/波纹”)。
- 多分辨率/渐进传输:先看 LL 得到模糊预览,再逐步补上细节,非常适合“边下边看”。
- 代表选手:JPEG 2000:它用的就是小波(注意它不是传统 JPEG 的升级版,而是另一条路线)。
总结:该选谁?
| 算法 | 核心武器 | 优点 | 缺点 | 应用场景 |
|---|---|---|---|---|
| DFT | 复指数 $e^{i\theta}$ | 物理意义明确,便于分析 | 产生复数,边界有伪影 | 信号分析、滤波 |
| DCT | 余弦 $\cos$ | 全是实数,能量集中度极高 | 块效应(压缩太狠时有方块) | JPEG, MP3, 视频编码 |
| SVD | 特征分解 $U\Sigma V^T$ | 数学上的最优逼近,私人定制 | 计算极其昂贵,还需要存 U 和 V | 降维、去噪、推荐系统 |
| DWT | 多尺度滤波器组 | 局部化、多分辨率、块效应更少 | 实现与边界处理更复杂 | JPEG 2000、去噪、特征提取 |
压缩的本质,不是要把世界变小,而是要学会分辨:什么是信号,什么是噪音。
DCT 告诉我们:只要留住低频的轮廓,人类的大脑就会自动补全剩下的细节。这不仅仅是数学,更是对人类感知系统的深刻洞察。
Happy Coding & Compression!
Leave a comment