JPEG原理分析及JPEG解码器的调试

实验原理

JPEG简介

        JPEG的全称是JointPhotographicExpertsGroup(联合图像专家小组),它是一种常用的图像存储格式, jpg/jpeg是24位的图像文件格式,也是一种高效率的压缩格式,文件格式是JPEG(联合图像专家组)标准的产物,该标准由ISO与CCI TT(国际电报电话咨询委员会)共同制定,是面向连续色调静止图像的一种压缩标准。其最初目的是使用64Kbps的通信线路传输720×576 分辨率压缩后的图像。

        JPEG的压缩,分为四个步骤:

        (1)颜色转换:由于JPEG只支持YUV颜色模式,而不支持RGB颜色模式,所以在将彩色图像进行压缩之前,必须先对颜色模式进据转换。转换完成之后还需要进行数据采样。一般采用的采样比例是2:1:1或4:2:2。由于在执行了此项工作之后,每两行数据只保留一行,因此,采样后图像数据量将压缩为原来的一半。

        (2)DCT变换:DCT(DiscreteConsineTransform)是将图像信号在频率域上进行变换,分离出高频和低频信息的处理过程。然后再对图像的高频部分(即图像细节)进行压缩,以达到压缩图像数据的目的。首先将图像划分为多个8*8的矩阵。然后对每一个矩阵作DCT变换(变换公式此略)。变换后得到一个频率系数矩阵,其中的频率系数都是浮点数。

        (3)量化:由于在后面编码过程中使用的码本都是整数,因此需要对变换后的频率系数进行量化,将之转换为整数。由于进行数据量化后,矩阵中的数据都是近似值,和原始图像数据之间有了差异,这一差异是造成图像压缩后失真的主要原因。

        (4)编码:编码采用两种机制:一是0值的行程长度编码;二是熵编码(EntropyCoding)。在JPEG中,采用曲徊序列,即以矩阵对角线的法线方向作“之”字排列矩阵中的元素。这样做的优点是使得靠近矩阵左上角、值比较大的元素排列在行程的前面,而行程的后面所排列的矩阵元素基本上为0值。行程长度编码是非常简单和常用的编码方式,在此不再赘述。编码实际上是一种基于统计特性的编码方法。在JPEG中允许采用HUFFMAN编码或者算术编码。
 

JPEG文件格式

Segment 的组织形式
   JPEG 在文件中以 Segment 的形式组织,它具有以下特点:
  • 均以 0xFF 开始,后跟 1 byte Marker 2 byte Segment length(包含表示 Length 本身所占用的 2 byte,不含“0xFF+ Marker” 所占用的 2 byte);
  • 采用 Motorola 序(相对于 Intel 序),即保存时高位在前,低位在后;
  • Data 部分中,0xFF 后若为 0x00,则跳过此字节不予处理;
名称 含义 固定值 具体内容
SOI(Start of Image) 图像开始 0xFFD8
APP0(Application) 应用程序保留标记0 0xFFE0

包含9个具体字段:
  ① 数据长度 2字节 ①~⑨9个字段的总长度
 ② 标识符 5字节 固定值0x4A46494600,即字符串“JFIF0”
  ③ 版本号2字节 一般是0x0102,表示JFIF的版本号1.2
  ④ X和Y的密度单位1字节 只有三个值可选
0:无单位;1:点数/英寸;2:点数/厘米
  ⑤ X方向像素密度  2字节 取值范围未知
  ⑥ Y方向像素密度 2字节  取值范围未知  
  ⑦ 缩略图水平像素数目1字节 取值范围未知
  ⑧ 缩略图垂直像素数目1字节 取值范围未知
  ⑨ 缩略图RGB位图  长度可能是3的倍数 缩略图RGB位图数据

DQT(Define Quantization Table) 定义量化表 0xFFDB

包含9个具体字段:
  ① 数据长度 2字节 字段①和多个字段②的总长度
  ② 量化表 数据长度-2字节

    a) 精度及量化表ID  1字节

     高4位:精度,只有两个可选值    0:8位;1:16位
     低4位:量化表ID,取值范围为0~3

    b) 表项  (64×(精度+1))字节

 例如8位精度的量化表,其表项长度为64×(0+1)=64字节

本标记段中,字段②可以重复出现,表示多个量化表,但最多只能出现4次

SOF0(Start of Frame) 帧图像开始 0xFFC0

包含9个具体字段:
  ① 数据长度 2字节 ①~⑥六个字段的总长度
  ② 精度        1字节 每个数据样本的位数
  通常是8位,一般软件都不支持 12位和16位
  ③ 图像高度 2字节 图像高度(单位:像素)

  ④ 图像宽度 2字节 图像宽度(单位:像素)

  ⑤ 颜色分量数 1字节 只有3个数值可选
  1:灰度图;3:YCrCb或YIQ;4:CMYK
  而JFIF中使用YCrCb,故这里颜色分量数恒为3
  ⑥颜色分量信息 颜色分量数×3字节(通常为9字节)      

          a)颜色分量ID 1字节

          b)水平/垂直采样因子 1字节

             高4位:水平采样因子
             低4位:垂直采样因子
          c) 量化表 1字节    当前分量使用的量化表的ID

DHT(Define Huffman Table) 定义哈夫曼表 0xFFC4

包含2个具体字段:

     ① 数据长度       2字节

     ② huffman表 数据长度-2字节 表ID和表类型 1字节

         高4位:类型,只有两个值可选 0:DC直流;1:AC交流

         低4位:哈夫曼表ID

注意,DC表和AC表分开编码

不同位数的码字数量  16字节

编码内容 16个不同位数的码字数量之和(字节)
本标记段中,字段②可以重复出现(一般4次),也可以只出现1次。

SOS(Start of Scan) 扫描开始 0xFFDA

包含2个具体字段:
 ①数据长度        2字节 ①~④两个字段的总长度
 ②颜色分量数        1字节 应该和SOF中的字段⑤的值相同,即:1:灰度图是;3: YCrCb或YIQ;4:CMYK。

 ③颜色分量信息
    a) 颜色分量ID 1字节
    b) 直流/交流系数表号 1字节

        高4位:直流分量使用的哈夫曼树编号
        低4位:交流分量使用的哈夫曼树编号

  ④ 压缩图像数据
        a)谱选择开始 1字节 固定值0x00
        b)谱选择结束  1字节 固定值0x3F
        c)谱选择 1字节 在基本JPEG中总为00

EOI(End of Image) 图像结束 0xFFD9
JPEG 的解码流程

 1.读取文件

2.解析 Segment Marker

        2.1​​​​​ 解析 SOI

        2.2 解析 APP0 
                ·检查标识“JFIF”及版本
                ·得到一些参数
        2.3 解析 DQT
                ·得到量化表长度(可能包含多张量化表)
                ·得到量化表的精度
                ·得到及检查量化表的序号(只能是 0 —— 3)
                ·得到量
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值