JPEG文件格式及其解码流程

jpeg是1992年发布的图片编码标准,20多年过去了,它在如今图片压缩领域仍然占据着重要地位。本文主要针对标准ISO/IEC 10918-1 分析jpeg文件结构以及解码流程。

1.文件结构

1.1 基本单元

Jpeg文件由一个一个段来存储。段的一般结构为:前两个字节为段标识(第一个字节为0xff,第二个字节对于不同段,这个值是不同的),后面紧跟两个字节为该段的长度,该长度不包含段标识的两个字节。

名称 字节数 数据 说明
段标识 1 0xff 每个段的开始标识
段类型 1 段类型标记码
段长度 2 包括段内容和段长度本身,不包含段标识和段类型
段内容 <=65533字节
  1. 段长度按大端序存放,高位在前,低位在后
  2. 有些段没有长度也没有段内容,只有段标识和段类型。如SOI、EOI
  3. 段与段之间可以存在很多ff数据,这些数据位填充字节

jpeg文件关键结构如下图所示,包含如下几个关键段:
JPEG文件格式及其解码流程_第1张图片

1.2 段类型

Jpeg的段类型有30多种,其中有10种是必须识别的,其他类型都可以忽略。

  • 1)SOI (start of image),标记码0xD8,表示Jpeg文件头
  • 2)EOI (end of image), 标记码0xD9
  • 3)DQT 定义量化表。标记码 0xDB
名称 Bits 数值 说明
段标识 8 FF
段类型 8 DB
段长度 16
精度 4 0 表示8bit精度;1表示16bit精度
量化表id 4
量化表数据 64x数据精度(8或16)
  • 4)SOF 图像头元素,标识码0xC0-0xCF
名称 Bits 数值 说明
段标识 8 FF
段类型 8 C0-CF
段长度 16
像素精度 8
图片高 16
图片宽 16
通道数 8 1表示灰度图;3表示YCbCr;4表示CMYK 数值不能超过4
通道ID 8 1-Y;2-Cb;3-Cr;4-I;5-Q
水平采样系数 4 采样系数是实际采样方式与最高采样系数之比,而最高采样系数一般是0.5
垂直采样系数 4
选择量化表ID 8
  • 5)DHT 定义huffman表,标识码C4
名称 Bits 数值 说明
段标识 8 FF
段类型 8 C4
段长度 16
表类型 4 0表示DC表;1表示AC表
表ID 4
位表 16x8 每种位长的编码再huffman树中的个数
Huffman表数据 Nx8(n表示位表16个数之和)
  1. jpeg文件有两类huffman表:一类用于DC、一类用于AC。一般有4个表:亮度的DC和AC,色度的DC和AC。Huffman表总数不能超过6.
  2. 一个DHT段可以包含多个huffman表,每个都有自己的信息
  • 6)SOS,标识码DA
名称 Bits 数值 说明
段标识 8 FF
段类型 8 DA
段长度 16
该scan内通道数 8 必须在1-4范围内
通道ID 8 如果有n个通道,这三个变量需要重复n次
DC系数解码使用的Huffman表ID 4
AC系数解码使用的Huffman表ID 4
24 剩余三个字节忽略
  • 7)DRI (定义复位间隔),标识码0xDD
名称 Bits 数值 说明
段标识 8 FF
段类型 8 DA
段长度 16
复位间隔 8 复位标记的间隔距离

1.复位间隔标识在压缩数据流中,每隔n个MCU块就有一个RST标记,RST标记将huffman的解码数据复位,DC也重新从0开始。
2.RST标记共有8个(RST0-RST7),冲RST0开始使用,按顺序到RST7,再从RST0开始。

2.解码过程

Jpeg标准中,image、frame、scan几个概念的区别。
Image表示一个jpeg图片。对于顺序(sequential)模式和progressive编码图片,一个image只包含一个frame。Hierarchical模式的image包含多个frame。

一个frame由一个或多个scan组成。对于顺序模式编码的图片,一个scan包含一个或多个颜色通道。如图1所示,一个frame由三个scan组成,如果以非交错方式存放数据,每个scan只有一个通道的数据;如果以交错方式,则一个scan存放3个通道的数据。

如果图片各颜色通道的分辨率不一样,如图2所示,B和C通道的宽是A通道的一半。其数据交错存放方式为途中所示。

Jpeg编码的最小单元MCU(minimum coded unit),一个scan包含一个或多个MCU。MCU由一个或多个数据单元(data unit)构成,数据单元是8x8数据块。对于非交错存放方式,MCU是由一个数据单元构成;如果是交错存放方式,MCU由每个通道一个或多个数据单元组成。图1中交错方式的第一个MCU包括A1、B1、C1,图2中第一个MCU包含4个数据单元A1、A2、B1、C1.

JPEG文件格式及其解码流程_第2张图片
表1 交错/非交错编码顺序

JPEG文件格式及其解码流程_第3张图片
表2

2.1 解码流程

Jpeg解码流程如下图所示:

  1. 读取一个segment的标识符;如果该标识符为SOS进入步骤3,如果该标识符为EOI则进入步骤6;
  2. 按照第一节所示关键segment语法解析元素;解析完后进入步骤1;
  3. 解析SOS头部语法元素;
  4. 解析SOS中的dc、ac系数;
  5. 重建图片数据
  6. 解码结束
    JPEG文件格式及其解码流程_第4张图片

2.2 重建图像数据

Jpeg重建图像的基本单元时data unit(8x8数据块)。对于数据单元处理过程与mpeg1/2的block解码类似。解码过程的输入为8x8数据块的压缩数据,输出为该数据块的重建值。因为最终数据经过了huffman熵编码压缩,所以解码过程依赖DHT解析的huffman表。

  1. 通过DC huffman表解析块的DC系数,并加上DC预测值;
  2. 通过AC huffman表解析块的AC系数;
  3. 反量化,DC、AC系数乘以量化值(由DQT解析)
  4. 反变换后得到最终重建数据,IDCT变换与mpeg实现完全一致

你可能感兴趣的:(编解码)