JPEG - 想法与实践/简介
JPEG 委员会希望该方法能够以多种变体和扩展方式使用。
- 顺序 DCT 操作模式,其中图像以与第一部分相同的方式扫描(但不是以我们的之字形方式,从左到右逐列扫描,而是从上到下逐行扫描,就像阅读一样)。
- 渐进式 DCT 操作模式,其中图像在位流传输的同时完全显示,最初不完美,然后逐渐改善。
- 无损 操作模式,其中文件仅被压缩,没有任何数据因余弦变换或量化而丢失。
- 分层(DCT 或无损)操作模式,其中图像以多种分辨率存储以供不同用途(低分辨率屏幕、高分辨率打印机等),这样低分辨率图像以补充数据的形式存储,这些数据可以根据需要添加以生成更高分辨率的图像。
颜色值通常以字节(8 位数字)测量,在这种情况下,计算中(实数)数字的精度设置为 11 位。
JPEG 还提供扩展精度,主要用于灰度图像,其中颜色值使用 12 位(范围从 0 到 4095)而不是使用 8 位,并且计算精度增加到 15 位。扩展精度意味着哈夫曼表必须扩展到 DC 数字的 15 位(而不是 11 位)和 AC 数字的 14 位(而不是 10 位)。此外,量化表中的数字可以是字(从 0 到 65535)而不是字节。由于这种可能性很少使用,我们这里将忽略它。
对于基线顺序 DCT 模式,即非扩展顺序 DCT 模式,编码方法是哈夫曼编码,每个分量使用两个表。对于扩展模式,您可以在使用两个或四个表的哈夫曼编码和算术编码之间进行选择。
尽管设计了四种模式,但只有基线顺序 DCT 模式在广泛应用中存活下来。
- 如今,渐进式和分层模式没有太多意义,因为 JPEG 图像传输和显示速度很快。
- 无损模式的好处似乎太小。算术编码可以比哈夫曼编码压缩得更好,但它速度更慢,并且存在与专利相关的問題。
我们这里所做的描述,就像我们在第一部分中所做的描述一样,伴随着一些程序的编写。这次,这样做只是为了确保我们正确理解了该过程。我们将展示用类似 Pascal 的语言编写的这些程序的片段,这些片段应该易于理解。
我们首先制作了一个可以将 BMP 格式的图像转换为 JPEG 格式的灰度图像的程序。当它正常工作后,我们将其扩展到彩色图像。这样的程序,要在 JPEG 文件的生产系统中使用,当然必须用汇编语言编写,并且在变换中不使用协处理器(80 位数字)。但是,如果该程序只是为了演示,或者它是生成计算机图形的程序的一部分,那么它可以用高级语言编写,并且可以使用浮点运算。我们能够读取 JPEG 文件并绘制图像的程序(针对基线顺序 DCT 模式)是通过相同的方式制作的。由于已经存在许多这样的程序,因此它不需要高效。相反,我们通过使用“setpixel”过程使其变得格外缓慢,因为这样做更简单——而且它会使绘制呈现出一种有趣的风格。
下面左侧的图像是用我们第一部分中的程序制作的,右侧的图像是用我们这部分中的程序制作的。质量大致相同。第一个占 16.3 Kb,第二个占 15.1 Kb(未压缩时占 228 Kb)
-
演示程序:16.3 Kb
-
真实程序:15.1 Kb
"连续色调静止图像的数字压缩和编码 - 需求和指南/建议 T.81"(1992),也称为 T.81,长达 180 页。如果您只对使用哈夫曼编码的基线顺序 DCT 模式感兴趣,则不必阅读所有 180 页。所需的数学和编程知识有限。您必须已经了解数学术语的含义,因为这些术语没有解释。
T.81 的目的是为该过程的核心设置一个通用标准。具体细节在实施标准中单独描述。这些在标题为“JPEG 文件交换格式,版本...”的附加文档中。我们所描述的内容中,只有颜色空间指定在这些实施文档中:RGB → YCbCr 变换。
第一部分中显示的这种颜色变换公式可以在 1992 年的 1.02 版本(7 页)中找到。T.81 只谈到四个分量。隐含地,一个分量意味着图像为灰度,三个分量可以是 RGB 分量,最常见的是 YCbCr 分量,第四个分量用于透明度可能性。