JPEG压缩之DCT离散余弦变换
在digital_video_introduction的一节中讲解 视频编解码器是如何工作的?提到了 DCT,此前没有太关注,最近有对相关的原理进行学习了解,本文对 DCT 离散余弦变换相关的内容进行整理总结。
JPEG 使用的是 二维 DCT,因为它处理的是图像(二维信号),理解二维 DCT 的基础是一维 DCT。
一维离散余弦变换
一维 DCT 将一个长度为 N 的信号序列(例如一行像素值)从空间域转换到频域。最常用的是 DCT-II 类型,这也是 JPEG 标准所使用的。
正变换: 从空间域到频域
其中:
- 是输入信号在位置 的值(例如,像素亮度)。
- 是变换后得到的第 个频率分量(DCT 系数)。
- 是信号的长度(在 JPEG 中,通常是 8)。
- 是频率索引,。
- 是空间位置索引,。
- 是一个归一化系数,定义为:
关键点:
- 当 时, 被称为 直流系数。它实际上是整个信号块的平均值。
- 当 时, 被称为 交流系数。它们代表了信号中不同频率的振荡模式。 越大,代表的频率越高。
二维离散余弦变换
JPEG 将图像分割成 8x8 的小块,然后对每个块独立进行二维 DCT。二维 DCT 可以看作先对每一行进行一维 DCT,然后再对每一列进行一维 DCT(顺序可互换)。
正变换: 从空间域到频域
其中:
- 是 8x8 图像块中在位置 的像素值。在计算前,通常会先将像素值减去 128(即 -128 到 127 的范围),使其围绕零对称。
- 是变换后得到的在频率 上的 DCT 系数。
- (对于标准的 JPEG)。
- 是频率索引,。
- 是空间位置索引,。
- 和 的定义与一维情况相同:
同理于 。
关键点:
- 是 直流系数,代表整个 8x8 块的平均亮度。
- 所有其他的 都是 交流系数。
- 系数 的 和 值越大,代表在水平和垂直方向上的频率越高。
- 在变换后的 8x8 系数矩阵中,左上角是低频系数,右下角是高频系数。图像的大部分能量(信息)都集中在低频区域,这是 JPEG 能够实现高压缩比的关键。
逆离散余弦变换
为了从频域数据重建图像,需要使用逆 DCT。
逆变换: 从频域回到空间域
公式中的各项含义与正变换完全相同。
简单理解
DCT的本质与核心直觉
DCT可以看作离散傅里叶变换(DFT)的一种特殊形式,主要处理实数信号,并且有很好的能量集中特性。
它的核心思想是:任何一个8x8的像素块,都可以看作是64种不同频率的标准余弦波(即“基础图案”)按照特定权重(也就是DCT系数)叠加而成的。
在这些基础图案中:
低频成分(对应于系数矩阵左上角,u和v值较小的部分)代表了图像块的大致轮廓和平滑变化的背景。
高频成分(对应于系数矩阵右下角,u和v值较大的部分)代表了图像块的细节、锐利边缘和纹理。
图像的大部分视觉能量(信息) 通常都集中在低频区域。这意味著,我们往往只需要少数几个大的低频系数,就能大致描述出图像块的主要样貌。
用二进制分解来类比DCT的能量集中
如果我们将所有的0系数也补上
那么对应的系数数组为:[1,0,1,0,1,0,1,1]
如果我们简单将数组低索引称之为”低频”,高索引为”高频”,将数据压缩只包含”低频”系数
[1,0,0,0,0,0,0,0]=>2^7=128 大概丢了25%的信息
[1,0,1,0,0,0,0,0]=>2^7+2^5=160 大概丢了6%的信息
[1,0,1,0,1,0,0,0]=>2^7+2^5=160 大概丢了1%的信息
……
可以看到“高频”信号对整个数据的影响比较小,这与DCT的思想不谋而合:我们保留对整体影响大的主要成分(低频系数),而舍弃或粗略表示那些影响细微的成分(高频系数),从而实现压缩。
总结 JPEG 压缩的流程
- 颜色空间转换:将图像从 RGB 转换到 YCbCr。
- 分块:将每个分量(Y, Cb, Cr)图像分割成 8x8 的块。
- 前向 DCT:对每个 8x8 块应用上述的二维 DCT 公式,得到频率系数。
- 量化:将 DCT 系数除以一个对应的量化步长(来自量化表),并四舍五入到整数。这一步是有损的,是信息丢失的主要来源。高频系数通常会被量化为 0。
- 熵编码:对量化后的系数进行 Zigzag 扫描、差分脉冲编码调制和霍夫曼编码,生成最终的 .jpg 文件。
当解码时,过程是反过来的:熵解码 -> 反量化 -> 逆 DCT -> 合并块 -> 转换回 RGB。
参考
《影像算法解析——JPEG 压缩算法》
《白话文理解DCT离散余弦变换》
《离散余弦变换》
视频
The Unreasonable Effectiveness of JPEG: A Signal Processing Approach
中文翻译版本《离散余弦变换可视化讲解》