JPEG压缩中DCT变换与量化表的配合

从像素块到频率系数

JPEG 压缩的关键,不是把整张图片一次性“变小”,而是把图像拆成许多 8×8 像素块,再分别处理每个块中的明暗变化。二维离散余弦变换(DCT)负责重新表达这些变化,量化表则决定哪些频率信息保留得细、哪些信息更容易被舍弃。

可以把 DCT 理解成“拆波纹”:一个像素块里的明暗起伏,会被分解成不同方向、不同快慢的空间频率。每个 8×8 块经过二维 DCT 后得到 64 个系数,位置通常这样理解:

  • 左上角:直流系数,表示这个像素块的平均亮度。
  • 靠近左上角:低频系数,描述缓慢变化的大面积明暗关系。
  • 靠右下角:较高频系数,描述细线、锐利边缘和细密纹理等快速变化。

DCT 本身通常不是主要的有损环节。在精确实现中,DCT 与逆 DCT 理论上可以恢复原来的数值;实际实现还会受到有限精度和舍入影响,但 JPEG 中造成主要不可逆损失的是量化,随后还有系数舍入与熵编码过程。常见基线 JPEG 使用 8 位样本和基于 DCT 的有损编码,格式规范由 ISO/IEC 10918-1 与 ITU-T T.81 规定;其他 JPEG 模式和编码器可能采用不同特性。

图片转JPG工具通常把压缩强度包装成“质量”参数,例如 95、80 或 60。不过,“质量 80”不是跨工具、跨编码器统一的物理指标。不同程序可能采用不同的默认量化表、质量缩放规则、色度抽样方式和元数据设置,所以只能在同一工具、同一版本、同一导出条件下比较。

量化表如何决定高频丢失

量化会把每个 DCT 系数除以量化表中同一位置的数值,再四舍五入。可写成:

量化系数 = round(DCT系数 ÷ 量化表对应值)

解码时,程序再把量化结果乘回该量化值。由于除法后的四舍五入无法完全逆转,量化步长越大,原始系数可能落入同一个整数结果,误差范围通常也越大。

标准示例中的亮度量化表,左上角通常是 16,右下角通常是 99。这表示低频位置的量化步长较小,保留更细;右下区域的步长较大,高频系数更容易被量化为 0。但这只是常见标准表的示例,具体数值取决于采用的标准表、编码器以及质量缩放方式,不能把所有 JPG 的量化表都当成这一张。

例如,假设某个高频位置的 DCT 系数为 25:

25 ÷ 16 ≈ 1.56,四舍五入后为 2;25 ÷ 32 ≈ 0.78,四舍五入后为 1

如果系数只有 12,那么使用步长 16 时结果为 1,使用步长 32 时结果则为 0。解码后,前者约恢复为 16,后者恢复为 0。对应到图像上,细线、文字边缘和树叶纹理中的局部变化就可能变弱,甚至断开。

量化表并不是“高频全部删除”的开关。每个频率位置都有独立步长,最终结果还取决于原始图像在该位置上的 DCT 系数、量化表、质量缩放规则和具体编码器。某个高频系数足够大,即使量化步长为 32,也可能保留下来。

量化强度如何变成可见画质

当大量高频系数归零,图像中的细节会变软。量化过强时,8×8 块之间的亮度或色彩变化无法连续衔接,还可能出现以下伪影:

  • 方块效应:相邻 8×8 块的边界变得可见,常见于平滑天空、墙面等区域。
  • 振铃:高对比边缘附近出现明暗波纹,类似边缘旁的细小光晕。
  • 蚊噪:文字或锐利物体周围出现零散斑点,通常与量化后残留的高频系数有关。
  • 色度边缘模糊:彩色文字、细彩线和高饱和度边缘变得不清楚,常与色度抽样和色度量化共同相关。

JPEG 通常对亮度和色度分量分开处理。人眼对亮度细节通常比对色彩细节更敏感,因此编码器常对色度使用更强压缩;常见的 4:2:0 色度抽样还会降低色度分辨率。照片中这种处理往往不明显,但对红色小字、彩色线稿和网页截图影响更直接。

文件大小也不只由量化表决定。量化后产生的零值越多,游程编码越容易压缩;随后使用的霍夫曼编码还会受符号分布影响。因此,同一质量参数下,纯色照片、树叶密集的风景和包含大量文字的截图,文件大小可能差异很大。

检查 JPEG 时,可以放大到 400% 或 800%,观察以下位置:

  • 纯色区域中是否出现可见的 8×8 方块边界。
  • 小字号文字的笔画是否变细、断裂或粘连。
  • 高对比斜线是否出现阶梯、振铃或蚊噪。
  • 树叶、头发、织物等高频纹理是否变成一片模糊。

照片可以接受的质量设置,不一定适合截图、线稿或带小字号文字的图片。后者包含大量锐利边缘和规则细线,通常需要更高质量,或直接使用 PNG 等无损格式。

用图片转JPG验证量化差异

可以用同一张无损原图做一个小实验。关键是每个质量档位都从原图重新导出,不能把已经压缩过的 JPG 再作为下一轮输入。

  1. 准备一张包含纯色背景、细文字、斜线和复杂纹理的 PNG 或 TIFF 原图。
  2. 在图片转JPG工具中分别导出质量 95、80、60、40 的 JPG。
  3. 记录每个文件的大小,并保持宽高、色彩模式、色度抽样和元数据设置一致。
  4. 将结果放大到 400% 或 800%,分别查看方块边界、文字笔画、斜线和纹理。
  5. 把文件大小与可见损失放在一起比较,判断哪个档位适合自己的用途。

可以按下面的方向记录结果,但不要把它当成所有编码器都适用的固定结论:

  • 质量 95:通常保留较多细节,文件较大,适合需要较少可见损失的照片。
  • 质量 80:常用于网页照片,但具体文件大小和伪影取决于编码器及色度设置。
  • 质量 60:细纹理、文字边缘和高对比线条更容易出现损失。
  • 质量 40:方块效应、蚊噪和色彩边缘模糊更容易被观察到。

如果工具支持自定义量化表,可以固定质量参数,只替换亮度量化表,比较右下角高频项增大或减小时的变化。若工具不支持自定义量化表,就只能观察其预设表和质量缩放规则的结果,不能据此推断所有 JPEG 编码器的行为。

测试时不要把一次导出后的 JPG 反复转成 JPG。每次重新编码都可能再次量化已有系数,误差会累积;可靠的比较方法是始终从同一张无损原图开始。

最容易误解的一点

“DCT 直接删除了高频信息”并不准确。DCT 主要负责重新表达信息,把像素变化转换成 64 个频率系数;不可逆丢失主要发生在量化阶段。

量化表右下角数值较大,只说明这些频率位置通常使用更粗的量化步长,并不意味着所有高频系数必然为零。实际结果取决于图像内容、量化表、质量缩放规则、色度抽样和具体编码器。用同一原图测试质量 95、80、60、40,再在 400% 或 800% 下观察,才能把抽象的量化差异对应到真实画质。

更多推荐

用Alpha通道拆解发丝透明度 人像抠图中,真正难处理的不是人物主体,而是发丝、绒毛和半透明边缘。解决思路不是把边缘一刀切掉,而是用Alpha通道记录每个像素应保留多少:常用的8位Alpha取值范围是0~255,0代表完全透明,255代表完

了解更多 >

先把比较条件锁死:9×9 核不等于同样强度 均值模糊和高斯模糊都能让图片变软,但它们在文字边缘、细线和高对比度轮廓上的表现不同。要看出差异,不能只比较缩略图,而要固定图像、核尺寸、边界处理和输出格式,再观察局部细节与实际耗时。 使用同一张

了解更多 >

亮度/对比度调整看似只是拖动滑块,实际是在重排像素值。线性变换均匀改变整个亮度范围,S 型曲线则把对比度集中到特定区域;两者对暗部、亮部细节的影响并不相同。 先用灰度映射看懂两种调法 可以把灰度调整理解为一张“输入—输出”对照表:输入像

了解更多 >

说明主色提取要解决的实际问题 图片主色提取的目标,是从一张图的像素中找出 3~8 个代表颜色,生成可用于配色、设计参考或图片取色工具的主色板。输出不应只有几个色块,还应包含每种颜色的 HEX、RGB、像素占比,以及明确的排序依据。 直接按

了解更多 >

先把二值图变成可切行的投影信号 OCR 预处理中的倾斜校正,目标是让文字基线接近水平;投影切割,目标是找出每一行文字的上下边界。两者的实际顺序通常是:灰度化、二值化、估计角度、旋转校正、水平投影切行。 二值化是把每个像素归为前景或背景。

了解更多 >