基于DCT变换的图像压缩编码.docx

上传人:b****6 文档编号:6286999 上传时间:2023-01-05 格式:DOCX 页数:17 大小:385.19KB
下载 相关 举报
基于DCT变换的图像压缩编码.docx_第1页
第1页 / 共17页
基于DCT变换的图像压缩编码.docx_第2页
第2页 / 共17页
基于DCT变换的图像压缩编码.docx_第3页
第3页 / 共17页
基于DCT变换的图像压缩编码.docx_第4页
第4页 / 共17页
基于DCT变换的图像压缩编码.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

基于DCT变换的图像压缩编码.docx

《基于DCT变换的图像压缩编码.docx》由会员分享,可在线阅读,更多相关《基于DCT变换的图像压缩编码.docx(17页珍藏版)》请在冰豆网上搜索。

基于DCT变换的图像压缩编码.docx

基于DCT变换的图像压缩编码

 

1.绪论

MATLAB是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。

它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平[1]。

随着信息技术的发展,图像信息被广泛应用于多媒体通信和计算机系统中,但是图像数据的一个显著特点就是信息量大。

具有庞大的数据量,如果不经过压缩,不仅超出了计算机的存储和处理能力,而且在现有的通信信道的传输速率下,是无法完成大量多媒体信息实时传输的,因此,为了更有效的存储、处理和传输这些图像数据,必须对其进行压缩,因此有必要对图像压缩编码进行研究。

由于组成图像的各像素之间,无论是在水平方向还是在垂直方向上都存在着一定的相关性,因此只要应用某种图像压缩编码方法提取或者减少这种相关性,就可以达到压缩数据的目的。

数字图像包含的冗余信息一般有以下几种:

空问冗余、时间冗余、信息熵冗余、统计冗余、结构冗余、视觉冗余以及知识冗余等。

图像压缩算法就是要在保证图像一定的熏建质量的同时,尽可能多的去除这些冗余信息.以达到对图像压缩的目的。

随着科学技术的发展,图像压缩编码技术越来越引起人们的关注。

所谓的图像压缩编码技术就是对要处理的图像数据按一定的规则进行变换和组合,从而达到以尽可能少的数据流来表示尽可能多的数据信息。

本设计基于DCT的JPEG、PNG、BMP等格式图像编解码设计算法进行研究,介绍了编码中DCT变换、量化、游程编码等模块的原理和数学推导以及各模块的功能分析。

最后应用MATLAB进行了实验仿真并分析结果得出结论。

DCT变换后具有绝对的去相关性,并且变换后的矩阵从左上角到右下角频率规律的渐高。

有损压缩方法利用了人类视觉对图像中的某些频率成分不敏感的特性,允许压缩过程中损失一定的信息;虽然不能完全恢复原始数据,但是所损失的部分对理解原始图像的影响较小,却换来了大得多的压缩比。

因此舍弃高频分量保留低频分量的做法对于图像压缩具有绝对的优势。

只要损失的数据不太影响人眼主观接收的效果,就可采用。

DCT变换后的压缩此本设计采用经典的游程编码实现。

2.设计任务

2.1任务描述

基于DCT的图像编解码设计

(1)获取图像;

(2)采用DCT实现对图像编解码设计;

(3)分析编解码性能

2.2技术指标

(1)可对JPEG、PNG、BMP等格式图像进行基于DCT的图像编解码;

(2)为了便于分析比较,定义一个量化系数quotiety,越大压缩率越高。

(3)压缩编码、量化系数统一写入存储文件compressed_data.mat,实现可移植解压。

(4)观察压缩后图片大小,简便起见,分析只关心compressed_data.mat文件的大小。

(5)实现DCT变换和反变换以及JPEG标准量化矩阵的量化、反量化。

(6)根据DCT量化后矩阵特点,本设计编码采用Z字型扫描游程编码、解码。

(7)DCT压缩前后比较,以及不同量化系数比较

 

3.设计原理

3.1原理框图

基于DCT的图像编码包括三个阶段:

DCT变换、量化、编码。

根据DCT量化后矩阵特点,本设计编码采用Z字型扫描游程编码、解码。

首先将输入图像颜色空间转换后分解为8×8大小的数据块,然后用正向二维DCT把每个块转变成64个DCT系数值,其中1个数值是直流(DC)系数,即8×8空域图像子块的平均值,其余的63个是交流(AC)系数,接下来对DCT系数进行量化,最后将变换得到的量化的DCT系数进行编码和传送,这样就完成了图像的压缩过程。

图3-1编码过程

基于DCT的图像编码包括三个阶段:

译码、反量化、IDCT变换。

在解码过程中,形成压缩后的图像格式,先对已编码的量子化的DCT系数进行解码,然后求逆量化并把DCT系数转化为8×8样本像块(使用二维DCT反变换),最后将操作完成后的块组合成一个单一的图像。

这样就完成了图像的解压过程。

图3-2解码过程

 

3.2程序流程图

基于DCT的图像编解码设计的MATLAB实现的流程图如图3-3所示。

 

图3-3程序流程图

3.3离散余弦变换

DCT变换利用傅立叶变换的性质。

采用图像边界褶翻将像变换为偶函数形式,然后对图像进行二维傅立叶变换,变换后仅包含余弦项,所以称之为离散余弦变换。

DCT编码属于正交变换编码方式,用于去除图像数据的空间冗余。

变换编码就是将图像光强矩阵(时域信号)变换到系数空间(频域信号)上进行处理的方法。

在空间上具有强相关的信号,反映在频域上是在某些特定的区域内能量常常被集中在一起,或者是系数矩阵的分布具有某些规律。

我们可以利用这些规律在频域上减少量化比特数,达到压缩的目的。

图像经DCT变换以后,DCT系数之间的相关性就会变小。

而且大部分能量集中在少数的系数上,因此,DCT变换在图像压缩中非常有用,是有损图像压缩国际标准JPEG的核心。

从原理上讲可以对整幅图像进行DCT变换,但由于图像各部位上细节的丰富程度不同,这种整体处理的方式效果不好。

为此,发送者首先将输入图像分解为8*8或16*16块,然后再对每个图像块进行二维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))是空间域数据阵列,(F(u,v))是变换系数阵列,(A)是系数阵列,变换矩阵(A)’是(A)的转置[5]。

设计中2维DCT变换函数代码如下:

functionXpq=DCT2_function(xmn,M)

T=dctmtx(M);%产生二维DCT变换矩阵

Xpq=T*xmn*T';

设计中2维IDCT变换函数代码如下:

functionxmn_resume=IDCT2_function(Xpq_resume,M)

T=dctmtx(M);%生成变换矩阵

xmn_resume=T'*Xpq_resume*T;%用变化矩阵的乘法代替效率极低的for求和循环

3.4量化

在DCT处理中得到的64个数据中,低频分量包含了图像亮度等主要信息。

在从空间域到频域的变换中,图像中的缓慢变化比快速变化更易引起人眼的注意,所以在重建图像时,低频分量的重要性高于高频分量。

因而在编码时可以忽略高频分量,即减小非“0”系数的幅度以及增加“0”值系数的数目,从而达到压缩的目的,这也是量化的根据和目的,也是图像质量下降的最主要原因。

在JPEG标准中,用具有64个独立元素的量化表来规定DCT域中相应的64个系数的量化精度,使得对某个系数的具体量化阶取决于人眼对该频率分量的视觉敏感程度。

理论上,对不同的空间分辨率、数据精度等情况,应该有不同的量化表。

不过,一般采用下图所示的量化表,可取得较好的视觉效果。

量化化就是用DCT变换后的系数除以量化表中相对应的量化阶后四舍五入取整。

由于量化表中左上角的值较小,而右下角的值较大,因而起到了保持低频分量、抑制高频分量的作用。

为了便于分析比较,定义一个量化系数quotiety,越大压缩率越高。

量化系数quotiety:

程序中是将JPEG标准量化矩阵*quotiety作为真正的量化矩阵。

quotiety取值为大于1的任意实数。

本设计中利用函数integral_function.m和deintegral_function实现量化和反量化。

 

图3-4灰度值量化表

量化会产生误差,上表是综合大量的图像测试的实验结果,对于大部分图像都有很好的结果[3]。

表中可以看出,高频部分对应的量化值大,目的就是将高频部分编程接近于0,以便以后处理。

JPEG可以在压缩比和图像质量间作取舍。

方法就是改变量化系数。

如果量化值放大,则有更多的系数值为0,提高了压缩比。

3.4Z形扫描游程编码

DCT系数量化后,构成一个稀疏矩阵,用Z(Zigzag)形扫描将其变成一维数列,将有利于游程编码。

Z形扫描的顺序如图3-4。

 

图3-5Z形扫描顺序图

游程编码是一种统计编码,该编码属于无损压缩编码,是栅格数据压缩的重要编码方法。

游程编码的基本原理是:

用一个符号值或串长代替具有相同值的连续符号,使符号长度少于原始数据的长度。

只在各行或者各列数据的代码发生变化时,一次记录该代码及相同代码重复的个数,从而实现数据的压缩。

游程编码运算简单,适用于机器存储容量小,数据需大量压缩,而又要避免复杂的编码和解码运算,增加处理和操作时间的情况[2]。

本设计中利用两个函数Run_length_coding_function.m和Run_length_decoding_function.m分别实现Z字形游程的编码解码。

由于DCT变换后右下角频率高,左上角频率分量低。

而人眼对高频成分识别小,对低频成分识别大。

量化后0主要集中在右下方,于是Z字形扫描对于游程编码才有利[4]。

主要思路是将原矩阵的每个元素变化为用两个元素[a,b]表示,a表示在这个元素之前0的个数,b表示这个元素是什么。

当发现之后的多有元素都是0的时候用[0,0]作为结束标志。

这样,只要矩阵中0的个数超过一半,编码后数据量就比原来小。

由于在8*8中连续出现不为0的相同元素的几率极小,因此运用游程编码的思想时只考虑出现的0的个数。

4.运行结果及分析

4.1不同量化系数图像编解码效果比较

量化系数quotiety:

程序中是将Jpeg标准量化矩阵*quotiety作为真正的量化矩阵。

quotiety取值为大于1的任意实数。

下面以JPEG格式图像为标准,取不同的量化系数quotiety进行比较,原始图像大小为18.2KB:

图4-1原始图像

图4-2quotiety=1时恢复图像

此时压缩编码文件为compressed_data大小为14.0KB。

图4-3quotiety=2时恢复图像

此时压缩编码文件为compressed_data大小为10.0KB。

图4-4quotiety=5时恢复图像

此时压缩编码文件为compressed_data大小为6.26KB。

图4-5quotiety=10时恢复图像

此时压缩编码文件为compressed_data大小为4.02KB。

结论:

量化系数quotiety越大,压缩率越高,图像恢复的效果也越差。

量化会产生误差,如果量化值放大,则有更多的灰度值变为0,能够提高压缩比。

4.2不同文件类型图像编解码比较

量化系数quotiety都取5时,对不同文件类型的lena图进行编解码

图4-6原始图像

下面为JPEG的lena图编码的解码恢复图像:

图4-7JPEG格式的恢复图像

下面为BMP的lena图编码的解码恢复图像:

图4-8BMP格式的恢复图像

下面为PNG的lena图编码的解码恢复图像:

图4-9PNG格式的恢复图像

观察三个恢复图像,在原始图像相同的情况下,三种文件格式下编解码解码效果无太大差异。

当量化系数quotiety取其他值时,三种文件格式编码解码效果也相同。

由此可知,该系统可以用于JPEG、BMP、PNG等文件的压缩编码和解码,且编码解码效果相同。

 

5.总结

本次信息处理系统综合训练让我更熟悉地掌握MATLAB的功能,灵活运用MATLAB,加强对MATLAB软件图像处理的能力,掌握图像的离散余弦变换对图像进行压缩,以及游程编码等概念。

在熟悉掌握MATLAB程序和操作的同时培养了我的独立思考能力,钻研精神,解决问题能力和动手能力。

虽然在此之前通过基础强化训练运用国MATLAB软件并完成简单图像操作,但知道的只是最基本的的应用,对于MATLAB在图像处理上的应用,我完全没有理解。

本次课程设计中通过查阅资料,阅读程序并读写程序对MATLAB图像应用有了更深的了解。

我同时也认识到了MATLAB功能并不只是图形的绘制及波形的处理,有着很多方面的运用,如绘制函数,处理音频、图像数据,创建用户界面等功能,实为一个功能强大的软件。

在课设过程中每每编写程序及操作时出现问题,我都会通过查阅资料,仔细检查解决问题,经过一次次的修改完善,才出现最终的最优结果。

在这个过程中,面对问题不放弃不急躁,一次次改进,静下心来慢慢解决,并细致完善细节,从而能培养一种良好的学习心态和习惯。

数据压缩技术的优劣主要是由压缩所能达到的压缩倍数、从压缩后的数据所能恢复的图像的质量和算法的复杂度、解码的速度等方面来衡量的。

基于DCT的混合编码技术对于图像的压缩倍数可以达到几十倍甚至上百倍,而且重建的图像又具有较高的质量,因此得到广泛的应用。

用MATLAB来实现离散余弦变换的图像压缩,具有方法简单、速度快、误差小的优点,免去了大量的矩阵计算,大大提高了图像压缩的效率和精度。

 

6.参考文献

[1]张秋臣.浅谈MATLAB分析及UG的运动仿真[期刊论文]-锦绣,2013.04.

[2]祝本明,刘桂华.一种改进的游程编码算法[期刊论文]-西南科技大学学报,2007.03.

[3]

[4]

[5]杨杰,黄朝兵.数字图像处理及MATLAB实现.北京:

电子工业出版社,2011.01;

 

附录:

Main_Menu.m

k=menu('请选择需要的功能','图像压缩','图像解压');

switchk

case1

DCT_compress;

Main_Menu;

case2

IDCT_decompress;

Main_Menu;

end

DCT_compress.m

%主要思想:

%--->读取图像文件

%--->分块DCT变换

%--->Jpeg标准量化表量化

%--->Z字形游程编码

%--->存储压缩后的文件

clearall;clc;

globalquotiety;

[FileName,PathName,FilterIndex]=uigetfile('*.bmp;*.jpg;*.png','请选择要压缩的源图像');

string=sprintf('%s%s',PathName,FileName);

quotiety=inputdlg('系数越大压缩率越高','输入您需要的压缩系数:

',1,{'1'});

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,[88],'DCT2_function',8);%每一小块DCT变换

waitbar(2/4,h);

Xpq_estimate=blkproc(Xpq,[88],'integral_function');%量化表量化

waitbar(3/4,h);

forindex1=1:

1:

M/8

forindex2=1:

1:

N/8%对每一小块游程编码,结果存在cell数组Xpq_coded里

Xpq_coded{index1,index2}=int8(Run_length_coding_function(Xpq_estimate(8*(index1-1)+1:

8*index1,8*(index2-1)+1:

8*index2)));

end

end

waitbar(4/4,h);

close(h);

uisave({'Xpq_coded','quotiety'},'compressed_data');%存储编码后的信息、量化系数

figure;imshow(Xpq_estimate);

title('压缩图像');

DCT2_function.m

functionXpq=DCT2_function(xmn,M)

T=dctmtx(M);%产生二维DCT变换矩阵

Xpq=T*xmn*T';

intergral_function.m

functionXpq_estimate=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];%量化矩阵

globalquotiety

Xpq_estimate=int8(Xpq./(integral_table*quotiety));%此处的量化系数表示除以的Jpeg标准量化矩阵的倍数

 

Run_length_coding_function.m

%由于DCT变换后右下角频率高,左上角频率分量低。

而人眼对高频成分识别小,对低频成分识别大

%量化后0主要集中在右下方,于是Z字形扫描对于游程编码才有利

%主要思想:

原矩阵的每个元素变化为用两个元素【a,b】表示,a表示在这个元素之前0的个数,

%b表示这个元素是什么。

当发现之后的多有元素都是0的时候用【0,0】作为结束标志。

functionXpq_coded=Run_length_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;

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;

forindex=1:

1:

64%扫描

ifXpq_estimate(table(index,1),table(index,2))==0%如果遇到了0,那么下一个数字到来之前的0的个数就加1

count=count+1;

else%如果遇到的不是0,那么Xpq_coded=(,)的第一个元素存储之前0的个数,第二个元素存储此时遇到的这个元素

Xpq_coded(compress_index,1)=count;

Xpq_coded(compress_index,2)=Xpq_estimate(table(index,1),table(index,2));

count=0;%过去这个元素之后0的个数就要重新计

compress_index=compress_index+1;

end

if~count==0

Xpq_coded(compress_index,1)=0;

Xpq_coded(compress_index,2)=0;

end

end

IDCT_decompress.m

%主要思想:

%跟压缩过称恰好相反

%--->读取压缩文件

%--->Z字形游程解码

%--->Jpeg标准量化表反量化

%--->分块DCT变换

%--->存储解压后的文件

clearall;clc;

globalquotiety;

uiload;

h=waitbar(0,'正在解压,请稍候……');

Xpq_decoded=Xpq_coded;

clearXpq_coded;

[M,N]=size(Xpq_decoded);

waitbar(1/4,h);

%游程解码得到Xpq_deestimate

forindex1=1:

1:

M

forindex2=1:

1:

N

Xpq_deestimate(8*(index1-1)+1:

8*index1,8*(index2-1)+1:

8*index2)=Run_length_decoding_function(Xpq_decoded{index1,index2});

end

end

waitbar(2/4,h);

%反量化得到幅频值

Xpq_resume=blkproc(Xpq_deestimate,[88],'deintegral_function');

waitbar(3/4,h);

%DCT逆变换得到xmn

xmn_resume=blkproc(Xpq_resume,[88],'IDCT2_function',8);

xmn_resume=uint8(xmn_resume);

waitbar(4/4,h);

close(h);

figure;imshow(xmn_resume);

title('恢复的图像');

IDCT2_function.m

functionxmn_resume=IDCT2_function(Xpq_resume,M)

T=dctmtx(M);%生成变换矩阵

xmn_resume=T'*Xpq_resume*T;%用变化矩阵的乘法代替效率极低的for求和循环

deintegral_function.m

functionXpq_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];

globalquotiety;

Xpq_resume=Xpq_deestimate.*integral_table*quotiety;%反量化恢复的过程要考虑到量

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1