基于余弦变换的图像压缩副本Word格式.docx
《基于余弦变换的图像压缩副本Word格式.docx》由会员分享,可在线阅读,更多相关《基于余弦变换的图像压缩副本Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
MATLAB;
图像压缩
Abstract
DiscretecosinetransformisaFouriertransformmathematicaloperationcloselyrelated.IntheFourierseriesexpansion,ifthefunctionisexpandedevenfunctionisreal,thentheFourierseriescontainsonlycosineterms,thenitcanbederiveddiscretecosinetransform.DCTisrelativelygoodimagecompressionalgorithm,ithasmanyadvantages.DCTisanorthogonaltransformation,itcanbe8*8imagespaceexpressionconvertedtofrequencydomain,simplyuseasmallnumberofdatapointsrepresentinganimage;
DCTcoefficientsgeneratedcaneasilybequantified,andthereforecanobtaingoodcompressionblock;
DCTalgorithmperformanceisverygood,ithasafastalgorithm,suchastheuseoffastFouriertransformoperationcanbeperformedefficiently,soitisinthehardwareandsoftwareareeasytoimplement;
AndDCTalgorithmissymmetrical,sotheuseofinverseDCTalgorithmcanbeusedtodecompresstheimage.MATLABprovideseffectiveDCToperationfunctions,makingiteasierandefficientimageprocessing.
Keywords:
Discretecosinetransform;
MATLAB;
ImageCompression
前言
本文解决了基于DCT的图像压缩问题。
全文共4章。
第1章介绍了问题背景。
第2章主要介绍了图像压缩的实现步骤。
第3章主要介绍了程序的详细设计,给出主要功能函数的设计,以及测试结果和分析,还讨论了程序的优缺点。
第4章是本次课程设计的总结。
总结了本次课程设计的目的和意义,以及测试中发现的一些问题,和有待改进的地方。
重点谈到了我在本次毕业设计中的收获和感想,还有它对于我整个本科阶段的意义。
全文的最后是致谢、参考文献。
第1章课题背景
1.1背景
在信息世界迅猛发展的今天,图像传输已成为一项重要内容,而传输信息量的大小是影响传输速度的重要因素之一。
要想提高通信速度,一个必要的手段就是图像的压缩编码技术,减少传输的数据量。
大数据量的图像信息会给存储器的存储容量,通信干线信道的带宽,以及计算机的处理速度增加极大的压力。
单纯靠增加存储器容量,提高信道带宽以及计算机的处理速度等方法来解决这个问题是不现实的,这时就要考虑压缩。
于是,对图像信息的压缩成为一个不可或缺的环节。
图像压缩是关于用最少的数据量表示尽可能多的原图像信息的一个过程,是通过去除一个或三个基本的数据冗余来实现的。
压缩图像的方式有很多种,其中离散余弦变换(DCT)是目前比较好的图像变换,它有很多优点。
DCT是正交变换,它可以8x8图像空间表达式转换为频率域,只需要用少量的数据点表示图像;
DCT产生的系数很容易被量化,因此能获得好的块压缩。
所以DCT通常会用来对图像进行压缩,如图像文件标准JPEG便是基于DCT的。
MATLAB拥有强大的图像处理工具箱,使用它将使复杂的图像变换变得简便快捷。
第2章实现步骤
2.1二维离散余弦变换(DCT)原理
DCT编码属于正交变换编码方式。
用于去除图像数据的空间冗余。
在变换编码系统中,如果正变换采用DCT变换就称为DCT变换编码系统。
DCT用于把一幅图像映射为一组变换系数,然后对系数进行量化和编码。
对于大多数的正常图像来说,多数系数具有较小的数值且可以被粗略地量化(或者完全抛弃),而产生的图像失真较小。
离散余弦变换的变换核为余弦函数,计算速度快,有利于图像压缩和其他处理。
DTC可表示为下式:
式中,
2.2基于DCT图像压缩程序流程
用DCT对灰度图像进行图像压缩流程包括灰度图像的提取,图像压缩,原图像和压缩后图像的对比浏览三个步骤。
(1)灰度图像的提取:
由于大多数的图像都是RGB真彩图像,而二维DCT变换只能适用于二维数组即灰度图像,故需要使普通的彩色图像变成灰度图像以便压缩测试。
(2)图像压缩:
压缩图像的过程通常第一步是把输入图像细分为不相重叠的8*8像素块。
随后按从左到右、从上到下的顺序用二维离散余弦变换处理这些像素块,用事先规定的掩膜来压缩DCT系数,用压缩后的DCT系数重构图像即DCT逆变换便得到压缩后的图像。
(3)原图像和压缩后图像的对比浏览:
为了判断图像是否压缩成功,需要将原图像与压缩后图像进行比较,若压缩后图像显得更加模糊则说明压缩成功。
2.3MATLAB的相关函数介绍
MATLAB提供了强大的图像处理工具箱,现在稍微介绍一下本文用到的相关函数。
imread:
它能够通过文件路径名读取图片文件并返回二维数组
rgb2gray能将一彩色图像变成灰度图像
imshow能够将二维图像显示出来
dctmtx能够返回DCT变换矩阵
blkproc能够对像素块进行操作,比如blkproc(I,[88],'
P1*x*P2'
T,T'
)是对8*8像素块进行T*I*T’变换
第3章详细设计与实现
3.1主界面设计
使用MATLABR2012a可以通过GUIDE创建GUI代替全面的手工编程,可以简单的添加控件。
如上图,在左边工具栏中选择几个控件拖到工作区间内,修改控件句柄,浏览按钮可以完成浏览电脑中的文件功能,exittext控件用来显示打开的文件的路径,axes控件用来显示打开的图片,下面的功能按钮能够提取灰度图像,保存图片和压缩图像的功能,于是主界面设计完成。
3.2测试结果
测试结果:
程序运行初始界面如下:
图3-2初始界面
加载图像后,如下图:
图3-3加载图片
提取灰度图像:
图3-4灰度图像
压缩后:
上图是局部放大图,能看见压缩后图像稍微变得模糊,说明压缩成功。
3.3程序部分源代码
由于程序界面是借助GUIDE来实现的,所以无法找到自动生成的界面代码,只能放出人工添加的源代码即M文件中的代码:
functionvarargout=test(varargin)
gui_Singleton=1;
gui_State=struct('
gui_Name'
mfilename,...
'
gui_Singleton'
gui_Singleton,...
gui_OpeningFcn'
@test_OpeningFcn,...
gui_OutputFcn'
@test_OutputFcn,...
gui_LayoutFcn'
[],...
gui_Callback'
[]);
ifnargin&
&
ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
end
ifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
functiontest_OpeningFcn(hObject,eventdata,handles,varargin)
handles.output=hObject;
guidata(hObject,handles);
functionvarargout=test_OutputFcn(hObject,eventdata,handles)
varargout{1}=handles.output;
functionpathText_CreateFcn(hObject,eventdata,handles)
ifispc&
isequal(get(hObject,'
BackgroundColor'
),get(0,'
defaultUicontrolBackgroundColor'
))
set(hObject,'
'
white'
);
functionpushBtn_Callback(hObject,eventdata,handles)
[filename,pathname]=uigetfile({'
*.*'
AllFiles(*.*)'
;
},'
选择文件'
ifisequal([filename,pathname],[0,0])
return
else
%读取图片
pic=fullfile(pathname,filename);
set(handles.pathText,'
string'
[pathname,filename])
a=imread(pic);
imshow(a);
functionaxesPic_CreateFcn(hObject,eventdata,handles)
set(hObject,'
xTick'
[]);
ytick'
box'
on'
functiongslpushBtn_Callback(hObject,eventdata,handles)
path=get(handles.pathText,'
b=imread(path);
globalc;
c=rgb2gray(b);
figure;
set(gcf,'
NumberTitle'
off'
Name'
原始图像'
imshow(c);
functionsavepushBtn_Callback(hObject,eventdata,handles)
[filenamepathname]=uiputfile({'
*.bmp'
BMPFile(*.bmp*)'
保存'
path=[pathname,filename];
imwrite(c,path,'
bmp'
functioncompress_Callback(hObject,eventdata,handles)
T=dctmtx(8);
%离散余弦变换矩阵,处理后返回一个8×
8阶DCT变换矩阵
I1=im2double(c);
%图像存储类型转换,将图像变换成双精度格式
B=blkproc(I1,[88],'
%对原图像进行DCT变换,每个不同8×
8块应用矩阵式′P1*x*P2′进行处理,必要时补0,其中P1=T,P2=T′
m=[11110000
11100000
11000000
10000000
00000000
00000000];
%用来压缩DCT的系数,选取10个DCT系数重构图像
B2=blkproc(B,[88],'
P1.*x'
m);
%只保留DCT变换的10个系数,数据压缩,丢弃右下角高频数据
c=blkproc(B2,[88],'
T'
T);
%进行DCT反变换,得到压缩后的图像
figure;
压缩后图像'
第4章总结
这次课程设计程序虽稍有粗糙但还是按要求实现了图像的压缩,从中我也深刻了解到进行程序设计这方面工作的艰辛,也让我对使用MATLAB进行图像处理技术有了大体上的了解。
这次设计过程中,最困难的地方是MATLAB中借助GUIDE进行界面化的程序设计。
之前虽有接触过手工编程的界面化程序设计,但实际操作起来异常困难,MATLAB语言的运用也是非常困难。
为了完善程序而上网搜索资料图书馆查阅资料这一点也使我倍感艰辛,当程序测试一次次失败后的失望与最后测试成功都铭记于心。
关于程序的几点不足,诸如保存文件时会出现BUG,只能通过观察压缩后的图像稍有模糊来判断压缩成功而无法通过直观的数据来判断等等还有待改进。
致谢
这一次课程设计,使我有机会将课堂上学习的知识与实际应用结合起来,还有MATLAB编程的经验使我对这些知识有了进一步的理解和认识。
我要感谢付老师给了我们这次机会,将所学知识很好的联系贯通起来,深刻体会知识的应用。
我还要感谢在课程设计中,给予我帮助的同学以及CSDN等各大网络IT论坛上的朋友们,许多难点的解决与他们的帮助直接相关。
我还要感谢在参考文献中列出的各位著者和编者,正是这些专家教授所写的书,给了我太多太多的帮助。
其中有些参考书是我们的教材,它们成为我钻研学习的好伙伴。
这份课程设计,让我尝尽了酸甜苦辣,更让我受益匪浅。
参考文献
[1]田丽华.编码理论(第二版)[M].西安:
西安电子科技大学出版社,2007.
[2]阮秋琦.数字图像处理(第2版):
电子工业出版社,2007.
[3]傅祖芸.信息论(基础理论与应用)(第2版)[M].北京:
电子工业出版社.2007.
[4]杨枝灵,王开等.VisualC++数字图像获取处理及实践应用[M].北京:
人民邮电出版社.2003.