快速分块JPEG图片的方法

2014-09-04 09:11董友球谷新征刘先材
九江学院学报(自然科学版) 2014年3期
关键词:分块解码分量

董友球 谷新征 刘先材

(广东威创视讯科技股份有限公司 广东广州 510663)

快速分块JPEG图片的方法

董友球 谷新征 刘先材

(广东威创视讯科技股份有限公司 广东广州 510663)

本文提出一种分块JPEG图片的方法,即先加载需被分块的JPEG图片,然后对图片的压缩数据进行熵解码,从而得到每个MCU的数据内容,再根据分块的要求为每个小块选择对应的MCU数据组成一个数据集合,并对集合里的数据做必要的修正即可得到每个小块图片的MCU数据,最后把每个小块的MCU数据和熵编码表、量化表等必要信息一起按JPEG文件格式写入文件从而得到小块的JPEG图片。此方法对在分块过程中只进行了熵解码,没有做完整的解码和重新编码过程,提高了分块的效率,并且不会引起图像质量的下降。

JPEG,图像处理,图片分块

JPEG图片是一种常见的图片格式,在现实中有着广泛的应用,相应地也有对其进行处理的需求,例如在分布式的大屏拼接系统中需要对超高分辨率的JPEG图片进行分块然后交给各个显示节点进行解码显示。

现实应用中多数的分块处理都是针对类似BMP这种图像像素数据按物理位置排列的图像格式,分块时可直接根据区域信息获取图像像素数据值,文献[1]和[2]都是处理这种情况的。JPEG图片对原始图像数据进行了较高比例的压缩,但是压缩时是打乱了各像素数据的排列顺序的,所以无法像对类似BMP这种图片格式直接进行分块处理,目前常用的是文献[3]中所采用的方法,先将JPEG图片解码,再分块,最后再编码,从而得到分块后的小块JPEG图片。但是,由于这种方法进行了完整的JPEG图片解码和重新编码的过程,效率非常低下,并且由于JPEG的压缩过程是有损的,这样的解码再编码处理会导致图像质量的下降。

针对上述问题,本文提出一种分块JPEG图片的处理方法,既大幅提高了分块的效率,又不会造成图像质量的损失。

1 JPEG技术介绍

JPEG专家组开发了两套算法,一套是基于DCT变换的有损压缩算法,另一套是基于预测技术的无损压缩算法。其中,基于DCT变换的有损压缩算法被广泛使用,本文所讨论的分块JPEG方法也是针对基于此算法的JPEG图片的。

1.1 JPEG压缩方法

原始的图像数据一般是采用RGB、YUV等颜色模型来描述的,这种描述方式中每个点都可以找到一组对应的颜色分量值。但这虽然简单,却由于数据量庞大而不易于存储和传输,所以需要对其进行压缩,压缩的具体步骤如下:

进行颜色空间转换。由于JPEG使用的是YUV颜色模型,所以需要对于其它类似采用RGB颜色模型的数据需进行转换,转换过程其实是一个矩阵变换的过程。

(1)确定最小处理单元(即MCU)。每个MCU包含(Hmax*8)x(Vmax*8)个点的图像信息,其中Hmax和Vmax分别是横向和纵向的最大采样系数。例如Hmax和Vmax都为1的话,那么一个MCU包含YDU(亮度分量数据单元)、CrDU(Cr分量数据单元)、CbDu(Cb分量数据单元)各一个,每个DU包含8x8图像块的信息。

(2)对每个MCU的每个分量DU数据进行FDCT变换。FDCT变换实现图像数据从空间域到频率域的变换。

(3)对FDCT变换的结果进行重排列。这是为了后续的量化和压缩而服务的。

(4)量化处理。FDCT变换后主要能量集中在左上角,其中最左的一个值叫做直流分量,其它63个为交流分量,交流分量离左上角越远的地方值越小,经过量化后会出现大量的0。

(5)对直流和交流分量的数据进行编码。其中直流分量进行差分编码和熵编码,对交流分量进行游程编码(RLE)和熵编码。

上述步骤可用图1[4]来描述。

图1 JPEG压缩过程图

1.2 JPEG解压缩方法

JPEG解压缩过程刚好与压缩过程相反,在此不做详述,只用图2[4]进行描述。

图2 JPEG解压缩过程图

2 快速分块JPEG的方法

一般的JPEG分块方法先对JPEG图像进行解压缩,得到RGB/YUV数据,然后对RGB/YUV数据进行分块,再对每个小块的数据进行JPEG压缩[3]。根据JPEG算法的原理,这个过程需要进行FDCT和IDCT,而这两个过程是比较耗时的,另外由于经过重新编码的处理,导致了图像质量的下降。

为了提高分块的效率,并且避免处理过程中产生图像质量的下降,本文提出一种快速分块JPEG图片的方法,如图3所示,具体包含以下步骤:

(1)加载被分块的JPEG图片,读取图像的压缩数据和解码必需的图片信息。所述解码必需的图片信息具体包括熵编码表、量化表、采样系数以及图片的宽、高等信息。

(2)对图片压缩数据进行熵解码,得出每个MCU的组成数据。所述MCU的组成数据包括各颜色分量的交流分量熵解码前的全部编码数据以及直流分量值。

(3)根据分块的要求为每个小块选择对应的MCU数据集合。虽然JPEG中像素点的数据已经没有了物理位置排列规律,但MCU的位置还是按物理位置排列的。举例来说,如图4所示的JPEG图片由8个MCU组成,每个MCU包含了对应位置图像区域内像素的数据,假设要对它进行一行两列的分块处理(如图中虚线所示),那么左边的小块图片将包含MCU1、MCU2、MCU5、MCU6的数据,而右边的小块图片将包含MCU3、MCU4、MCU7、MCU8的数据。

图3 JPEG分块处理流程图

(4)对(3)中得到的MCU数据集合中的直流分量数据进行修正处理。从JPEG算法的原理我们知道,直流分量采用的是差分编码,以图4中的MCU5为例,它在原始图片中的直流分量值实际保存的是MCU5与MCU4之间的差值,而在分块后的小图片中,则应该修改为MCU5与MCU2之间的差值。而MCU2由于参考关系在分块前后没有发生变化,所以它的数据不需要修正。是否要修正需要判断分块前后MCU的参考关系有没有发生变化,有则需要修正。

图4 JPEG图片MCU结构示意图

(5)将每个小块对应的MCU数据集合的数据和加载原始图片时得到熵编码表、量化表等信息按照JPEG图片格式写入到文件[5],从而得到分块后的图片文件(见图5)。其中,由于分块后图像的宽和高发生了变化,因此小块图片的宽高值应做相应的更新(JPEG图片的宽高信息保存在文件中的SOF0段)。

图5 图片分块示意图

上述5个步骤描述了本文所述的快速分块JPEG图片的基本过程。但此方法有一个局限性,就是要求选择的分块位置刚好就是在MCU的分界处,但实际情况下有可能出现如图5所示的分块位置不在分界线上的情况(其中虚线为分块边界线)。这时对于左边的小图像块还好处理,只需要仍按上面步骤四的方法来处理,只是在步骤(5)的时候修改分块后的图片的宽度时按照虚线来计算即可。而对于右边的那一小块,则需在处理时将图像区域扩展到MCU2和MCU6,并且在分块后的JPEG图片文件中将实际有效区域信息存入到一个未使用的APP段,后续对图片进行显示或其它处理时再取出实际有效区域信息做相应的处理。

3 实验结果

为了验证本文所述方法的有效性,编写了两个程序,一个以本文所述方法对JPEG图片进行分块,而另一个利用IJG的libjpeg库实现了文献[3]所述方法,将JPEG图片先解压成YUV格式后再分块压缩成小像素的JPEG图片。被分块的图片是一个分辨率为8192x2304的超高分图片。实验的具体结果如表1所示。

表1 实验结果对比

4 结论

从实验结果可以看出,本文所述方法在不损失图像质量的同时,大大提高了分块的效率,约只有对比方法所耗时间的16%左右,非常适合需要快速处理超高分辨率图片的场合,例如分布式的大屏拼接系统。

[1]陈国军,叶飞跃.大幅图像的分块细化加速算法[J].计算机工程及应用,2001,37(23):101.

[2]乔哲,姚行中,徐俊. 基于VC++的BMP图像分块[J]. 中国水运(理论版),2008,6(1):214

[3]朱亚奇,刘维亭.基于Windows CE下大像素图像分块显示算法的研究[J].科学技术与工程,2008,8(15):4170.

[4]Gregory K Wallace. The JPEG still picture compression standard [J]. Comman ACM,1991,66(3):11.

[5]邱磊. JPEG算法研究及实现[J].计算机时代,2009,27(9):52

(责任编辑李平)

2014-5-7

董友球, wyudyq@163.com。

TN 919.81

A

1674-9545(2014)03-0049-(04)

猜你喜欢
分块解码分量
《解码万吨站》
帽子的分量
分块矩阵在线性代数中的应用
解码eUCP2.0
NAD C368解码/放大器一体机
Quad(国都)Vena解码/放大器一体机
论《哈姆雷特》中良心的分量
分量
反三角分块矩阵Drazin逆新的表示
基于自适应中值滤波的分块压缩感知人脸识别