数据压缩实验五——JPEG原理分析及JPEG解码器的调试

该博客深入探讨了JPEG图像压缩标准,包括其有损压缩原理、编码和解码流程。重点讲解了DCT变换、量化、熵编码等关键步骤,并详细阐述了JPEG文件的Segment组织形式和解码过程。此外,还涉及了JPEG解码器的调试,包括结构体理解、代码修改和实验结果分析。
摘要由CSDN通过智能技术生成

实验原理

概述

JPEG是Joint Photographic Experts Group(联合图像专家小组)的缩写,是第一个国际图像压缩标准。JPEG图像压缩算法能够在提供良好的压缩性能的同时,具有比较好的重建质量,被广泛应用于图像、视频处理领域。
在ISO公布的JPEG标准方案中,包含了两种压缩方式。一种是基于DCT变换的有损压缩编码方式,它包含了基本功能和扩展系统两部分。有损压缩编码去除冗余的图像数据,在获得极高的压缩率的同时能展现十分丰富生动的图像;一种是基于空间DPCM(差分脉冲编码调制,是预测编码的一种)方法的无损压缩编码方式,但并不在产品中有广泛支持。本次实验主要学习有损压缩编解码系统。

JPEG编码

这里写图片描述

压缩编码原理

根据人眼的视觉特性,人眼对亮度信息比色度信息敏感,对低频信息比高频信息敏感。首先对色度信息进行下采样。另外,将空间域的亮度色度信息经DCT变换到频域,对亮度信息细量化、色彩信息粗量化,对低频信息细量化、高频信息粗量化。再对量化结果进行变长编码,达到压缩图片的目的,同时主观上图片质量不甚下降。

编码流程

  1. 色彩空间转换
    为了减少色度通道包含的大量的冗余信息,JPEG编码采用YCbCr色彩空间。首先需要进行从RGB到YCbCr的色彩空间变换:
    Y = 0.299000R + 0.587000G + 0.114000B
    Cb = -0.168736R - 0.331264G + 0.500002B

Cr = 0.500000R - 0.418688G - 0.081312B
其中Y是亮度分量Cb、Cr是色度分量。
2. 下采样
为实现压缩,对色度信息进行下采样,由原4:4:4的格式变为4:2:2或4:2:0格式或不进行下采样。
3. 块分割
下采样后,每个通道都要分割成很多个8x8的块,因为它是后续变换量化编码的基本单位。根据下采样格式,决定原图像上MCU(Minimum Coded Unit)块的大小:8x8(4:4:4)、16x8(4:2:2)、16x16(4:2:0),经过分割后,每个MCU三个通道都为8x8的块。
4. DCT变换
这里写图片描述
DCT(DiscreteCosineTransform)是将图像信号在频率域上进行变换,分离出高频和低频信息的处理过程。然后再对图像的高频部分(即图像细节)进行压缩,以达到压缩图像数据的目的。对每个通道的每个8x8矩阵块作DCT变换,变换后得到一个频率系数矩阵,其中的频率系数都是浮点数。
5. 量化
这里写图片描述
图为标准亮度量化表,通过高频粗量化去除冗余。由于在后面编码过程中使用的码本都是整数,因此需要对变换后的频率系数进行量化,将之转换为整数。由于进行数据量化后,矩阵中的数据都是近似值,和原始图像数据之间有了差异,这一差异是除下采样外,造成图像压缩后失真的唯一原因。
6. 熵编码
这里写图片描述
首先进行之字形扫描(Zig-zag ordering)。即以矩阵对角线的法线方向作“之”字排列矩阵中的元素。这样做的优点是使得靠近矩阵左上角、值比较大的元素排列在行程的前面,而行程的后面所排列的矩阵元素基本上为0值。
之后利用相邻块之间DC系数的空间相关性,对DC系数进行DPCM编码,即当前块的DC系数减去前一块的DC系数后编码。
对AC系数进行游程编码(Run-Length Ecoding)。RLE的原理是检测每个非零的AC系数,及其前面0的个数,这需要两个符号来表示:

Symbol 1 Symbol 2
(RUNLENGTH, SIZE) (AMPLITUDE)

RUNLENGTH表示0的个数,SIZE表示表示这个为零系数所需的比特数,这两个信息公用一个字节。AMPLITUDE表示非零系数的值。
需要注意的是,AC系数的之字形序列编码中有两个特殊符号——(0,0)和(15,0)。第一个特殊符号指的是块的结束(end-of-block,EOB),用来表明在之字形块中剩余的元素都是零。另一个特殊符号是指零游程长度(zero-run-length,ZRL),用来表明16个零游程。基线(baseline sequential)JPEG算法允许的零游程最大长度是16个。如果这里的零超过16个,那么这个游程分成几个长度为16的零游程。
经过RLE编码的AC系数可以映射成两个标志(RUNLENGTH,CATEGORY)和(AMPLITUDE),前者采用的是霍夫曼编码,而后者采用的是VLI编码(直接二进制编码)。同理经过DPCM编码的DC系数同样可以映射成两个标志(CATEGORY)和(AMPLITUDE),,前者采用霍夫曼编码,后者采用VLI编码。

JPEG解码

Segment的组织形式

JPEG 在文件中以 Segment 的形式组织,它具有以下特点: 
均以0xFF开始,后跟1byte的Marker和2byte的Segment length(包含表示Length本身所占用的2byte,不含”0xFF”+”Marker”所占用的2byte)
采用Motorola序(相对于Intel序),即保存时高位在前,低位在后
Data 部分中,0xFF后若为0x00,则跳过此字节不予处理

标记名 全称 标记字节 含义
SOI Start of Image 0xFFD8 图像开始
APPn Application 0xFFEn 应用程序标记
DQT Define Quantization Table 0xFFDB 定义量化表
SOF Start of Frame 0xFFC0 帧图像开始
DHT Define Huffman Table 0xFFC4 定义霍夫曼表
SOS Start of Scan 0xFFDA
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值