图像处理通信工程应用技术课程设计.docx
《图像处理通信工程应用技术课程设计.docx》由会员分享,可在线阅读,更多相关《图像处理通信工程应用技术课程设计.docx(23页珍藏版)》请在冰豆网上搜索。
图像处理通信工程应用技术课程设计
课程任务设计书
学生姓名:
陈亮专业班级:
通信1001班
指导教师:
魏洪涛工作单位:
信息工程学院
题目:
图像处理
课程设计目的:
编程实现一幅图像的平移、镜像、旋转、缩小和放大。
课程设计内容和要求:
给出所用算法的理论依据和必要的推导过程;给出原始图像和处理后的图像。
初始条件:
在matlab平台上实现功能
时间安排:
序号
设计内容
所用时间
1
根据设计任务,分析原理,确定方案
2天
2
编写程序,测试分析
4天
3
撰写课程设计报告
1天
合计
1周
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
目录
摘要I
AbstractII
1MATLAB简介1
1.1MATLAB说明1
1.2MATLAB的语言特点1
1.3MATLAB系统构成1
2.1整体原理3
2.2各部分原理3
2.2.1平移变换3
2.2.2镜像翻转3
1.2.3旋转变换4
1.2.4缩小和放大4
3.1原始图像选择读取6
3.2平移变换7
3.3镜像翻转7
3.4旋转变换9
3.5缩小和放大11
4总结与分析15
5心得体会16
6参考文献17
附录18
摘要
MATLAB自产生之日起就具有方便的数据可视化功能,以将向量和矩阵用图形表现出来,并且可以对图形进行标注和打印。
高层次的作图包括二维和三维的可视化、图象处理、动画和表达式作图。
可用于科学计算和工程绘图。
新版本的MATLAB对整个图形处理功能作了很大的改进和完善,使它不仅在一般数据可视化软件都具有的功能(例如二维曲线和三维曲面的绘制和处理等)方面更加完善,而且对于一些其他软件所没有的功能(例如图形的光照处理、色度处理以及四维数据的表现等),MATLAB同样表现了出色的处理能力。
同时对一些特殊的可视化要求,例如图形对话等,MATLAB也有相应的功能函数,保证了用户不同层次的要求。
另外新版本的MATLAB还着重在图形用户界面(GUI)的制作上作了很大的改善,对这方面有特殊要求的用户也可以得到满足。
关键字:
matlab图像处理
Abstract
SincethedateofMATLABproducedhasconvenientdatavisualizationfunction,tovectorandmatrixwithgraphicsdemonstrated,andcanbegraphtomarkandprint.Highlevelofconstructionincluding2dand3dvisualization,imageprocessing,animationandexpressionmapping.Canbeusedinscientificcomputingandengineeringdrawing.ThenewversionoftheMATLABtothegraphicsfunctionsmadealotofimprovementandperfect,makeitnotonlyinthegeneraldatavisualizationsoftwarewithafunction(suchas2dand3dcurveofsurfacerenderingandprocessing,etc)tobemoreperfect,andforsomeothersoftwarenotfunction(suchasgraphicallighttreatment,chromaticityprocessingandfourdimensionaldataperformance,etc.),MATLABalsoshowedgoodprocessingcapacity.Atthesametimeforsomespecialvisualrequirements,suchasgraphicsdialogue,MATLABalsohasthecorrespondingfunctionfunctiontoensurethattheuserrequirementsofdifferentlevels.InadditionthenewversionoftheMATLABismainlyinthegraphicaluserinterface(GUI)fortheproductionofthegreatimprovement,inthisrespecthavespecialrequirementsofuserscanalsosatisfied.
Keywords:
matlabImageprocessing
1MATLAB简介
1.1MATLAB说明
MATLAB是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。
它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
MATLAB和Mathematica、Maple并称为三大数学软件。
它在数学类科技应用软件中在数值计算方面首屈一指。
MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
1.2MATLAB的语言特点
(1)语言简洁紧凑,使用方便灵活,库函数极其丰富。
运算符丰富。
(2)MATLAB既具有结构化的控制语句(如for循环,while循环,break语句和if语句),又有面向对象编程的特性。
(3)程序限制不严格,程序设计自由度大。
(4)MATLAB的图形功能强大。
(5)MATLAB的缺点是,它和其他高级程序相比,程序的执行速度较慢。
(6)由于MATLAB的程序不用编译等预处理,也不生成可执行文件,程序为解释执行,所以速度较慢。
1.3MATLAB系统构成
主要由以下五部分构成:
(1)MATLAB语言
(2)MATLAB工作环境
(3)图形处理
(4)MATLAB数学函数
(5)MATLAB应用编程人员接口(API)
2基本原理
2.1整体原理
几何变换是图像处理和图像分析的重要内容之一。
通过几何变换,可以根据应用的需要使原图像产生大小、形状和位置等各方面的变化。
也就是说,几何变换可以改变像素点所在的几何位置以及图像中各物体之间的空间位置关系,这种运算可以被看成是将各物体在图像内移动,特别是图像具有一定的规律性时,一个图像可以由另一个图像通过做几何变换来产生。
几何变换可以分为图像的位置变换(平移、镜像、旋转)、形状变换(放大、缩小和剪切)以及图像的复合变换。
图像几何变换的一般表达式为:
其中(x,y)表示像素点的坐标位置,f(x,y)表示图像像素点(x,y)的灰度值.图像几何变换就是建立一幅图像与其变换后的图像中所有各点之间的映射关系。
2.2各部分原理
2.2.1平移变换
若将像素点(x,y)平移到(x+Δx,y+Δy),则图像平移变换函数的矩阵表示式为:
2.2.2镜像翻转
图像的镜像变换是与人们日常生活密切相关的一种变换。
图像的镜像变换不改变图像的形状。
图像的镜像变换包括水平镜像、垂直镜像和对角镜像。
图像的水平镜像变换的矩阵表示形式为:
图像的垂直镜像变换的矩阵表示形式为:
图像的对角镜像变换的矩阵表示形式为:
1.2.3旋转变换
原始图像的任意点A(x0,y0)经旋转β角度后到新的位置A(x,y),则旋转变换函数的矩阵表示式为:
对图像进行旋转变换时应注意以下几点:
(1)为了避免图像旋转之后可能产生的信息丢失,可以先进行平移,然后进行图像旋转。
(2)图像旋转之后,可能会出现一些空白点,需对这些空白点进行灰度级的插值处理,否则会影响旋转之后的图像质量。
1.2.4缩小和放大
若图像坐标(x,y)缩放(fx,fy)倍,则缩放变换函数的矩阵表示为:
如果fx=fy,即在x轴方向和y轴方向缩放的比率相同,称为图像的全比例缩放;如果fx≠fy,图像的比例缩放会改变原始图像像素间的相对位置,产生几何畸变。
图像放大有三种方法,常用的插值算法有三种:
最近邻插值、双线性插值、立方卷积插值,其中使用立方卷积插值达到的效果是最佳的。
最近邻插值算法最简单的插值法是最近邻插值法,也叫零阶插值法。
即选择离它所映射到的位置最近的输入像素的灰度值为插值结果。
对二维图像,是取待测样点周围4个相邻像素点中距离最近1个相邻点的灰度值作为待测样点的像素值。
若几何变换后输出图像上坐标为(x′,y′)的对应位置为(m,n)
双线性插值算法双线性插值又叫一阶插值法,它要经过三次插值才能获得最终结果,是对最近邻插值法的一种改进,先对两水平方向进行一阶线性插值,然后再在垂直方向上进行一阶线性插值。
立方卷积插值算法立方卷积插值又叫双三次插值,是对双线性插值的改进,是一种较为复杂的插值方式,它不仅考虑到周围四个直接相邻像素点灰度值的影响,还考虑到它们灰度值变化率的影响。
3编程与实现
3.1原始图像选择读取
MATLAB为用户提供了专门的函数以从图像格式的文件中读写图像数据。
采用的是imread函数来实现图像文件的读取操作,采用的格式如下:
A=imread(’filename.png’)
该语句用于读取字符串“filename”对应的灰度图像或彩色图像,“png”指定了文件的格式。
采用imshow函数进行图像的显示,采用的格式如下:
A=imread(‘filename.png’);
imshow(A);
当这种显示方式要求被显示的图像要么在当前目录下或MATLAB的目录下。
图像读入与显示和变化的源代码如下:
x=imread('shu.png');
imshow(x);
title('原始图像')
程序运行结果如下图3.1所示:
图3.1原始图像
3.2平移变换
平移变换主要通过move函数实现
将一幅图像向右下方移动,空白的地方用黑色填充。
A=double(A);
A_move=zeros(size(A));
H=size(A);
A_x=30;
A_y=30;
A_move(A_x+1:
H
(1),A_y+1:
H
(2),1:
H(3))=A(1:
H
(1)-A_x,1:
H
(2)-A_y,1:
H(3));
subplot(122);imshow(uint8(A_move));
title('平移后图像')
运行程序,效果如图3.2所示。
图3.2平移后的图像
3.3镜像翻转
镜像翻转主要采用fliplr、flipud两种函数,对角翻转时两者同时应用即可
用法:
fliplr(X)
功能:
matlab中的fliplr函数实现矩阵的左右翻转。
fliplr(X)使矩阵X沿垂直轴左右翻转。
相关函数:
flipud函数可以实现矩阵的上下翻转。
备注:
matlab中提供了许多对矩阵操作的函数,可以实现矩阵的三角矩阵的提取(triu、tril)、矩阵的翻转(flipud、fliplr、Flipdim)和旋转(rot90)等各种操作。
用法:
flipud(X)
功能:
matlab中的flipud函数实现矩阵的上下翻转。
flipud(X)实现了矩阵X的上下翻转。
相关函数:
fliplr函数实现矩阵的左右翻转。
备注:
matlab中提供了许多对矩阵操作的函数,可以实现矩阵的三角矩阵的提取(triu、tril)、矩阵的翻转(flipud、fliplr、Flipdim)和旋转(rot90)等各种操作。
对图像进行不同类型的镜像变换:
I=imread('shu.png');
figure
(1)
subplot(221);imshow(uint8(I));
title('原始图像')
I=double(I);
h=size(I);
I_fliplr(1:
h
(1),1:
h
(2),1:
h(3))=I(1:
h
(1),h
(2):
-1:
1,1:
h(3));%水平镜像变换
I1=uint8(I_fliplr);
subplot(222);imshow(I1);
title('水平镜像变换')
I_flipud(1:
h
(1),1:
h
(2),1:
h(3))=I(h
(1):
-1:
1,1:
h
(2),1:
h(3));%垂直镜像变换
I2=uint8(I_flipud);
subplot(223);imshow(I2);
title('垂直镜像变换')
I_fliplr_flipud(1:
h
(1),1:
h
(2),1:
h(3))=I(h
(1):
-1:
1,h
(2):
-1:
1,1:
h(3));%对角镜像变换
I3=uint8(I_fliplr_flipud);
subplot(224);imshow(I3);
title('对角镜像变换')
运行程序,效果如图3.3所示。
图3.3镜像变换图像
3.4旋转变换
旋转变换主要采用imrotate函数
函数功能:
对图像进行旋转操作。
在matlab命令窗口中键入help或docimrotate或lookforimrotate可以获得该函数帮助信息。
调用格式:
B=imrotate(A,angle)
将图像A(图像的数据矩阵)绕图像的中心点旋转angle度,正数表示逆时针旋转,负数表示顺时针旋转。
返回旋转后的图像矩阵。
以这种格式调用该函数,该函数默认采用最近邻线性插值(Nearest-neighborinterpolation)。
旋转后的图像超出的部分填充0(黑色)。
B=imrotate(A,angle,method)
使用method参数可以改变插值算法,method参数可以为下面这三个值:
{'nearest'}:
最邻近线性插值(Nearest-neighborinterpolation)
'bilinear':
双线性插值(Bilinearinterpolation)
'bicubic':
双三次插值(或叫做双立方插值)(Bicubicinterpolation)
B=imrotate(A,angle,method,bbox)
bbox参数用于指定输出图像属性:
'crop':
通过对旋转后的图像B进行裁剪,保持旋转后输出图像B的尺寸和输入图像A的尺寸一样。
{'loose'}:
使输出图像足够大,以保证源图像旋转后超出图像尺寸范围的像素值没有丢失。
一般上这种格式产生的图像的尺寸都要大于源图像的尺寸。
将图像逆时针旋转30度。
I=imread('shu.png');
figure;
subplot(121);imshow(I);
title('原始图像')
I1=imrotate(I,30,'crop');
subplot(122);imshow(I1);
title('逆时针旋转30度')
运行程序,效果如图3.4所示。
图3.4旋转变换图像
3.5缩小和放大
图像的缩放操作主要采用imresize函数操作。
函数功能
该函数用于对图像做缩放处理。
在matlab的命令窗口中输入docimresize或者helpimresize即可获得该函数的帮助信息。
调用格式
B=imresize(A,scale)
返回的图像B的长宽是图像A的长宽的m倍。
即缩放图像。
m大于1,则放大图像;m小于1,缩小图像。
B=imresize(A,[numrowsnumcols])
numrows和numcols分别指定目标图像的高度和宽度。
显而易见,由于这种格式允许图像缩放后长宽比例和源图像长宽比例不相同,因此所产生的图像有可能发生畸变。
[Ynewmap]=imresize(X,map,scale)
[...]=imresize(..., method)
method参数用于指定在改变图像尺寸时所使用的算法,可以为一下几种:
'nearest':
这个参数也是默认的,即改变图像尺寸时采用最近邻插值算法;
'bilinear':
采用双线性插值算法;
'bicubic':
采用双三次插值算法;
[...]=imresize(..., parameter, value,...)
使用最近邻域法将图像放大1.5倍和缩小0.5倍。
I=imread('shu.png');%I为原始图像
figure;
subplot(131);imshow(I);%显示原始图像
I=double(I);
I_en=imresize(I,4,'nearest');%最近邻法标志函数nearest扩大1.5倍
subplot(132);imshow(uint8(I_en));%显示扩大1.5倍后的图像
I_re=imresize(I,0.5,'nearest');%缩小两倍
subplot(133);imshow(uint8(I_re));%显示缩小0.5倍后的图像
运行程序,效果如图3.5、3.6、3.7所示
图3.5原始图像图3.6缩小0.5倍图像
图3.7放大1.5倍图像
使用不同插值方法将图像缩小为原图像的0.2倍,再使用不同的方法放大5倍。
I=imread('shu.p');
J=imresize(I,0.2);%图像缩小为0.2
J2=imresize(J,5,'nearest');%图像放大,最近邻插值法
J3=imresize(J,5,'bilinear');%图像放大,双线性插值法
J4=imresize(J,5,'bicubic');%图像放大,双立方插值法
subplot(2,2,1);imshow(I);
title('原始图像');
subplot(2,2,2);imshow(J2);
title('最近邻插值法');
subplot(2,2,3);imshow(J3);
title('双线性插值法');
subplot(2,2,4);imshow(J4);
title('双立方插值法');
运行程序,效果如图3.8所示。
图3.8不同插值放大图像
4总结与分析
Matlab作为一个极其强大的计算平台,拥有许多优势,在对图像进行处理时,可以看做是对于矩阵的运算,通过不同的函数运算,可以达到不同效果。
本次设计主要对于图像进行四种变换,分别是平移、镜像、旋转、缩放。
在平移操作中,可以通过move函数更改每个像素的点位置,通过手动更改(x,y)参数控制水平竖直方向的移动距离。
在镜像试验中,主要应用fliplr、flipud两种函数进行反转,其本质仍然是矩阵的翻转。
在对角线翻转时,可以看做先进行水平方向的翻转在进行水平防线的翻转。
翻转变换操作同样是对像素的(x,y)进行运算和重排布,以达到整体翻转效果。
图像的缩放变换通过全比例缩放对像素进行舍弃或补充性运算,放大过程中填充的像素均是由附近像素灰度值等信息计算出来的。
值得一提的是,旋转和缩放变换中,默认算法是最邻近差值法,也就是令变换后像素的灰度值等于距它最近的输入像素的灰度值,我在缩放变换中加入了最邻近插值法和双线性插值法(其核心思想是在两个方向分别进行一次线性插值,混合的比例与离像素的距离成反比)以及双立方插值法(在每个维度上对于连续的4个点进行插值)的比较,比较的结果是最近邻插值法锯齿感明显,色彩过渡也存在突变。
双线性插值法则优于最近邻插值法,双立方插值法不仅考虑了周围四个直接相邻像素点灰度值的影响,还考虑到它们灰度值变化率的影响。
因此克服了前两种方法的不足之处,能够产生比双线性插值更为平滑的边缘,计算精度很高,处理后的图像像质损失最少,效果是最佳的。
在进行图像缩放处理时,应根据实际情况对三种算法做出选择,既要考虑时间方面的可行性,又要对变换后图像质量进行考虑,这样才能达到较为理想的结果。
5心得体会
通过此次的课程设计,感触颇深,因为让我认识到了MATLAB的强大功能,同时也对图像处理的认识有了进一步的加深。
在此次课程设计中我遇到了前所未有的难题。
在此我非常感谢曾经教育过我们的老师,是他们在平时教学中帮助我培养了良好的学习习惯和查阅新知识,快速理解运用新知识的能力。
经过一段时间的查阅和向老师的请教,我弄清楚了此时课程设计所需的全部原理知识。
在编程的过程中,我也遇到了很多困难,所幸的是图书馆有相关书籍,网络上有学长学姐们做过的仿真作为参考,有老师和同学们帮助我,于是我一步步实现了各个步骤的相关编程,并且在最后得以综合整理,完成了此次的仿真任务。
但是不得不说,此时课程设计由于时间和我的知识储备的问题,仍然有一些不完备的地方:
在整个过程中虽然结果较为直观,但我还有过将程序加上操作界面或者将画面失真度量化等等想法,如果时间允许或有懂得更多的同学协助,应该可以做得更好。
尽管此时课程设计仍然有很多不足,但是我在这个过程中加深了对各方面理论知识的了解,对我以后的学习工作产生了一定影响,十分感谢此次课程设计。
6参考文献
[1]高展宏,徐文波.基于MATLAB的数字图像处理案例教程.北京:
清华大学
版社,2011
[2]贺兴华等.MATLAB7.x图像处理.北京:
人民邮电出版社,2006
[3]陈杰.MATLAB宝典.北京:
电子工业出版社,2007.
[4]张德丰.MATLAB数值分析与应用.北京:
国防工业出版社,2009.
[5]冈萨雷斯.温茨著.数字图像处理.2版.阮秋琦,等译.北京:
电子工业出版
社,2002.
[6]汪晓银,邹庭荣.数学软件与数学实验.武汉:
华中农业大学教务处,2007
附录
平移
A=imread('shu.png');
figure;
subplot(121);imshow(A);
title('原始图像')
A=double(A);
A_move=zeros(size(A));
H=size(A);
A_x=30;
A_y=30;
A_move(A_x+1:
H
(1),A_y+1:
H
(2),1:
H(3))=A(1:
H
(1)-A_x,1:
H
(2)-A_y,1:
H(3));
subplot(122);imshow(uint8(A_move));
title('平移后图像')
镜像
I=imread('shu.png');
figure
(1)
subplot(221);imshow(uint8(I));
title('原始图像'