您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 基于DCT的JPEG图像编解码
基于DCT的JPEG图像编解码Name:id:Name:id:1课题背景2JPEG静止图像解压缩的基本原理2.1DCT变换2.2量化2.3熵编码3matlab仿真实现1课题背景随着信息技术的发展,图像信息被广泛应用于多媒体通信和计算机系统中,但是图像数据的一个显著特点就是信息量大。具有庞大的数据量,如果不经过压缩,不仅超出了计算机的存储和处理能力,而且在现有的通信信道的传输速率下,是无法完成大量多媒体信息实时传输的,因此,为了更有效的存储、处理和传输这些图像数据,必须对其进行压缩,因此有必要对图像压缩编码进行研究。由于组成图像的各像素之间,无论是在水平方向还是在垂直方向上都存在着一定的相关性,因此只要应用某种图像压缩编码方法减少这种相关性,就可以达到压缩数据的目的。2JPEG静止图像解压缩的基本原理JPEG提出的JPEG标准是为连续色调图像的压缩提供的公共标准。连续色调图像并不局限于单色调(黑白)图像,该标准可适用于各种多媒体存储和通信应用所使用的灰度图像、摄影图像及静止视频压缩文件。JPEG标准还提出:①必须将图像质量控制在可视保真度高的范围内,同时编码器可被参数化,允许设置压缩或质量水平。②压缩标准可以应用于任何一类连续色调数字图像,并不应受到维数、颜色、画面尺寸、内容和色调的限制。③压缩标准必须从完全无损到有损范围内可选,以适应不同的存储CPU和显示要求。图像压缩编码方法从压缩编码算法原理上可以分为无损压缩编码、有损压缩编码、混合编码方法。而文中介绍的JPEG标准就是一种混合编码方法,既有损的压缩编码又有有损的压缩编码。有损压缩方法是以DCT变换为基础的压缩方法,其压缩率比较高,是JPEG标准的基础。无损压缩方法又称预测压缩方法,是以二维DPCM为基础的压缩方式,解码后能完全精确地恢复原图像采样值,其压缩比低于有损压缩方法。从图1中注意到图中的编码器负责降低输入图像的编码、像素间和心理视觉冗余。在编码处理的第一阶段,离散余弦变换器将输入图像变换成一种(通常不可见的)格式,以便减少像素间的冗余。在第二阶段,量化器根据预定义的保真度准则来减少映射变换器输出的精确性,以便试图去除心理视觉冗余数据。这种操作是不可逆的,当进行无损压缩时,则必须将其忽略。在第三个即最后一个处理阶段,熵编码器根据所用的码字对量化器输出和离散余弦变换输出创建码字(减少编码冗余)。F(u,v)[F(u,v)]Q输入图像压缩后图像f(x,y)8*8像素块图1(a)JPEG编码框图DCT变换量化器熵编码器量化表Q(u,v)Huffman表F’(u,v)f’(x,y)压缩后图像解压缩后图像f(x,y)8*8像素块图1(b)JPEG解码框图图1基于DCT的JPEG编/解码原理框图熵编码器量化器DCT反变换量化表Q(u,v)Huffman表2.1DCT变换DCT变换利用了傅里叶变换的对称性,变换后的结果只包含余弦项。虽然变换的种类很多,比如DCT、DFT(DiscreteFourierTransform,离散傅里叶变换)、KLT(KarhunenLoeveTransform,卡洛变换)、WHT(Walsh-Hadamard,沃尔什-哈达玛变换)等,但从变换后能量集中从优到劣的排列顺序KLT、DCT、DFT、WHT和运算量从小到大的排列顺序WHT、DCT、DFT、KLT来看,DCT的压缩能力与KLT最佳变换相近,计算量适中,性能优于DFT、WHT等其他变换。同时,相对于KLT而言,DCT具有固定的基和物理含义,更易于实现,因此DCT变换成为变换编码的首选。输入端把原始图像分成8*8像素块(Block)之后进行DCT变换,目的是去除图像数据的空间冗余,并实现能量集中。DCT变荷飏客栈的SWOT分析荷飏客栈的SWOT分析率分量的大小。在变换后系数矩阵的右下角,高频系数几乎趋近于0。图2描绘了DCT变换块系数分布情况。DCDC垂直方向低频水对平角中频方线向方向高频图2DCT系数频带和方向信息2.2量化JPEG是一种利用了量化的图像有损压缩。JPEG的编码过程对原始的图像数据作离散余弦变换,然后对离散结果进行量化并作熵编码。JPEG算法的第二步是量化处理,这里DCT输出利用同维数的整数矩阵进行点状处理,基本JPEG的“损耗”特性就是由量化过程产生的。通过剔除图像中的不必要的信息,量化完成JPEG主要压缩部分。因为图像在特定位置通常会由较低空间频率改变,并且人类倾向于忽略高空间频率改变,所以量化可以过滤掉很多这类因素。在量化过程中,系数量化过程可通过选择合适的量化因子完成,量化值越高,系数就越接近零。量化损耗是由于它的值总是要取整而造成的,这也是量化因子越大,丢失的信息就越多的原因过量化位数的选择加以控制。JPEG的色度量化表与亮度量化表不尽相同(见表1和表2)。从量化表中可以看出各变换系数的量化间隔是不一样的。对于低频分量,量化间隔小,量化误差也会较小,对于高频分量,因为它只影响图像的细节,从整体上看它没有低频分量那么重要,因此量化间隔较大。量化处理是造成压缩编码信息失真的关键因素之一,在JPEG解码,需要进行逆量化,使用到的矩阵与编码时完全相同。表1默认的JPEG标准化数组1611101624405161121214192658605514131624405769561417222951878062182237566810910377243555648110411392496478871031211201017292959811210010399表2JPEG的zigzag系数排列顺序01561415272824713162629423812172530414391118243140445310192332394552542022333846515560213437475056596135364849575862632.3熵编码DCT最后处理的步骤是熵编码,目的是在统计特征基础上通过对量化DCT系数进一步压缩,得到额外的无损压缩。根据信息论的原理,可以找到最佳数据压缩编码的方法,数据压缩的理论极限是信息熵。如果在编码过程中不损失信息量,即要求保持信息熵,则这种编码叫做熵编码。在编码之前,需要把二维变换的变换系数矩阵转换为一维序列。这样做的目的是为后续的熵编码做准备,即之字形扫描。熵编码将之字形量化系数序列转换成中间符号序列,然后将这些符号转换成没有外部确定边界的数据流,即最终编码后的图像数据流文件。JPEG的基本系统的熵编码采纳了平均压缩比最高的编码哈夫曼编码,其理论依据是变字长编码理论。在变字长编码中,编码器的编码输出码字是长度不等的码字,按照编码输入信息符号出现的统计概率,给输出码字分配不同的字长,出现概率极高的分配较短的码字,反之出现概率较低的则分配较长的码字,从而得到较好的压缩效果。3Matlab仿真实现Matlab是一种将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成于一体的科学计算软件。对于DCT变换的矩阵实现,它具有运算快速、语言简单、实现方便的优点。DCT变换在Matlab中,主要有两种实现方法:一是基于FFT的快速算法,由于这种算法是直接利用DCT变换公式来实现的,又被称为直接实现算法;二是DCT变换矩阵算法,这种方法是根据分块矩阵的思路实现,又被称为间接实现算法。根据DCT变换在Matlab中的两种实现方法,将一幅图像分别进行压缩处理,实现过程具体如下。(1)基于FFT的快速算法(直接实现算法)。该算法的程序代码如下:IMG=imread(‘handshake.tif’);%读入图像I=rgb2gray(IMG);%转换成灰度图像J=dct2(I);%对I进行二维DCTcolormap(jet(256));J(abs(J)<10)=0;%将DCT变换值的绝对值小于10的元素值设为0K=idct2(J);%DCT逆变换figure;subplot(1,2,1);imshow(I,[0,255]);title(‘原始图像’);%显示原始图像subplot(1,2,2);imshow(K,[0,255]);title('IDCT·反变换图像');%显示IDCT反变换后的图像在Matlab中运行程序后,图3给出了原始图像和重构后图像的对比图。从IDCT反变换得到的图像可以看出,原始图像和重构后的图像在视觉效果上几乎一模一样,用基于FFT的快速算法能达到令人满意的效果,在图像做DCT变换后,图像数据压缩到原始数据的15.11%左右,压缩比高。原始图像IDCT反变换图像图3直接实现算法—原始图像和重构后图像对比(2)DCT变换矩阵算法(间接实现算法)。该算法的程序代码如下:IMG=imread(‘handshake.tif’);%读入图像N=8;%子块的大小,可为4,8,16I=rgb2gray(IMG);%转换成灰度图像I=im2double(I);%转换为双精度型[C,R]=size(I);%C:列数,R:行数C=floor(C/N)*N;%使列数为N的倍数R=floor(R/N)*N;%使行数为N的倍数IZ=zeros(C,R);IZ=I(1:C,1:R);%包含X个N*N的大小T=dctmtx(N);%产生二维DCT变换矩阵%计算二维DCT,矩阵T及其转置是DCT函数P1*x*P2的参数%二值掩膜,用来压缩DCT系数,只留下DCT系数中左上角的10个系数B=blkproc(IZ,[N,N],'P1*x*P2',T,T');%x是待处理的N*N矩阵,P1对应T,P2对应T',T'是T的转置矩阵Mask=[1111000011100000110000001000000000000000000000000000000000000000;%此处N=8B2=blkproc(B,[NN],‘P1*x’,mask);%只保留DCT变换的10个系数I2=blkproc(B2,[NN],'P1*x*P2',T',T);%重构图像subplot(1,2,1);imshow(IZ);title(‘原始图像’);%显示原始图像subplot(1,2,2);imshow(I2);title('压缩重构后的图像');%显示压缩重构后的图像运行程序后,DCT变换矩阵法原始图像和重构后图像的对比图如图4所示。在该程序中,分块的大小为8×8,每个分块只保留DCT系数中左上角的10个系数,其余系数全部为0,此时图像压缩比为15.63%。从图4可以发现,在保留10个DCT系数时,压缩重构后的图像失真不明显,图片质量好。在视觉效果可以接受的前提下,若想进一步提高图像压缩效率,可以通过修改程序中mask矩阵的DCT系数个数,比如保留6个DCT系数时压缩比可高达9.38%。当然,也可以通过增加mask矩阵中DCT系数个数来得到更好的图片质量,具体保留个数的决定。原始图像压缩重构后图像图4间接实现算法—原始图像和重构后图像对比为了更为直观地显示DCT压缩的效果,图5给出了图像压缩后的数据B2的图像。此时数据量只有原始数据的15%左右,在频率域显示的图像只有一个模糊的轮廓,说明图像的绝大部分能量都包含在这少量数据中,才能使重构后的图像失真较少。图6是原始图像和压缩后图像相减得到的图像,即显示“IZ-I2”的数据图像,这部分数据表示的是抛弃掉的85%左右的冗余信息。图5压缩后图像图6原始图像和压缩后图像相减得到的图像基于FFT的快速算法和DCT变换矩阵算法,都能实现对图像的有效压缩,图像压缩重构后,图像质量都比较高。不过,一般采用的是DCT变换矩阵算法。这种方法具有实现效果更灵活的特点,可以通过修改分块矩阵的大小来改变压缩比和运算速度,也可以通过修改mask二值掩膜矩阵中DCT系数个数来改善图像质量。DCT算法的优越性,使其在软件上易于实现的同时,也具备了易于在硬件上实现的优点,特别是在比特率高的传输条件下取得比较好的压缩效果,从而被广泛应用于图像压缩领域。谢谢
本文标题:基于DCT的JPEG图像编解码
链接地址:https://www.777doc.com/doc-5584367 .html