目录
4. 以txt文件输出所有的量化矩阵和所有的HUFFMAN码表
一、JPEG编码原理
1. 零偏置Level Offset
-
对于灰度级是
的像素,通过减去
,将无符号的整数值变成有符号数。
例如:n=8,灰度级0 ~ 255,通过减去128,转化为-128 ~ 127. -
目的:使像素的绝对值出现3位10进制的概率大大降低。
2. DCT变换
- 对每个单独的彩色图像分量,把整个分量图像分成8×8的图像块,并进行8×8DCT变换,目的是去除图像数据的相关性,便于量化过程去除图像数据的空间冗余。
3. 量化
- 采用中平型均匀量化器
- 因为人眼对亮度信号比对色差信号敏感,因此使用两种量化表:亮度量化值和色差量化值。
- 根据人眼视觉特性(对低频敏感,对高频不太敏感),对低频分量采取较细的量化,对高频分量采取较粗的量化。
4. DC系数的差分编码
-
8 * 8图像块经过DCT变换后得到的DC系数有两个特点:系数数值比较大、相邻 8 * 8 图像块的DC系数值变化不大。
-
根据这个特点,JPEG算法使用了DPCM技术,对相邻图像块之间量化DC系数的差值DIFF进行Huffman编码:
5. AC系数的Z字扫描和游程编码
- Z字扫描:由于DCT变换后,系数大多数集中在左上角,即低频分量区,因此采用Z字形按频率的高低顺序读出,可以出现很多连零的机会,可以使用游程编码。
- 游程编码:在JPEG和MPEG编码中规定为(run,level):表示连续run个0,后面跟值为level的系数。
二、JPEG文件格式
JPEG在文件中以Segment的形式组织,它具有以下特点:
- 均以 0xFF 开始,后跟 1 byte 的 Marker 和 2 byte 的 Segment length(包含表示Length 本身所占用的 2 byte,不含“0xFF” + “Marker” 所占用的 2 byte)。
- 采用 Motorola 序(相对于 Intel 序),即保存时高位在前,低位在后。
- Data 部分中,0xFF 后若为 0x00,则跳过此字节不予处理。
JPEG 的 Segment Marker
三、JPEG解码流程
1. 读取文件
2. 解析 Segment Marker
① 解析SOI
② 解析APP0
- 检查标识“JFIF”及版本
- 得到一些参数
③ 解析DQT
- 得到量化表长度(可能包含多张量化表)
- 得到量化表的精度
- 得到及检查量化表的序号(只能是 0 - 3)
- 得到量化表内容(64 个数据)
④ 解析SOF0
- 得到每个 sample 的比特数、长宽、颜色分量数
- 得到每个颜色分量的 ID、水平采样因子、垂直采样因子、使用的量化表序号(与 DQT 中序号对应)