你有没有想过,为什么一张 5MB 的 BMP 图片,转成 JPEG 后只有 200KB,而且肉眼几乎看不出区别?

在这个流量为王的时代,压缩算法是互联网的基石。没有它,我们的 5G 也会被抖音和 Netflix 瞬间塞爆。但压缩不仅仅是简单的“打包”(像 zip 那样),对于图像和音频来说,它的本质是一场关于“舍弃”的艺术

今天我们不谈哈夫曼编码那种“无损”的统计学游戏,我们来聊聊有损压缩的核心灵魂:基变换(Basis Transformation)

我们要聊的三位主角是:傅里叶变换 (DFT)离散余弦变换 (DCT)奇异值分解 (SVD)。它们都在做同一件事:换个角度看世界,然后把不重要的东西扔掉。


0. 核心思想:从“平铺”到“堆叠”

在一个未经压缩的灰度图像矩阵里,每个像素都是独立的。

  • 空间域 (Spatial Domain):你记录的是 $(1,1)$ 点是黑色,$(1,2)$ 点是白色… 这就像是在记录每一个乐高积木的位置。
  • 频域 (Frequency Domain):压缩算法认为,任何图片都不是杂乱无章的,而是由各种“波”叠加而成的。

压缩的逻辑很简单:

  1. 变换:不要用“像素坐标”来描述图片,改用“频率系数”
  2. 集中:你会发现,图片的主要能量(大轮廓)都集中在几个特定的“低频”系数上。
  3. 截断:那些代表噪点和微小细节的“高频”系数,数值很小,直接归零也没人发现。

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 虽然理论完美,但在工程上有两个致命伤:

  1. 复数运算:DFT 会产生虚部(复数),计算机存复数需要双倍空间(实部+虚部),这对于“压缩”这个目标来说是本末倒置。
  2. 吉布斯效应(Gibbs Phenomenon):DFT 假设信号是周期的。如果图片左边是白的,右边是黑的,DFT 会认为这张图是无限循环的,导致在边界处产生剧烈的振铃效应(波纹)。

所以,DFT 是信号处理的祖师爷,但不是图像压缩的救星。


2. 离散余弦变换 (DCT):JPEG 的心脏

为了解决 DFT 的问题,DCT 横空出世。它只使用余弦函数 (Cosine),这让它成为了图像压缩的绝对王者(JPEG, H.264, MP3 都靠它)。

它是怎么做的?

DCT 的核心优势是能量集中(Energy Compaction)。它通常把图像切成 $8 \times 8$ 的小块来处理。

  1. 变换:对每个块做 DCT。你会得到一个 8x8 的系数矩阵。
    • 左上角 (DC系数):代表这个块的平均颜色(低频能量)。
    • 右下角 (AC系数):代表这个块里最尖锐的噪点和细节(高频能量)。
  2. 量化 (The Magic Trick)
    • 这是压缩发生的时刻!我们用一张“量化表”去除以这些系数。
    • 结果:左上角的数字被保留,右下角的数字大概率变成了 0
  3. 编码:利用 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 一样做“舍弃”:

  1. 保留 LL(或者对 LL 继续分解,做多层金字塔)
  2. 阈值化/量化 高频子带(把小系数直接变 0)
  3. 编码:因为大量系数会变成 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