JPEG(Joint Photographic Experts Group)是一种广泛使用的图像压缩标准,旨在通过有损压缩减少图像文件的大小。
JPEG文件的结构通常包含以下部分:
- 起始标志:文件以0xFFD8开始,表示SOI(Start of Image)。
- 段(Markers):包含图像数据和元数据(如EXIF信息、量化表、霍夫曼表等)。
- 图像数据:实际的图像数据通常以0xFFDA(SOS - Start of Scan)段开始。
- 结束标志:文件以0xFFD9结束,表示EOI(End of Image)。
JPEG压缩的过程主要包括以下几个步骤:
-
颜色空间转换:
- 通常将图像从RGB颜色空间转换为YCbCr颜色空间。Y表示亮度(Luminance),Cb和Cr表示色度(Chrominance)。这样做是因为人眼对亮度变化更敏感,而对色度变化不太敏感。
-
下采样:
- 对色度(Cb和Cr)通道进行下采样,因为人眼对色度的敏感度较低。这意味着图像中每个2x2像素块会共享一个Cb和Cr值,而Y通道保持原始分辨率。
-
块划分:
- 将图像划分为8x8像素的块,每个块分别处理。对每个8x8块进行DCT(离散余弦变换)。
-
离散余弦变换(DCT):
- 对每个8x8像素块进行DCT,转换空间域的像素值为频率域的系数。DCT将图像数据分解为不同频率的成分,其中低频成分包含图像的大部分信息,高频成分包含图像的细节。
-
量化:
- 使用量化表对DCT系数进行量化。量化表中数值较大的元素对应高频成分,这些成分会被较大程度地压缩。量化是JPEG压缩中有损压缩的主要步骤。
-
熵编码:
- 对量化后的DCT系数进行熵编码,通常使用霍夫曼编码或算术编码。这一步将量化后的数据压缩为更小的位流。
-
组装JPEG文件:
- 将所有压缩后的数据块和其他信息(如图像的元数据、量化表、霍夫曼表等)组装成JPEG文件。
以下是一个简单的JPEG压缩过程的图解:
输入图像(RGB)
↓
颜色空间转换(RGB → YCbCr)
↓
下采样(减小色度分辨率)
↓
块划分(8x8块)
↓
DCT(离散余弦变换)
↓
量化(有损压缩)
↓
熵编码(霍夫曼编码)
↓
输出JPEG文件