【数据压缩】实验:JPEG原理分析及JPEG解码器的调试

一、JPEG编解码原理

1.1 JPEG图像压缩标准基本介绍

JPEG是Joint Photographic Experts Group(联合图像专家小组)的缩写,文件后缀名为.jpg或.jpeg,是最常用的图像文件格式。

JPEG主要采用预测编码(DPCM)、离散余弦变换(DCT)以及熵编码的联合编码方式,从而去除冗余的图像和彩色数据,属于有损压缩格式,在获得极高的压缩率的同时能展现十分丰富生动的图像。

JPEG图像压缩算法能够在提供良好的压缩性能的同时,具有比较好的重建质量,被广泛应用于图像、视频处理领域。

1.2 JPEG编码原理

(1)图像预处理

  • 颜色空间转换:JPEG采用的是YUV颜色空间,因此将输入图片转换为YUV颜色空间,并按一定的采样格式进行采样。
  • 分块:将输入图像分成若干个8×8的小块。在此过程中需对图像的宽和高进行裁剪,使其都为8的倍数,不足的部分复制与其最近的像素值。编码时,按从左至右,从上至下的顺序依次读取一个8×8块,对其进行DCT变换、量化、编码后,再读取下一个8*8块。

(2)零偏置电平下移

对输入图片做零偏置电平下移:对于灰度级是2^{n}的像素,通过减去2^{n-1},将无符号的整数值变成有符号数。这样做可使像素绝对值出现3位10进制数的概率大大减少,从而提高编码效率。

对Y分量进行零偏置电平下移,使Y、U、V电平取值范围都在-128~127之间。

(3)8×8 DCT变换

对每个单独的彩色图像分量,把整个分量图像分成8×8的图像块进行DCT变换,再进行量化和编码处理。DCT变换具有能量守恒、能量集中和去相关的特性,有利于提高编码的效率。由于人眼对低频敏感,高频不敏感,经DCT变化后,能量集中在低频区域,对低频和高频各系数采用不同的量化比特数进行单独量化,就能在保证图像质量的同时提高压缩比。

(4)量化

利用人眼视觉特性设计矩阵量化DCT系数,减小视觉冗余。

  • 人眼对亮度信号比色差信号更敏感,因此使用了两种量化表:亮度量化值和色差量化值;
  • 人眼对低频敏感,对高频不太敏感,因此对低频分量采取较细的量化,对高频分量采取较粗的量化。 

(5)编码

a. DC系数进行差分编码

8x8图像块经过DCT变换后,得到的DC直流系数有两个特点:

  • 系数的数值比较大
  • 相邻8×8图像块的系数值变化不大

根据这个特点,JPEG算法对DC系数进行差分脉冲调制编码(DPCM),对相邻图像块之间的量化DC系数的差值DIFF进行编码。

对DIFF进行Huffman编码:码字由类别ID类内索引两部分组成。通过下表判断DIFF在哪一个范围内,以类别ID作为码字的第一部分,DIFF的真值作为码字的第二部分。

:DC=8,上一DC=5,则DIFF=8-5=3,类别ID=2,类内索引=3,则码流=10011。

b. AC系数进行Z字扫描和游程编码

Z字扫描:经DCT变换后AC系数大多数集中在低频分量区,因此采用Z字形扫描按频率的高低顺序读出,可以出现很多连零的机会。如果最后都是零,给出块结束码EOB (End of Block)即可。

游程编码:Z字扫描后二维数据变成一维数据,采用游程编码(RLC)可以进一步降低数据的传输量。

对一维数据进行游程编码:定义(run,level)结构

  • run表示非0数据前0的个数,其最大值为15,用RRRR表示;
  • level表示非0数据的值,level的编码类似DC系数,先分为16个类别,用4位SSSS表示类别号,再查类内索引。通过下表判断类别:

对(RRRR, SSSS)采用Huffman编码,对类内索引采用定长码编码。SSSS即表示该AC分量数值的类别,也表示接下来需要读入的位数。

:(0,2)用(run,level)结构表示为(1,2),类别为2,(RRRR,SSSS)为(1,2),则码流为=1101110。

1.3 JPEG文件格式

JPEG 在文件中以 Segment 的形式组织,它具有以下特点:

  • 均以 0xFF 开始,后跟 1 byte 的 Marker 和 2 byte 的 Segment length (包含表示Length本身所占用的 2 byte,不含 “ 0xFF ” + “ Marker ” 所占用的 2 byte);
  • 采用 Motorola 序(相对于Intel序),即保存时高位在前,低位在后
  • Data 部分中,0xFF后若为 0x00,则跳过此字节不予处理。

JPEG中常见的图像标记有:

(1) SOI

SOI,Start of Image,图像开始。标记代码2字节,固定值0xFFD8.

(2) APP0

APP0,Application,应用程序保留标记0。标记代码2字节,固定值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位图数据

(3) DQT

DQT,Define Quantization Table,定义量化表。标记代码2字节,固定值0xFFDB.

  ① 数据长度 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值