JPEG解码

JPEG解码

JPEG( Joint Photographic Experts Group)即联合图像专家组,是用于连续色调静态图像压缩的一种标准,文件后缀名为jpg或jpeg,是最常用的图像文件格式。其主要是采用预测编码(DPCM)离散余弦变换(DCT)以及熵编码的联合编码方式,以去除冗余的图像和彩色数据,属于有损压缩格式,它能够将图像压缩在很小的储存空间,一定程度上会造成图像数据的损伤。尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量降低,如果追求高品质图像,则不宜采用过高的压缩比例。

一、JPEG编码原理

编码过程如下图所示,解码是编码的逆过程。

下面简要说明编解码原理:

1、零偏置(Level Offset)

对于灰度级是2的n次方的像素,通过减去2n-1次方,将无符号的整数值变成有符号数。例如:对于n=8,即:将0~255的值域,通过减去128,转换为值域在-128~127之间的值。这样做的目的是:使像素的绝对值出现3位10进制的概率大大减少。

2、DCT变换

对每个单独的彩色图像分量,把整个分量图像分成8×8的图像块,如图所示,并作为两维离散余弦变换DCT的输入

经过DCT变化后,图像中的低频分量会集中在左上角,由于图像低频能量高,所以左上角的数值大,右下角处的零值较多。
DCT变化可以做到以下三点:1、能量守恒 2、能量集中 3、去相关

3、量化

量化步距是按照系数所在的位置和颜色分量来确定的。因为人眼对亮度信号比对色差信号更敏感,因此使用了两种量化表:亮度量化值和色差量化值。
根据人眼的视觉特性(对低频敏感,对高频不太敏感)对低频分量采取较细的量化,对高频分量采取较粗的量化。
如果原始图象中细节丰富,则去掉的数据较多;反之,细节少的原始图象在压缩时去掉的数据少些。

4、DC系数的差分编码

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

  • 1、系数的数值比较大
  • 2、相邻8×8图像块的DC系数值变化不大:冗余。

根据这个特点,JPEG算法使用了差分脉冲调制编码(DPCM)技术,对相邻图像块之间量化DC系数的差值DIFF进行编码:\(DIFF_k =DC_k - DC_{k-1}\)

此编码表并不是一成不变的,不同的文件有不同的码表。以此码表为例,DC=8,上一个DC=5时,则DIFF=8-5=3,类别ID=2,类内索引=3,则码流为10011。

5、AC系数的Z字扫描

由于经DCT变换后,系数大多数集中在左上角,即低频分量区,因此采用Z字形按频率的高低顺序读出,可以出现很多连零的机会。可以使用游程编码。尤其在最后,如果都是零,给出EOB (End of Block)即可。

6、AC系数的游程编码

首先,进行游程编码(RLC),并在最后加上块结束码(EOB);然后,系数序列分组,将非零系数和它前面的相邻的全部零系数分在一组内;每组用两个符号表示[(Run,Size),(Amplitude)]
其中,Amplitude:表示非零系数的幅度值;Run:表示零的游程即零的个数;Size:表示非零系数的幅度值的编码位数

解码重构与编码相反

1、解码Huffman数据
2、解码DC差值
3、重构量化后的系数
4、DCT逆变换
5、丢弃填充的行/列
6、 反零偏置
7、对丢失的Cb Cr分量差值(下采样的逆过程)
8、Y Cb Cr ->R G B

二、JPEG文件格式

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

  1. 均以 0xFF 开始,后跟 1 byte 的 Marker 和 2 byte 的 Segment length(包含表示 Length 本身所占用的 2 byte,不含“0xFF” + “Marker” 所占用的 2 byte);
  2. 采用 Motorola 序(相对于 Intel 序),即保存时高位在前,低位在后;
  3. Data 部分中,0xFF 后若为 0x00,则跳过此字节不予处理
Short name Bytes Payload Name
SOI 0xFFD8 None Start of Image
SOF0 0xFFC0 Variable Size Start Of Frame(Baseline DCT)
SOF2 0xFFC2 Variable Size Start Of Frame(Progressive DCT)
DHT 0xFFC4 Variable Size Define Huffman Table(s)
DQT 0xFFDB Variable Size Define Quantization Table(s)
DRT 0xFFDD 4 Bytes Define Restart Interval
SOS 0xFFDA Variable Size Start Of Scan
RSTn 0xFFDn None Restart
APPn 0xFFEn Variable Size Application-specific
COM 0xFFFE Variable Size Comment
EOI 0xFFD9 None End Of Image

三、JPEG解码

下面我们对JPEG解码流程进行简要说明。

struct huffman_table,struct component,struct jdec_private三个结构体设计的目的如下:

  • struct jdec_private处于最上层,支配整个图像,其中包有 struct huffman_table和struct component。
  • struct huffman_table用来存放DC系数和AC系数的Huffman表
  • struct component用来存放8x8数据块组成的MCU即最小数据单元的数值,相当于移动像块,每次访问下一像块就给该结构体更新数值。
/* tinyjpeg-internal.h */

struct huffman_table
{
  /* Fast look up table, using HUFFMAN_HAS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值