7、JPEG编解码

目录

一、JPEG编码原理

二、JPEG文件格式

三、JPEG解码流程

四、实验内容

1. 将JPEG文件输出为YUV文件

2. 三个结构体

① struct huffman_table

② struct component 

③ struct jdec_private

3. TRACE

4.  以txt文件输出所有的量化矩阵和所有的HUFFMAN码表

①量化矩阵

②HUFFMAN码表

 5. 输出DC和AC图像并统计其概率分布


一、JPEG编码原理

1. 零偏置Level Offset

  • 对于灰度级是 2^{n}的像素,通过减去 2^{n-1},将无符号的整数值变成有符号数。
    例如: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 中序号对应)
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值