MATLAB在数据压缩技术中的应用.docx
《MATLAB在数据压缩技术中的应用.docx》由会员分享,可在线阅读,更多相关《MATLAB在数据压缩技术中的应用.docx(13页珍藏版)》请在冰豆网上搜索。
![MATLAB在数据压缩技术中的应用.docx](https://file1.bdocx.com/fileroot1/2022-12/14/c5c9e639-9747-42f7-91b8-4c390daea8c8/c5c9e639-9747-42f7-91b8-4c390daea8c81.gif)
MATLAB在数据压缩技术中的应用
MATLAB在数据压缩技术中的应用
摘要
离散余弦变换(DiscreteCosineTranform,简称DCT)是一种与傅立叶变换紧密相关的数学运算。
在傅立叶级数展开式中,如果被展开的函数式是偶函数,那么其傅立叶级数中只包含余弦项,再将其离散化可导出余弦变换,因此称之为离散余弦变换。
时间域中信号需要许多数据点表示;在x轴表示时间,在y轴表示幅度。
信号一旦用傅立叶变换转换到频率域,就只需要几点就可以表示这个相同的信号。
如我们已经看到的那样,原因就是信号只含有少量的频率成分。
这允许在频率域中只用几个数据点就可以表示信号,而在时间域中表示则需要大量数据点。
这一技术可以应用到彩色图像上。
彩色图像有像素组成,这些像素具有RGB彩色值。
每个像素都带有x,y坐标,对每种原色使用8x8或者16x16矩阵。
在灰度图像中像素具有灰度值,它的x,y坐标由灰色的幅度组成。
为了在JPEG中压缩灰度图像,每个像素被翻译为亮度或灰度值。
关键词;图像压缩算法MATLAB软件DCT压缩编码
引言
随着信息技术的发展,图像信息被广泛应用于多媒体通信和计算机系统中。
但是图像具有庞大的数据量,不便于存储和传输,必须采用合适的方法对其进行压缩,因此有必要对图像压缩编码标准进行研究。
本研究在介绍图像压缩原理的基础上,用Matlab6.5对标准灰度图像进行压缩与重建,并分析实验结果,得出结论。
第一章基于DCT的图像压缩编码理论算法及Matlab仿真基础
1.1图像压缩编码的概念
压缩的理论基础是信息论。
从信息论的角度来看,压缩就是去掉信息中的冗余,即保留不确定的信息,去掉确定的信息(可推知的),也就是用一种更接近信息本质的描述来代替原有冗余的描述。
这个本质的东西就是信息量(即不确定因素)。
1.2图像压缩编码的一般框图
图像压缩的过程可以概括成图所示的三个步骤,原始图像经映射变换后的数据再经量化器和熵编码器成为码流输出。
(1)映射变换。
其目的是通过映射改变图像数据的特性,使之更有利于压缩编码。
(2)量化器。
在限失真编码中要对映射后的数据进行量化,若量化是对映射后的数据逐个的进行的,则称标准量化,若量化是成组的进行的,则称矢量量化,量化总会造成某些信息丢失,形成失真,即量化失真或量化噪声,为使失真小,应量化的精细,但压缩比就高不了,这是一对矛盾,应选用恰当的量化级数和量化曲线形状来缓解这对矛盾,量化器的引入是图像编码产生失真的根源,在要求复原图像与原图完全一致的无失真编码器中必须不用量化器,但这样一来,压缩比难以提高,在多数应用中,存在少量失真并不可怕,只要把失真的程度和性质控制在允许的范围内,也就是把复原图像的主观质量控制在允许的程度内,就可以在满足应用要求的前提下提高压缩比,值得注意的是,对于同样的量化失真,不同的映射变换和反变换反映不同性质的复原图像的失真,人眼对某些性质的失真敏感而对另一些性质的失真不敏感。
(3)熵编码器。
这一步是用来消除符号编码冗余度的,它一般不产生失真,理想的情况是编出的码流的平均码长等于量化后数据的信息熵,常用的编码方法有许多种,例如分组码、行程码(RLC)和变长码(VLC)、不分组码以及算术码(ArithmaticCoing等)。
行程码传输的是数据行程长度而不是数据本身,例如要传108个0,用行程码是改为传行程码标记和行程长度1080在变长码中最常用的是霍夫曼(Hufman)码,基本原则是对出现概率大的数值用短码来编,对出现概率小的数值用长码来编,从而使平均码长减小。
降低码率,在实际编码器中常把RLc和Hufman码结合起来,称为霍夫曼行程码。
1.3MATLAB仿真实现
根据压缩编码算法,要将一幅灰度图像进行压缩编码,首先把图像分成8×8的像素块,分块进行DCT变换后,根据标准量化表Es]对变换系数进行量化后,再对直流系数(DC)进行预测编码,然后根据标准的Huffman码表蜘进行熵编码,输出压缩图像的比特序列,实现了图像压缩。
在接收端,则经过Huffman熵解码、DC系数和AC系数可变长解码、反量化后,再进行反DCT变换得到重建图像。
对一幅图像进行编解码的MATLAB程序流程图:
第二章离散余弦变换(DCT)
2.1DCT的定义
DCT变换利用傅立叶变换的性质.采用图像边界褶翻将像变换为偶函数形式,然后对图像进行二维傅立叶变换,变后仅包含余弦项.所以称之为离散余弦变换。
2.2DCT和图像压缩
DCT编码属于正交变换编码方式.用于去除图像数据的空间冗余。
变换编码就是将图像光强矩阵(时域信号)变换到系数空间(频域信号)上进行处理的方法。
在空问上具有强相关的信号,反映在频域上是在某些特定的区域内能量常常被集中在一起,或者是系数矩阵的分布具有某些规律。
我们可以利用这些规律在频域上减少量化比特数,达到压缩的目的。
图像经DCT变换以后,DCT系数之间的相关性已经很小。
而且大部分能量集中在少数的系数上,因此,DCT变换在图像压缩中非常有用,是有损图像压缩国际标准JPEG的核心。
从原理上讲可以对整幅图像进行DCT变换,但由于图像各部位上细节的丰富程度不同,这种整体处理的方式效果不好。
为此,发送者首先将输入图像分解为8x8或16x16的块,然后再对每个图像块进行二维DCT变换,接着再对DCT系数进行量化、编码和传输;接收者通过对量化的DCT系数进行解码,并对每个图像块进行的二维DCT反变换.最后将操作完成后所有的块拼接起来构成一幅单一的图像。
对于一般的图像而言,大多数DCT系数值都接近于0,町以去掉这些系数而不会对重建图像的质量产生霞大影响。
此,利用DCT进行圈像压缩确实可以节约大量的存储空间在宴验中,先将输入的原始lena图像分为8x8的块,然后再对每个块进行二维DCT变换。
MATLAB图像处理上具箱中提供的二维DCT变换及DCT反变换函数如下。
2.2.1.dct2
dct2实现图像的二维离散余弦变换.其语法格式为:
(1)B=dct2(A)
返回图像A的二维离散余弦变换值,其大小与A相同且各元素为离散余弦变换的系数B(K1,k2)。
(2)B=dct2(A,in,n)或B=dct2(A,[m,n])
如果m和n比图像A大,在对图像进行二维离散余弦变换之前,先将图像A补零至mxn如果m和n比图像A小。
则进行变换之前,将图像A剪切。
2.2.2.idct2
idct2可以实现图像的二维离散余弦反变换,其语法格式为:
B=idct2(A);B=idct2(A,m,n)或B=idct2(A,[m,n])。
第三章图像编码
3.1图像编码的分类
图像编码压缩的方法目前有很多,其分类方法根据出发点不同而有差异。
根据解压重建后的图像和原始图像之间是否具有误差(对原图像的保真程度),图像编码压缩分为无误差(亦称无失真、无损、信息保持)编码和有误差(有失真或有损)编码两大类。
无损压缩(冗余度压缩、可逆压缩):
是一种在解码时可以精确地恢复原图像,没有任何损失的编码方法,但是压缩比不大,通常只能获得1~5倍的压缩比。
用于要求重建后图像严格地和原始图像保持相同的场合,例如复制、保存十分珍贵的历史、文物图像等;有损压缩(不可逆压缩):
只能对原始图像进行近似的重建,而不能精确复原,适合大数工用于存储数字化了的模拟数据,压缩比大,但有信息损失。
3.2无损编码
3.2.1行程编码(RLE)
在一个逐行存储的图像中,具有相同灰度值的一些象素组成的序列称为一个行程。
在编码时,对于每个行程只存储一个灰度值的码,再紧跟着存储这个行程的长度。
这种按照行程进行的编码被称为行程编码(RunLengthEncoding)。
行程编码对于仅包含很少几个灰度级的图像,特别是二值图像,比较有效。
3.2.2Huffman编码
Huffman编码是50年代提出的一种基于统计的无损编码方法,它利用变长的码来使冗余量达到最小。
通过一个二叉树来编码,使常出现的字符用较短的码代表,不常出现的字符用较长的码代表。
静态Huffman编码使用一棵依据字符出现的概率事先生成好的编码树进行编码。
而动态Huffman编码需要在编码的过程中建立编码树。
由于Huffman编码所得到的平均码字长度可以接近信源的熵,因此在变长编码中是最佳的编码方法,故也称为熵编码。
具体编码方法是:
①把输入元素按其出现概率的大小顺序排列起来,然后把两个具有最小概率的元素之概率加起来;②把该概率之和同其余概率大小顺序排队,然后再把两个最小概率加起来,再重新排队;③重复②,直到最后得到和为1的根节点。
3.3有损编码
3.3.1量化
将图像用较少的灰度级别来表示是最简单的减小数据量的方法,这种方法就是标量量化方法。
更一般的情况是,针对连续量的采样过程,量化是用有限个状态来表示连续值。
3.3.2预测编码
预测编码根据数据在时间和空间上的相关性,根据统计模型利用已有样本对新样本进行预测,将样本的实际值与其预测值相减得到误差值,再对误差值进行编码。
由于通常误差值比样本值小得多,因而可以达到数据压缩的效果。
模拟量到数字量的转换过程是脉冲编码调制过程PCM,也称PCM编码。
对于图像而言,直接以PCM编码,存储量很大。
预测编码可以利用相邻象素之间的相关性,用前面已出现的象素值估计当前象素值,对实际值与估计值的差值进行编码。
常用的一种线性预测编码方法是差分脉冲编码调制DPCM。
预测编码通常不直接对信号编码,而是对预测误差编码。
当预测比较准确,误差较小时,即可达到编码压缩的目的。
这种编码称之为差分脉冲编码调制(DPCM),上图是原理框图。
在该系统中,xN为tN时刻的亮度取样值。
预测器根据tN时刻之前的样本x1,x2,…,xN-1对xN作预测,得到预测值x'N。
xN与x'N之间的误差为量化器对eN进行量化得到e‘N。
编码器对e’N进行编码发送。
接收端解码时的预测过程与发送端相同,所用预测器亦相同。
当ΔxN足够小时,输入信号xN和DPCM系统的输出信号几乎一致。
3.3.3DCT编码
DCT变换是图像压缩标准中常用的变换方法,如JPEG标准中将图像按8x8分块利用DCT变换编码实现压缩。
3.4保真度准则
在图像压缩编码中,解码图像与原始图像可能会差异,因此,需要评价压缩后图像的质量。
描述解码图像相对原始图像偏离程度的测度一般称为保真度(逼真度)准则。
常用的准则可分为两大类:
客观保真度准则和主观保真度准则。
3.4.1客观保真度准则
最常用的客观保真度准则是原图像和解码图像之间的均方根误差和均方根信噪比两种。
令f(x,y)代表原图像,代表对f(x,y)先压缩又解压缩后得到的f(x,y)的近似,对任意x和y,f(x,y)和f^(x,y)之间的误差定义为:
若f(x,y)和f^(x,y)均为M×N,则它们之间均方根误差为:
如果将f^(x,y)看作原始图f(x,y)和噪声信号e(x,y)的和,那么解压图像的均方信噪比SNR为:
如果对上式求平方根,就得到均方根信噪比。
3.4.2主观保真度准则
尽管客观保真度准则提供了一种简单、方便的评估信息损失的方法,但很多解压图最终是供人观看的。
事实上,具有相同客观保真度的不同图像,在人的视觉中可能产生不同的在视觉效果。
这是因为客观保真度是一种统计平均意义下的度量准则,对于图像中的细节无法反映出来。
而人的视觉系统具有独特的特性,能够觉察出来。
这种情况下,用主观的方法来测量图像的质量更为合适。
1种常用的方法是对1组(不少于20人)观察者显示图像,并将他们对该图像的评分取平均,用来评价一幅图像的主观质量。
第四章MATLAB仿真及效果
4.1程序
%程序功能:
模拟DCT编码解码过程,生成带“块效应”的图像
%步骤:
灰度图像→DCT→量化→反量化→IDCT
I=imread('cameraman.tif')
I=im2double(I)%转换图像矩阵为双精度型。
T=dctmtx(8)%产生标准二维DCT变换中的矩阵8*8
%计算二维DCT,矩阵T及其转置是DCT函数P1*X*P2的参数,DCT变换公式:
正变换K=T*P*T',逆变换P=I'*K*I
a1=[1611101624405161;%亮度量化表
1212141926586055;
1413162440576956;
1417222951878062;
182237566810910377;
243555648110411392;
49647887103121120101;
7292959811210010399];
%分块做DCT变换(8*8)
fori=1:
8:
200%用到了for循环的嵌套
forj=1:
8:
200%循环内容
P=I(i:
i+7,j:
j+7);
K=T*P*T';
I2(i:
i+7,j:
j+7)=K;
K=K./a1;%量化
K(abs(K)<0.03)=0;%将DCT变换值小于0.03的元素设为0
I3(i:
i+7,j:
j+7)=K;
end
end
figure;
imshow(I2);
title('DCT变换后的频域图像');%显示DCT变换后的频域图像
%分块做DCT反变换(8*8)
fori=1:
8:
200
forj=1:
8:
200
P=I3(i:
i+7,j:
j+7).*a1;%反量化
K=T'*P*T;
I4(i:
i+7,j:
j+7)=K;
end
end
figure;
imshow(I4);
title('复原图像');
imwrite(I4,'复原图像6.jpg');
%对图像I的每一个8*8数据应用矩阵式'P1*x*P2'进行处理,其中P1=T,P2=T'
B=blkproc(I,[8,8],'P1*x*P2',T,T')
mask=[11110000%二值掩模,用来压缩DCT系数,只留下DCT系数中左上角的10个
11100000
11000000
10000000
00000000
00000000
00000000
00000000]
B2=blkproc(B,[88],'P1.*x',mask)%只保留DCT变换的10个系数
I2=blkproc(B2,[88],'P1*x*P2',T',T)%逆DCT变换,用来重建图像
figure
imshow(I)
title('原始图像');
figure
imshow(I2);
title('压缩图像');
figure
imshow(dct2(I));
figure
mesh(dct2(I))%mesh函数是用来画三维网格表面
colorbar('horiz')
4.2结果
图1图2
图3图4
图5
图6
第五章作业过程中遇到的问题
(1)DCT变换能够体现出能量的关系,但是它是怎么体现点与点的关系的?
(2)在对已变换的数据做反变换的时候,它是怎么还原成原来的图片的?
(3)为什么采用8x8的图像块?
(4)图片加载到什么地方?
是二维数组吗?
第六章总结
通过做这次大作业以后才发现自己对matlab软件还不是很熟悉,看到别的同学做的东西都是很复杂而且功能很强大,而自己做的大作业却是相当的简单,有时下一下真的很惭愧。
但是反过来又想,不要管别人做的怎么样,我只要把自己所做的东西弄懂就可以了,反正我们都是在学知识,努力就行了。
对于DCT的图像处理方法,我不是很懂,在网上查阅了一些资料,把网上的代码进行粗略的了解之后,再对代码修改运行调试,最后再根据相关的理论知识对代码进行详细的分析。
通过这次大作业,自己又重新熟悉了matlab的一些功能,刚开始的时候本来想用systemview来仿真一个通信系统的,但那软件不太会用,最后选择了直接用matlab来处理数据压缩技术的图片问题。
在将近一个多星期的MATLAB大作业过程中,我真的是受益匪浅。
起初对图像处理的知识几乎没有,不知道图像的格式,不知道DCT,很茫然,无从下手。
刚开始我大量的查看网络,首先找一些图像处理的基本知识,从大量的知识中,挖掘有用的东西,近于课设有关的知识,比如信道,编码技术等等信息,一概过滤,最快的时间,找有用的知识。
参考文献
[1]吕风军.数学图象处理编程人门——做一个自己的Photosho
[2]阮秋奇.数学图象处理学[M]北京:
电子工业出版社,2001.
[3]清源计算机工作室ICu~.TLa.B高级应用——图形及影像处理
[4]罗倩玲.JPEG编码与矢量量化编码方法比较[J].电子测量技术
[5]张志涌.精通Matlab6.5版[M3.北京:
北京航空航天
大学出版社,2003.
[6]钟玉琢,冼伟铨,沈洪编著.多媒体技术基础及应用,清华大学出版社,2000.