基于S3C6410的JPEG图像编码与解码的研究与实现

2019-01-08 08:37蓝丽金江勇捷
数字技术与应用 2019年10期

蓝丽金 江勇捷

摘要:为了提高图片的传输速度和质量,需对图片信息先压缩后传输,从而数据的储存减少,传输速度提高,传输时间缩短,传输质量大大提高。本文采用ARM作为主控芯片充分利用了它的硬件资源和软件资源,实现图像对图像的编码和解码过程。本研究根据要求设计了一套实验样机,最后的测试结果表明,该方案设计基本合理,具有一定的可行性。实验调试效果不错,基本能满足设计要求,且经过处理过后的图像能清晰的显示。

关键词:JPEG;图像压缩;图像编码;图像解码

中图分类号:TP302 文献标识码:A 文章编号:1007-9416(2019)10-0105-02

0 引言

随着多媒体技术的高速发展,静态图像的应用越来越广泛,图像的存储和图像的传输是静态图像应用的两个重要方面;但根据现实应用情况来看,静态图像的存储过程中占用了我们越来越多的存储空间[1]。因此,对静态图像的压缩成为了一个研究热点。

由于图像文件传输占用大量带宽,同时图像文件存储也占用了大量内存空间,故近年来,研究人員对图像压缩技术越来越重视,而大部分信息行业依赖于图像压缩技术来解决图像传输占用大量带宽和浪费大量内存空间的问题,这就进一步推动了图像压缩技术的发展。有了图像压缩技术,人们不再因移动存储设容量不足而无法拷贝图像等资料的困扰。此外,很多新的图像处理技术也随着数字化媒体技术的发展而逐步优化,如图像的建档和远程诊断以及通信系统等应用场合。本文采用JPEG标准对图像进行编、解码的研究。图像的解码是编码的逆过程,由于本文是对已压缩的JPEG图像进行再次压缩(有损压缩),因此,只需要先熵解码,反量化,然后进行新的表量化,删除了冗余图像数据,并再编码,省去了DCT和IDCT、颜色转换,使得让转换速度大大提高。

1 系统硬件组成

Tiny6410是一款以ARM11作为主处理器的核心控制器,该CPU设计是基于ARM1176JZF-S核,大量的多媒体处理单元集成在内部,支持多种格式的视频文件硬件编码和解码,可在LCD和TV端显示;它同时带有3D图形加速器,以实现加速渲染功能,它支持2D图形图像的平滑缩放、翻转等动作。它集成了128M DDR RAM,256M/1GB SLC Nand Flash存储器。本文的图片获取采用天敏mini眼摄像头,ARM采用Linux系统,图形界面使用QT。

2 图像解码

2.1 读入图像的标志信息

根据JPEG专家组定义的JFIF交换格式,JPEG文件的组成有8个部分[2]:图像开始SOI标记、APP0标记、APPn标记(其中n=1~15任选)、一个或者多个量化表DQT、帧图像开始SOF0、一个或者多个霍夫曼表DHT、扫描开始SOS、压缩图像数据、图像结束EOI。通过这些标志,把要解码的文件的相关信息都读出来,做好解码工作的准备。

不同的的变量结构体首先被定义出来,该变量结构体对应各个标记,用来存储标记内表示的信息。其中有以下几项信息是比较重要的,即图像长宽、水平/垂直采样因子、哈夫曼表和多个量化表等多项信息。(1)根据标志位读入图像信息;(2)确定字的高低位;(3)扫描并读出出哈夫曼表;(4)通过哈夫曼表建立哈夫曼树。

2.2 熵解码

由于8*8数据块是JPEG图片格式的一般结构,图像数据是存储信息的单位是位,同时,内部数据实际是在编码过程中实现时域到频域的变换,从而得到结果。所以,1个直流分量与63个交流分量构成了每个单元颜色分量。而查找哈夫曼树的思路其实就是解码的步骤。

各个颜色分量所相应的直流和交流分量使用的哈夫曼树编号是通过先获取标记段SOS中的各个颜色分量的信息而获取的,如表1所示,为各个颜色分量对应的编号。

以下为解析一个颜色分量单元的步骤:

(1)从需要的颜色分量单元数据流的开头开始一位一位的读取,然后再查直流哈夫曼树,直到该分量直流哈夫曼树的某个码字与读入的编码进行比较而一致时获得该码字对应的权值。通过8个位的位数来表示权值直流分量数值,这也是作为接下来所读入的解码位数。

(2)再继续的一位位的读入数据,直到该分量交流哈夫曼树的某个码字(叶子结点)与读入的编码一致,然后用交流哈夫曼树取得该码字的权值。权值的低4位表示该交流分量数值的二进制位数,高4位表示当前数值前面有多少个连续的零,因此,第低4位就是接下来要读入的位数。

(3)连续不断重复以上第2个步骤,直到满足两个交流分量数据结束条件其中一个即可,两个结束条件为:

第一,当读入码字的权值为零时表示接下来的交流分量全部为零;

第二,已经读入63个交流分量。

2.3 直流系数的差分解码

把所有单元的颜色分量分别按Y分量、Cr分量、Cb分量进行分类。每种分量内,两个相邻的颜色分量的直流变量的编码方式为差分方式,意味着,熵解码出来的直流变量数值只是当前颜色分量单元的相邻两个单元的差值。所以当前得到的变量值需要加上他们的差分变量[3]进行校正,即如公式(1)所示。

2.4 反量化

从获取的JPEG的文件信息中,在标记段SOF中的信息字段可以查出亮度和色度各自使用不同的量化表。

图像的所有图片数据都要进行反量化,反量化的过程相对比较简单,只需要对8*8的颜色分量单元里的64个值一一对应的乘以所对应的量化表内相同位置的值即可。

3 图像编码

3.1 量化

由于人眼视觉特性,JPEG针对此特性设计了相应的量化表。量化对于前面得到的64个空间频率振幅值按比例缩小,并取四舍五入的整数值的处理过程称为量化。JPEG标准中推荐的量化表[5]如表2所示。共有64个元素,按照从上到下,从左到右的顺序与FDCT变换后的幅值对应,每一元素记为Q(u,v),u和v对应行和列,量化公式[4]为式(2):

本设计采用有损压缩,亮度量化表采用Q=100,色彩量化表Q=50。这样,图像看起来就跟灰度图像差不多,把色度都过滤掉。大大压缩了图片。

3.2 熵编码

熵编码也可以说是哈夫曼编码,其编码步骤是重复使用的数据采取较短的代码代替,较长的代码代替较少使用的数据,每个数据的代码各不相同。由于这些代码都是二进制码,同时代码的长度是可变的,所以就实现了代码压缩的目的[5]。

以下为具体的哈夫曼编码步骤:

第一步,每个符号出现频率首先被统计出来;

第二步,按从小到大的顺序排列上述得到的从左到右的频率;

第三步, 每一次选出最小的两个值就是二叉树的两个叶子节点,这就是它们的根节点,该节点不再参与比较,而新的根节点参与比较。

(4)重复(3),直到最后得到和为1的根节点。

产生哈夫曼编码需要对原始数据扫描两遍。第一遍扫描要精确地统计出原始数据中每个值出现的频率,第二遍是建立哈夫曼树并进行编码。需要建立二叉树并遍历二叉树生成编码,因此数据压缩和还原速度都较慢,但簡单有效,因而得到广泛应用。

4 实验测试及结果分析

图1中左边为经过解码之后再编码的的图像,右边为摄像头直接获取的图片。可以从图片看出,经过处理后的图像色彩已经失真的,是由于本设计采用的是有损压缩,而且为了达到更大的压缩比,把原始图像里面的色度给剔除。

图2为处理前后的图片的大小,abc.jpg为处理后的图像,bac.jpg为原始图像。可以看出,把原始图像从19.3K压缩到4.7K左右。剔除色彩后,可以再次压缩4倍。这使得网络传输的速度大大提高了。

参考文献

[1] 陈雪松,王海巍.JPEG压缩编码算法应用及发展前景研究[J].计算机应用与数字工程,2009,1:57-90.

[2] 许刚,廖斌,李承毅.JPEG图象文件格式分析[J].计算机系统应用,1998(10):37-39.

[3] 刘方敏,等.JPEG2000图像压缩过程厦原理概述[J].计算机辅助设计与图形学报,2002:3-6.

[4] 吴乐南.数据压缩[M].电子工业出版社,2005.

[5] 严剑.Huffman算法及其在数据压缩中的应用[J].计算机与现代化,1996(48):15-20.