基于matlab的数字图像图像压缩及编码含matlab源程序.docx
《基于matlab的数字图像图像压缩及编码含matlab源程序.docx》由会员分享,可在线阅读,更多相关《基于matlab的数字图像图像压缩及编码含matlab源程序.docx(24页珍藏版)》请在冰豆网上搜索。
![基于matlab的数字图像图像压缩及编码含matlab源程序.docx](https://file1.bdocx.com/fileroot1/2023-2/24/21a48c84-d0e6-4645-a791-92ba9e206421/21a48c84-d0e6-4645-a791-92ba9e2064211.gif)
基于matlab的数字图像图像压缩及编码含matlab源程序
基于matlab的数字图像图像压缩与编码〔含matlab源程序〕
摘要
MATLAB是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。
它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进展有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言〔如C、Fortran〕的编辑模式,代表了当今国际科学计算软件的先进水平
MATLAB在数学类科技应用软件中在数值计算方面首屈一指。
MATLAB可以进展矩阵运算、绘制函数和数据、实现算法、创立用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
MATLAB的根本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成一样的事情简捷得多,并且mathwork也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。
在新的版本中也参加了对C,FORTRAN,C++,JAVA的支持。
可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户可以直接进展下载就可以用。
本次课程设计那么是基于MATLAB图像变换及压缩编码,着重训练matlab在图像处理方面的应用,能够运用相关软件进展模拟分析。
通过对采集的图像进展读入图像并对图像进展傅利叶变换、小波变换、小波包变换、离散余弦变换、离散沃尔什变换,二维哈达玛变换。
并分别采用小波变换和离散余弦变换对图像进展压缩,并与原图像进展比较。
从而到达对matlab软件的熟悉和程序的书写。
关键字:
matlab图像变换压缩编码
Abstract
MATLABisaU.S.company'smainfacemathworksscientificcomputing,visualizationandhigh-techinteractivecomputingenvironmentprogramming.Itnumericalanalysis,matrixcomputation,scientificdatavisualizationandnonlineardynamicsystemsmodelingandsimulation,andmanyotherpowerfulfeaturesinaneasytouseintegratedWindowsenvironmentforscientificresearch,engineeringdesignandtheneedforeffectivenumericalcalculationmanyfieldsofscienceprovidesacomprehensivesolution,andlargelyoutofthetraditionalnon-interactiveprogramminglanguage(suchasC,Fortran)oftheeditmode,onbehalfofthecurrentinternationaladvancedlevelofscientificcomputingsoftwareMATLABapplicationoftechnologyinmathematicsclassesinnumericalcomputingsoftware,secondtonone.MATLABmatrixoperationscanbecarriedout,drawingfunctionsanddata,algorithm,createuserinterfaces,connectingtheproceduresofotherprogramminglanguages,mainlyusedinengineeringcalculations,controldesign,signalprocessingandcommunications,imageprocessing,signaldetection,financialmodelingdesignandanalysisandotherfields.MATLAB'sbasicdataunitisthematrix,itsexpressionandmathematicsinstruction,engineeringisverysimilartotheformcommonlyused,itiscalculatedusingMATLABtosolvetheproblemthanusingC,FORTRANandotherlanguagesaccomplishthesamethingmuchmoresimpleandmathworkalsoabsorbedtheadvantagesofsoftwaresuchasMaple,MATLABmakesapowerfulmathematicalsoftware.InthenewversionalsoaddssupportforC,FORTRAN,C,JAVAsupport.Canbecalleddirectly,theusercanalsowritetheirownutilityfunctionlibraryintoMATLABtofacilitatetheirfuturecalling,inadditiontomanyfanshavewrittenanumberofMATLABclassicprocedure,theusercandownloaddirectlyyoucanuse.ThecoursedesignisbasedontheMATLABimagetransformationandcompression,focusingontrainingmatlabinimageprocessingapplications,canbeanalyzedusingsimulationsoftware.ImagescollectedbytheimageandtheimagereadintotheFouriertransform,wavelettransform,waveletpackettransform,discretecosinetransform,discreteWalshtransform,twoWeihadammartransformation.Theapproachofusingwavelettransformanddiscretecosinetransform,imagecompression,comparedwiththeoriginalimage.Matlabsoftwaretoachievethefamiliarandthewritingprocess.Keywords:
matlabimagetransformcoding
1.傅里叶变化及反变化
1.1原理及计算公式
Matlab函数fft、fft2和fftn分别可以实现一维、二维和N维DFT算法;而函数ifft、ifft2和ifftn那么用来计算反DFT。
这些函数的调用格式如下:
A=fft(X,N,DIM)
其中,X表示输入图像;N表示采样间隔点,如果X小于该数值,那么Matlab将会对X进展零填充,否那么将进展截取,使之长度为N;DIM表示要进展离散傅立叶变换。
A=fft2(X,MROWS,NCOLS)其中,MROWS和NCOLS指定对X进展零填充后的X大小。
A=fftn(X,SIZE)其中,SIZE是一个向量,它们每一个元素都将指定X相应维进展零填充后的长度。
一个图象尺寸为M×N的离散函数f(x,y)的离散傅立叶变化如下:
〔1.1〕
f(x,y)可以通过对F(u,v)求傅立叶逆变化获得,其表达式如下:
〔1.2〕
式中,
,
。
式〔1.1〕和式〔1.2〕构成了二维离散傅立叶变化对。
变量u和v是频率变量,x和y是空间变量。
常量
的位置并不重要,可以将它放在逆变化之前,还可以将常量分为两个相等的常数
,分别乘在正变化和逆变化式前。
在实际工程应用中分析幅度谱较多,习惯上也常把幅度谱称为频谱。
二维离散傅立叶变化〔DFT〕有着较强的物理意义,所以在信号分析与处理领域占有重要的地位。
DFT变化进展图象处理时有如下一些特点:
〔1〕直流成分为
。
〔2〕幅度谱
对称于原点。
〔3〕图象
平移后,幅度谱不发生变化,仅有相位发生了变化。
1.2傅里叶变换与反变换程序
A=imread('E:
\图图\yw.jpg');
I=rgb2gray(A);
C=fft2(double(I));%对图像进展傅立叶变换
B=fftshift(fft2(double(I)));%将直流分量移到频谱图的中心
D=ifft2(B);%傅立叶反变换
figure;%画图像原始图
imshow(I);
title('原图');
figure;
imshow(log(abs(B)+1),[]);
title('直接变换频谱图');
figure;%画直接变换频谱图
imshow(abs(D),[]);
title('反傅里叶变换图');
1.3傅里叶变换及反变换结果
图1.3傅里叶及反傅里叶变化图
2.小波变换
2.1原理及公式
2.1.1原理简介
信号分析是为了获得时间和频率之间的相互关系。
小波变换〔DWT〕是现代谱分析工具,他既能考察局部时域过程的频域特征,又能考察局部频域过程的时域特征,因此即使对于非平稳过程,处理起来也得心应手。
傅立叶变换提供了有关频率域的信息,但有关时间的局部化信息却根本丧失。
与傅立叶变换不同,小波变换能将图像变换为一系列小波系数,这些系数可以被高效压缩和存储,此外,小波的粗略边缘可以更好地表现图像,因为他消除了DCT压缩普遍具有的方块效应。
通过缩放母小波〔Motherwavelet〕的宽度来获得信号的频率特征,通过平移母小波来获得信号的时间信息。
对母小波的缩放和平移操作是为了计算小波系数,这些小波系数反映了小波和局部信号之间的相关程度。
2.1.2DWT对目标图片的处理及相关函数介绍
在Matlab中,二维离散小波变化对于图像的处理是通过函数的形式来进展的,主要的处理函数有如下几种:
表1常用的DWT函数
函数名
函数功能
dwt2
二维离散小波变换
wavedec2
二维信号的多层小波分解
idwt2
二维离散小波反变换
upcoef2
由多层小波分解重构近似分量或细节分量
wcodemat
窗体顶端
对矩阵进展量化编码窗体底端
dwt2函数的应用格式为[cA,cH,cV,cD]=dwt2(X,'wname');其意义为使用指定的小波基函数'wname'对二维信号X进展二维离散小波变换。
cA,cH,cV,cD分别为近似分.g(R@EE量、水平细节分量、垂直细节分量和对角细节分量。
wavedec2函数的格式为[C,S]=wavedec2(X,N,'wname');其意义为使用小波基函数'wname'对二维信号X进展N层分解。
idwt2函数格式为=idwt2(cA,cH,cV,cD,'wname');它的含义为由信号小波分解的近似信号cA和细节信号cH、cV、cD经小波反变换重构原信号X。
upcoef2函数格式为X=upcoef2(O,X,'wname',N,S);其中O对应分解信号的类型,即:
‘a’‘h’‘v’‘d’,X为原图像的矩阵信号,‘wname’为小波基函数,N为一整数,一般取1。
wcodemat函数格式为X=wcodemat(x,nb);它表示对矩阵x的量化编码,函数中nb作为x矩阵中绝对值最大的值,一般取192。
2.2小波变换程序
i=imread('E:
\图图\yw.jpg');
x=rgb2gray(i);%真彩色图像转化为灰度图像
[cA,cH,cV,cD]=dwt2(x,'db1');%对图像进展单层分解,小波为bd1
A=upcoef2('a',cA,'db1',1);
H=upcoef2('h',cH,'db1',1);
V=upcoef2('v',cV,'db1',1);
D=upcoef2('d',cD,'db1',1);%图像编码
figure
subplot(221);image(wcodemat(A,192));
title('近似细节系数');
subplot(222);image(wcodemat(H,192));
title('水平细节系数');
subplot(223);image(wcodemat(V,192));
title('垂直细节系数');
subplot(224);image(wcodemat(D,192));
title('对角细节系数');
d=idwt2(cA,cH,cV,cD,'db1');%对分解的细节系数执行单层重构,小波为db1
imshow(d,[]);
2.3小波变换结果
图2.3小波变换图
3.小波包变换
3.1原理及公式
由于正交小波变换只对信号的低频部门做进一步的分析,而对高频局部以及信号的细节局部不再继续分解,所以小波包变换能后很好的表征以低频信息为主要成分的信号,但它不能很好地结合表示包含大量细节信息〔细小细节或纹理〕的信号,如非平稳机械振动信号、遥感图像、地震信号和生物医学信号灯。
与之不同的是,小波包变换可以对高频局部提供更精细的分解,而且这种分解既无冗余,也业务疏漏,所以对包含大量中频、高频信息的信号能后进展更好的时频局部化分析。
小波包分解算法:
小波包重构:
信号小波包分析的根本实现步骤:
1〕选择适当的小波录波器,对给定的采样信号进展小波包变换,获得树形构造的小波包系数。
2〕选择信息代价函数,利用最正确小波包基选取算法选取最正确基。
3〕对最正确正交小波包基对应的小波包系数进展处理。
4〕对处理后的小波包系数采用小波包重构算法得到重构信号。
3.2小波包变换程序
x=imread('E:
\图图\yw.jpg');
imshow(x);
t=wpdec2(x,2,'db1');
plot(t);%划出四叉树构造
%对分解构造进展重建
rective=wprec2(t);
subplot(1,2,1),imshow(x),title('原始图像')
subplot(1,2,2),imshow(rective),title('重构后的图像');
3.3小波包变换结果
图3.3.1四叉树构造图
图3.3.2小波包变换图
4.余弦离散变换
4.1原理及公式
离散余弦变换,简称DCT,是一种实数域变换,其变换核为实数的余弦函数,计算速度较快,而且对于具有一阶马尔柯夫过程的随机信号,DCT十分接近于Karhunen-Loeve变换,也就是说它是一种最正确变换,很适于做图像压缩和随机信号处理。
对于数字信号X〔m,n〕,0≤m≤M,0≤n≤N,其二维DCT变换定义为
Y〔k,1〕=
其中,k=0,1,…,M-1;l=0,1,…,N-1
;
二维DCT变换具有可别离性,可以分解为双重的一维DCT,实现起来非常方便。
二维DCT反变换〔IDCT〕定义为
X〔m,n〕=
其中,
;
。
由上式可知,原始图像X〔m,n〕可表示为以Y〔k,l〕为权值的一系列函数
0≤m≤M-1,0,0≤n≤N-1
的加权组合,这组函数就是DCT基函数。
4.2余弦离散变换程序
A=imread('E:
\图图\yw.jpg');
I=rgb2gray(A);
DCT=dct2(I);%余弦变化
DCT(abs(DCT)<10)=0;%把变换矩阵中小于10的值置换为0,然后用idct2重构
IDCT=idct2(DCT);
subplot(2,2,1),imshow(G);title('灰度图像')
subplot(2,2,2),imshow(IDCT,[0255]);title('压缩图像')
subplot(2,2,3),imshow(DCT);title('DCT变换图像')
subplot(2,2,4),imshow(log(abs(DCT)),[]);title('二维变换谱');
4.3余弦离散变化结果
图4.3余弦离散变换图
5离散沃尔什、二维哈达玛变换
5.1原理及公式
5.1.1离散沃尔什变换
离散沃尔什变换和举证中只有+1和-1元素,要求N=
,
在N=
时,定义一维离散沃尔什变换为
常数项也可取
其中
是x的二进制便是第i位
如P=3,N=
=8’x=6时
二维离散沃尔什变换
沃尔什变换本质上将一个函数变换为取值为+1或-1的基向量构成的级数;类似于频率函数,但又不同于频率函数;以过零点数目替代频率的概念,称为序率。
5.1.2哈达玛变换
哈达玛变换本质上是一种特殊排序的沃尔什变换;其与沃尔什变换的区别是变换核矩阵行的次序不同;哈达玛变换最大优点在于变换核矩阵具有简单的递推关系,即高阶的变换矩阵可以用低阶转换矩阵构成。
一维离散哈达玛变换定义为:
其中N=
,x,u=0,1,2,…,N-1
说明:
在找资料的过程中资料说明哈达玛变换时沃尔什变换的完善,一般情况下只重点讲述了哈达玛在图像变换中的运用,并没有找到沃尔什图像变换的源代码。
因此此处只在matlab软件中运行了哈达玛程序。
5.2Walsh-Hadamard变换程序
A=imread('E:
\图图\yw.jpg');
a=rgb2gray(A);
H=hadamard(256);%哈达玛矩阵
a=double(a)/255;%数据类型转换
ha=H*a*H;%哈达玛变换
ha=ha/256;
imshow(ha);
title('图像的二维离散哈达玛变换');
5.3二维离散哈达玛变换结果
图5.3
6.小波变换图像压缩
6.1小波变换压缩简介
将小波分析映入图像压缩范畴也是一个重要手段,并有着它自己的特点。
小波变换压缩特点在于压缩比高、压缩速度快,压缩后能保持信号与图像的特征根本不变,且在传输过程中抗干扰等等。
一个图像做小波分解后,可得到一系列不同分辨率的子图像,对应的频率是不一样的。
高分辨率子图像上大局部点的数值都接近于0,分辨率越高越明显。
而对于一个图像来说,表现图像的最主要的局部是低频局部,所以压缩的方法是利用小波分解去掉图像高频局部二保存低频局部。
6.2小波压缩变换程序
A=imread('E:
\图图\yw.jpg');%调入图像
X=rgb2gray(A);
X=double(X)/255;%归一化处理
figure
subplot(2,2,1);
subimage(X);%显示图像
title('原图像')
colormap(pink);
disp('压缩前图像X的大小');whos('X');
[C,S]=wavedec2(X,2,'bior3.7');%对图像用‘bior3.7'小波进展2层小波分解
thr=20;%设置小波系数阈值
cal=appcoef2(C,S,'bior3.7',1);%提取小波分解构造中第1层的低频系数和高频系数
ch1=detcoef2('h',C,S,1);
cv1=detcoef2('v',C,S,1);
cd1=detcoef2('d',C,S,1);
a1=wrcoef2('a',C,S,'bior3.7',1);%分别对各频率成分进展重构
h1=wrcoef2('h',C,S,'bior3.7',1);
v1=wrcoef2('v',C,S,'bior3.7',1);
d1=wrcoef2('d',C,S,'bior3.7',1);
c1=[a1,h1;v1,d1];
%进展图像压缩处理,保存小波分解第1层低频信息,进展图像的压缩
%第1层的低频信息为ca2,显示第1层的低频信息
ca1=appcoef2(C,S,'bior3.7',1);
%首先对第1层信息进展量化编码
ca1=wcodemat(ca1,440,'mat',0);
ca1=0.5*ca1;%改变图像的高度
subplot(2,2,2);
image(ca1);%显示第1次压缩的图像
colormap(pink);
title('第一次压缩图像')
disp('第一次压缩图像的大小');whos('ca1');
%保存小波分解第2层低频信息,进展图像的压缩,此时压缩比更大
%第2层的低频信息为ca2,显示第2层的低频信息
ca2=appcoef2(C,S,'bior3.7',2);
%首先对第2层信息进展量化编码
ca2=wcodemat(ca2,440,'mat',0);
%改变图像的高度
ca2=0.5*ca2;
%显示第二次压缩图像
subplot(2,2,3);
image(ca2);
colormap(pink);
title('第二次压缩图像')
disp('第二次压缩图像的大小');whos('ca2');
6.3小波压缩结果
图6.3.2小波压缩图像
图6.3.2压缩图像规格
6.4压缩前后图像比较
可看出原图分辨率为256*256,而压缩一次后图像分辨率为135*135,二次压缩后图像分辨率为75*75。
第一次压缩是我们对原始图像中小波分解第一层低频信息,此时压缩效果好,压缩比较小。
第二次压缩时提取第一层分解低频局部的低频局部,其压缩比较大。
7.离散余弦变换图像压缩
7.1原理简介
任何连续的事物堆成函数的傅里叶变换中只含有余弦项,因此余弦变换与傅里叶变换一样,有明确的物理意义。
DCT实现将整体图像分成N*N像素块,然后对N*N像素块逐一进展DCT变换。
由于大多数的图像的高频分量较小,相应于高频成分的系数经常为零,加上人眼对高频成分的失真不太敏感,所以可以用更粗的量化。
因此传送变换系数所用的数码率要大大小于传送图像像素所用的数码率。
到达接收端后再通过反离散余弦变换回到样值,虽然会有一定的失真,但是能根本承受。
N代表像素数,一般N=8,8*8的二位数据块经DCT后变成8*8个变换系数,这些系数都有着明