基于DCT的图像编解码设计_第1页
基于DCT的图像编解码设计_第2页
基于DCT的图像编解码设计_第3页
基于DCT的图像编解码设计_第4页
基于DCT的图像编解码设计_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1. 绪论MATLAB 是由美国mathworks 公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C 、Fortran ) 的编辑模式,代表了当今国际科学计算软件的先进水平。随着信息技术的发展,图像信息被广泛应用于多媒体通信和计算机系统中,但是图像数据的一个显著特点就是信息量大。具有庞大的数据量,如果不经过压缩,不仅超出了计算机

2、的存储和处理能力,而且在现有的通信信道的传输速率下,是无法完成大量多媒体信息实时传输的,因此,为了更有效的存储、处理和传输这些图像数据,必须对其进行压缩,因此有必要对图像压缩编码进行研究。由于组成图像的各像素之间,无论是在水平方向还是在垂直方向上都存在着一定的相关性,因此只要应用某种图像压缩编码方法提取或者减少这种相关性,就可以达到压缩数据的目的。数字图像包含的冗余信息一般有以下儿种: 空问元余、时间冗余、信息;脑冗余、统计冗余、结构冗余、视觉冗余以及知识冗余等。图像压缩算法就是要在保证图像一定的熏建质量的同时,尽可能多的去除这些元余信息.以达到对图像压缩的目的。随着科学技术的发展,图像压缩编

3、码技术越来越引起人们的关注。所谓的图像压缩编码技术就是对要处理的图像数据按一定的规则进行变换和组合,从而达到以尽可能少的数据流来表示尽可能多的数据信息。本设计基于DCT 的JPEG、PNG、BMP 等格式图像编解码设计算法进行研究,介绍了编码中DCT变换、量化、游程编码等模块的原理和数学推导以及各模块的功能分析。最后应用MATLAB 进行了实验仿真并分析结果得出结论。DCT 变换后具有绝对的去相关性,并且变换后的矩阵从左上角到右下角频率规律的渐高。有损压缩方法利用了人类视觉对图像中的某些频率成分不敏感的特性,允许压缩过程中损失一定的信息;虽然不能完全恢复原始数据, 但是所损失的部分对理解原始图

4、像的影响较小,却换来了大得多的压缩比。因此舍弃高频分量保留低频分量的做法,对于图像压缩具有绝对的优势。只要损失的数据不太影响人眼主观接收的效果,就可采用。DCT 变换后的压缩此本设计采用经典的游程编码实现。2. 设计任务2. 1 任务描述基于DCT 的图像编解码设计(1) 获取图像;( 2) 采用DCT 实现对图像编解码设计;(3) 分析编解码性能2.2 技术指标(1)可对JPEG、PNG、BMP 等格式图像进行基于DCT 的图像编解码。(2) 为了便于分析比较,定义一个量化系数quotiety,越大压缩率越高。(3) 压缩编码、量化系数统一写入存储文件compressed_data.mat,

5、实现可移植解压。( 4 ) 观察压缩后图片大小,简便起见,分析只关心compressed_data.mat 文件的大小。( 5 ) 实现DCT 变换和反变换以及JPEG 标准量化矩阵的量化、反量化。( 6 ) 根据DCT 量化后矩阵特点,本设计编码采用Z 字型扫描游程编码、解码。(7) DCT 压缩前后比较,以及不同量化系数比较。3. 设计原理3. 1 原理框图基于DCT 的图像编码包括三个阶段: DCT 变换、量化、编码。根据DCT量化后矩阵特点,本设计编码采用Z 字型扫描游程编码、解码。首先将输入图像颜色空间转换后分解为8 X 8 大小的数据块, 然后用正向二维DCT 把每个块转变成64

6、个DCT 系数值,其中1 个数值是直流(DC)系数,即8X8 空域图像子块的平均值,其余的63 个是交流(AC)系数,接下来对DCT 系数进行量化,最后将变换得到的量化的DCT 系数进行编码和传送, 这样就完成了图像的压缩过程。压缩图像数据游程编码量化DCT变换原始图像数据码表量化表图3- 1 编码过程基于DCT 的图像编码包括三个阶段: 译码、反量化、IDCT 变换。在解码过程中,形成压缩后的图像格式, 先对己编码的量子化的DCT 系数进行解码,然后求逆量化并把DCT 系数转化为8 X 8 样本像块(使用二维DCT 反变换),最后将操作完成后的块组合成一个单一的图像。这样,就完成了图像的解压

7、过程。反量化IDCT变换原始图像数据游程译码压缩图像数据量化表码表图3-2 解码过程3.2 程序流程图基于DCT 的图像编解码设计的MATLAB 实现的流程图如图3-3 所示。开始输入图片输入量化系数分成8*8像素块,DCT变换输入量化表,对变换结果量化对量化结果进行扫描编码保存编码结果显示压缩图像打开编码文件反量化反DCT变换显示恢复图像结束图3-3 程序流程图3. 3 离散余弦变换DCT 变换利用傅立叶变换的性质。采用图像边界裙翻将像变换为偶函数形式,然后对图像进行二维傅立叶变换,变换后仅包含余弦项,所以称之为离散余弦变换。DCT 编码属于正交变换编码方式,用于去除图像数据的空间冗余。变换

8、编码就是将图像光强矩阵(时域信号)变换到系数空间(频域信号)上进行处理的方法。在空间上具有强相关的信号,反映在频域上是在某些特定的区域内能量常常被集中在一起,或者是系数矩阵的分布具有某些规律。我们可以利用这些规律在频域上减少量化比特数,达到压缩的目的。图像经DCT 变换以后,DCT 系数之间的相关性就会变小。而且大部分能量集中在少数的系数上,因此,DCT 变换在图像压缩中非常有用,是有损图像压缩国际标准JPEG 的核心。从原理上讲可以对整l幅图像进行DCT 变换,但由于图像各部位上细节的丰富程度不同,这种整体处理的方式效果不好。为此,发送者首先将输入图像分解为8*8 或16*16 块,然后再对

9、每个图像块进行二维DCT 变换,接着再对DCT 系数进行量化、编码和传输;接收者通过对量化的DCT系数进行解码,并对每个图像块进行的二维DCT 反变换。最后将操作完成后所有的块拼接起来构成一幅单一的图像。对于一般的图像而言,大多数DCT系数值都接近于0,所以去掉这些系数不会对重建图像的质量产生较大影响。因此,利用DCT 进行图像压缩确实可以节约大量的存储空间。在实验中,先将输入的原始图像分为8*8 的小块,然后再对每个块进行二维DCT变换。二维离散余弦变换可以写成矩阵式(F(u,v)=(A)(f(x,y)(A)(f(x,y)=(A)(F(u,v)(A)式中, (f(x,y)是空间域数据阵列,

10、(F(u,v)是变换系数阵列, (A)是系数阵列,变换矩阵(A)'是(A) 的转置。设计中2 维DCT 变换函数代码如下:function Xpq=DCT2_function(xmn,M)T=dctmtx(M); %产生二维DCT 变换矩阵Xpq=T*xmn*T;设计中2 维IDCT 变换函数代码如下:function xmn_resume=IDCL_function(Xpq_resume,M)T=dctmtx(M); %生成变换矩阵xmn_resume=T*Xpq_resume*T; %用变化矩阵的乘法代替效率极低的for求和循环3.4 量化在DCT 处理中得到的64 个数据中,低频

11、分量包含了图像亮度等主要信息。在从空间域到频域的变换中,图像中的缓慢变化比快速变化更易引起人眼的注意, 所以在重建图像时,低频分量的重要性高于高频分量。因而在编码时可以忽略高频分量,即减小非" 0"系数的l幅度以及增加" 0" 值系数的数目,从而达到压缩的目的,这也是量化的根据和目的,也是图像质量下降的最主要原因。在JPEG 标准中,用具有64 个独立元素的量化表来规定DCT 域中相应的64个系数的量化精度,使得对某个系数的具体量化阶取决于人眼对该频率分量的视觉敏感程度。理论上, 对不同的空间分辨率、数据精度等情况,应该有不同的量化衰。不过, 一般采用下

12、图所示的量化表,可取得较好的视觉效果。量化化就是用DCT 变换后的系数除以量化表中相对应的量化阶后四舍五入取整。由于量化表中左上角的值较小,而右下角的值较大, 因而起到了保持低频分量、抑制高频分量的作用。为了便于分析比较,定义一个量化系数quotiety,量化系数越大,压缩率越高。量化系数quotiety在程序中是将JPEG标准量化矩阵*quotiety作为真正的量化矩阵。quotiety取值为大于1的任意实数。本设计中利用函数integral_function.m和deintegral_function实现量化和反量化。161110162440516112121419265860551413

13、1624405769561417222951878062182237566810910377243555648110411392496478871031211201017292959811210010399图3-4 灰皮值量化表量化会产生误差,上表是综合大量的图像测试的实验结果,对于大部分图像都有很好的结果匀。表中可以看出,高频部分对应的量化值大,目的就是将高频部分编程接近于0,以便以后处理。JPEG 可以在压缩比和图像质量问作取舍。方法就是改变量化系数。如果量化值放大,则有更多的系数值为0,提高了压缩比。3.5 Z形扫描游程编码DCT 系数量化后,构成一个稀疏矩阵,用Z CZigzag) 形

14、扫描将其变成一维数列,将有利于游程编码。Z 形扫描的顺序如图3-4。图3-5 Z 形扫描顺序图游程编码是一种统计编码,该编码属于无损压缩编码,是栅格数据压缩的重要编码方法。游程编码的基本原理是: 用一个符号值或串长代替具有相同值的连续符号,使符号长度少于原始数据的长度。只在各行或者各列数据的代码发生变化时,一次记录该代码及相同代码重复的个数,从而实现数据的压缩。游程编码运算简单,适用于机器存储容量小,数据需大量压缩,而又要避免复杂的编码和解码运算,增加处理和操作时间的情况。本设计中利用两个函数Run_length_coding_function.m 和Run_length_decoding_f

15、unction.m 分别实现Z 字形游程的编码解码。由于DCT 变换后右下角频率高,左上角频率分量低。而人眼对高频成分识别小,对低频成分识别大。量化后0主要集中在右下方,于是Z 字形扫描对于游程编码才有利。主要思路是将原矩阵的每个元素变化为用两个元素a,b表示, a 表示在这个元素之前0 的个数, b 表示这个元素是什么。当发现之后的多有元素都是0 的时候用0 , 0作为结束标志。这样, 只要矩阵中0 的个数超过一半,编码后数据量就比原来小。由于在8*8 中连续出现不为0 的相同元素的儿率极小, 因此运用游程编码的思想时只考虑出现的0 的个数。4. 运行结果及分析4. 1 不同量化系数图像编解

16、码效果比较量化系数quotiety: 程序中是将Jpeg 标准量化矩阵* quotiety 作为真正的量化矩阵。quotiety 取值为大于1 的任意实数。下面以jpg 格式图像为标准,取不同的量化系数quotiety 进行比较, 原始图像大小为84.8KB:图4-1 原始图像图4-2 quotiety=1 时恢复图像此时压缩编码文件为compressed_data 大小为21.5KB 。图4-3 quotiety=2 时恢复图像此时压缩编码文件为compressed_data 大小为14.6KB 。图4-4 quotiety=5 时恢复图像此时压缩编码文件为compressed_data 大

17、小为9.00KB 。图4-5 quotiety=10 时恢复图像此时压缩编码文件为compressed_data 大小为5.85KB 。结论: 量化系数quotiety 越大,压缩率越高,图像恢复的效果也越差。量化会产生误差,如果量化值放大,则有更多的灰度值变为0, 能够提高压缩比。4.2 不同文件类型图像编解码比较量化系数quotiety 都取5 时, 对不同文件类型的test图进行编解码图4-6 原始图像下面为jpg的test图编码的解码恢复图像:图4-7 jpg 格式的恢复图像下面为BMP 的test 图编码的解码恢复图像:图4-8 bmp 格式的恢复图像下面为PNG 的test 图编码

18、的解码恢复图像:图4-9PNG 格式的恢复图像观察三个恢复图像,在原始图像相同的情况下,三种文件格式下编解码解码效果无太大差异。当量化系数quotiety 取其他值时, 三种文件格式编码解码效果也相同。由此可知,该系统可以用于JPG、BMP. PNG 等文件的压缩编码和解码,且编码解码效果相同。5. 总结本次信息处理系统综合训练让我更熟悉地掌握MATLAB 的功能,灵活运用MATLAB,加强对MATLAB 软件图像处理的能力,掌握图像的离散余弦变换对图像进行压缩,以及游程编码等概念。在熟悉掌握MATLAB 程序和操作的同时培养了我的独立思考能力,钻研精神, 解决问题能力和动手能力。虽然在此之前

19、通过基础强化训练、运用国MATLAB 软件并完成简单图像操作,但知道的只是最基本的的应用,对于MATLAB 在图像处理上的应用,我完全没有理解。本次课程设计中通过查阅资料, 阅读程序并读写程序对MATLAB图像应用有了更深的了解。我同时也认识到了MATLAB 功能并不只是图形的绘制及波形的处理,有着很多方面的运用,如绘制函数,处理音频、图像数据,创建用户界面等功能,实为一个功能强大的软件。在课设过程中每每编写程序及操作时出现问题,我都会通过查阅资料,仔细检查解决问题, 经过一次次的修改完善,才出现最终的最优结果。在这个过程中,面对问题不放弃不急躁, 一次次改进, 静下心来慢慢解决,并细致完善细

20、节,从而能培养一种良好的学习心态和习惯。数据压缩技术的优劣主要是由压缩所能达到的压缩倍数、从压缩后的数据所能恢复的图像的质量和算法的复杂度、解码的速度等方面来衡量的。基于DCT 的混合编码技术对于图像的压缩倍数可以达到几十倍甚至上百倍, 而且重建的图像又具有较高的质量, 因此得到广泛的应用。用MATLAB 来实现离散余弦变换的图像压缩,具有方法简单、速度快、误差小的优点,免去了大量的矩阵计算, 大大提高了图像压缩的效率和精度。6 . 参考文献 1 张秋臣.浅谈MATLAB 分析及UG 的运动仿真期刊论文-锦绣, 2013. 04.2 祝本明,刘桂华.一种改进的游程编码算法期刊论文-西南科技大学

21、学报,2007. 03.3 http:/w啊. docin. com/p-39240958 1. html.4 http :/www. html.5 杨杰,黄朝兵.数字图像处理及MATLAB 实现. 北京: 电子工业出版社,201 1. 01;附录:Main Menu.mk=menu('请选择需要的功能',' 图 像 压 缩 , 图 像 解 压 );switch kcase 1DCT_compress;Main_Menu;case 2IDCT_decompress;Main_Menu;endDCT_compress.m%主要思想:%-à读取图像文件%-

22、4;分块DCT 变换%-àJPEG锦标准量化表量化%-àZ字形游程编码%-à存储压缩后的文件clear all; clc;global quotiety;FileName,PathName,FilterIndex=uigetfile('*.bmp;*.jpg;*.png','请选择要压缩的源图像');string=sprintf('%s%s',PathName,FileName);quotiety=inputdlg('系数越大压缩率越高','输入您需要的压缩系数: ',1,'1

23、');h=waitbar(0,'正在压缩, 请稍候');quotiety=str2num(cell2mat(quotiety);I=imread(string);I=rgb2gray(I);xmn=double(I);figure;imshow(I);title('原始图像');M,N=size(xmn);waitbar(1/4,h);Xpq=blkproc(xmn,8 8,'DCT2_function',8); %每一小块DCT 变换waitbar(2/4,h);Xpq_estimate=blkproc(Xpq,8 8,'int

24、egral_function'); %量化表量化waitbar(3/4,h);waitbar(3/4,h);for index1=1:1:M/8 forindex2=1:1:N/8 %对每一小块游程编码,结果存在cell数组Xpq_coded里 Xpq_codedindex1,index2=int8(Run_length_coding_function(Xpq_estimate(8*(index1-1)+1:8*index1,8*(index2-1)+1:8*index2); endendwaitbar(4/4,h);close(h);uisave('Xpq_coded'

25、;, 'quotiety','compressed_data'); %存储编码后的信息、量化系数figure;imshow(Xpq_estimate);title('压缩图像');DCT2_function.m function Xpq=DCT2_function(xmn,M) T=dctmtx(M);    %产生二维DCT变换矩阵 Xpq=T*xmn*T'integral_function.m function Xpq_estimate

26、=integral_function(Xpq) integral_table=16,11,10,16,24,40,51,61;12,12,14,19,26,58,60,55;14,13,16,24,40,57,69,56;14,17,22,29,51,87,80,62; 18,22,37,56,68,109,103,77;24,35,55,64,81,104,113,92;49,64,78,87,103,121,120,101;72,92,95,98,112,100,103,99; %量化矩阵global quotiety;Xpq_estimate=int8(Xp

27、q ./(integral_table*quotiety); %此处的量化系数表示除以的Jpeg 标准量化矩阵的倍数Run_length_coding_fuoctioo.m%由于DCT变换后右下角频率高,左上角频率分量低。而人眼对高频成分识别小,对低频成分识别大 %量化后0主要集中在右下方,于是Z字形扫描对于游程编码才有利 %主要思想:原矩阵的每个元素变化为用两个元素【a,b】表示,a表示在这个元素之前0的个数,% b表示这个元素是什么。当发现之后的多有元素都是0的时候用【0,0】作为结束标志。 function Xpq_coded=Run_l

28、ength_coding_function(Xpq_estimate) table=1,1;1,2;2,1;3,1;2,2;1,3;1,4;2,3;3,2;4,1;5,1;4,2;3,3;2,4;1,5;1,6;2,5;3,4;4,3;5,2;6,1;7,1;6,2;5,3;4,4;3,5;2,6;1,7;1,8;2,7;3,6;4,5;5,4;6,3;7,2;8,1;8,2;7,3;6,4;5,5;4,6;3,7;2,8;3,8;4,7;5,6;6,5;7,4;8,3;8,4;7,5;6,6;5,7;4,8;5,8;6,7;     

29、; 7,6;8,5;8,6;7,7;6,8;7,8;8,7;8,8; %64*2的矩阵,表明Z字形压缩的行走路径Xpq_coded=; %存储编码后的结果 count=0; compress_index=1; for index=1:1:64 %扫描 if Xpq_estimate(table(index,1),table(index,2)=0  %如果遇到了0,那么下一个数字到来之前的0的个数就加1 count=count+1; else  %如果遇到的不是0,那么Xpq_

30、coded=(,)的第一个元素存储之前0的个数,第二个元素存储此时遇到的这个元素Xpq_coded(compress_index,1)=count; Xpq_coded(compress_index,2)=Xpq_estimate(table(index,1),table(index,2);         count=0;  %过去这个元素之后0的个数就要重新计         com

31、press_index=compress_index+1;     end     if count=0   Xpq_coded(compress_index,1)=0; Xpq_coded(compress_index,2)=0;     end endIDCT decompress.m%主要思想:%跟压缩过称恰好相反%一读取压缩文件%一Z字形游程解码%一JPEG标准量化表反量化%一分

32、块DCT 变换%一存储解压后的文件c1ear all;c1c;global quotiety;uiload;h=waitbar(O,'正在解压, 请稍候');Xpq_decoded=Xpq_coded;c1ear Xpq_coded;M,N=size(Xpq_decoded); waitbar(1/4,h); %游程解码得到Xpq_deestimatefor index1=1:1:M    for index2=1:1:N      

33、60;  Xpq_deestimate(8*(index1-1)+1:8*index1,8*(index2-1)+1:8*index2)=Run_length_decoding_function(Xpq_decoded index 1 ,index2 );endendwaitbar(2/4,h);%反量化得到幅频值Xpq_resume=blkproc(Xpq_deestimate,8 8,'deintegral_function'); waitbar(3/4,h); %DCT逆变换得到xmn xmn_resume=bl

34、kproc(Xpq_resume,8 8,'IDCT2_function',8);xmn_resume=uint8(xmn_resume); waitbar(4/4,h); close(h); figure;imshow(xmn_resume); title('恢复的图像'); IDCT2 function.mfunction xmn_resume=IDCT2_function(Xpq_resume,M)T=dctmtx(M); %生成变换矩阵xmn_resume=T'*Xpq_res

35、ume*T; % 用变化矩阵的乘法代替效率极低的for求和循环deintegral_function.mfunction Xpq_resume=deintegral_function(Xpq_deestimate)integral_table=16, 11,10,16,24,40,51,61;12,12,14,19,26,58,60,55;14,13,16,24,40,57,69,56;14,17,22,29,51,87,80,62;18,22,37,56,68,109,103,77;24,35,55,64,81,104,113,92;49,64,78,87,103,121,120,101 ;72,92,95,98,112,100,103,99;global quotiety;Xpq_resume=Xpq_deestimate.*integral_table*quotiety; %反量化恢复的过程要考虑到量化系数quotiety的影响Run_length_decoding_function.m%与Run_length_coding如nction 完全相逆的过程解码, 此处不再赘述function Xpq_deestimate=Run_length_d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论