MATLAB实现图像的平移缩放和旋转_第1页
MATLAB实现图像的平移缩放和旋转_第2页
MATLAB实现图像的平移缩放和旋转_第3页
MATLAB实现图像的平移缩放和旋转_第4页
MATLAB实现图像的平移缩放和旋转_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 数字图像处理课 程 设 计 题 目 图像的几何变换重建 系 (部) 信息工程系 班 级 姓 名 学 号 指导教师 2013 年 12 月 16 日至 12 月 27 日 共 2 周2013年 12 月 27 日数字图像处理 课程设计任务书一、设计题目、内容及要求设计题目:图像的几何变换重建1、设计内容:(1)能够读取和存储图像。(2)实现图像的平移、缩放、旋转几何变换。(3)分别采用最近邻插值和双线性插值技术进行图像重建。(4)编写代码实现上述功能。2、设计要求:(1)利用数字图像处理技术,以MATLAB为平台,建立一个实现设计主题的简易处理系统。(2)能显示输入图像、输出图像。(3)不允许

2、直接调用MATLAB工具箱中的几何变换函数。(4)程序代码要有注释说明,调用MATLAB函数要清楚并理解函数的功能、使用范围,在设计说明书中要写清楚函数的功能和参数意义。(5)完成设计说明书一份。二、设计原始资料 MATLAB软件、原始图像。三、要求的设计成果(课程设计说明书、设计实物、图纸等)设计成果为课程设计说明书和程序源代码。每人提交电子版和纸质打印版的设计说明书各一份,电子版以“班级_学号”为名建立文件夹,其中存放电子版课程设计报告和程序源代码。以班为单位刻录光盘一张。四、进程安排第一周:周1 布置设计任务,学生查阅相关资料。 周2熟悉编程语言、确定设计方案。周3-5程序设计、编写代码

3、、上机调试。第二周:周1-2继续编写代码、调试程序,修改并完善设计。周2下午验收程序。周3撰写设计说明书。周4上午提交设计说明书,课程设计答辩。五、主要参考资料1 章毓晋.图像处理和分析教程北京.人们邮电出版社,20092 龚声蓉.数字图像处理与分析. 北京.清华大学出版社,20063 余成波.数字图像处理及MATLAB实现.重庆.重庆大学出版社,20034 姚敏.数字图像处理. 北京 .机械工业出版社,20065 李显宏. MATLAB7.x界面设计与编程技巧.北京. 电子工业出版社,20066 Kenneth R.Castleman著,朱志刚等译,数字图像处理,电子工业出版社,2006指导

4、教师(签名):教研室主任(签名):课程设计成绩评定表 出勤 情况 出勤天数 缺勤天数成绩评定出勤情况及设计过程表现(20分)课设答辩(30分)说明书(20分)设计成果(30分)总成绩(100分)提问(答辩)问题情况综合评定 指导教师签名: 年 月 日目 录1 引言11.1课程设计的目的11.2课程设计的任务21.3课程设计的要求21.4开发工具22设计内容42.1设计内容42.2 系统框图43 设计方案53.1功能模块的划分53.2算法描述53.3实现主要功能的原理和方法83.3.1最近邻域插值法83.3.2双线性插值法84功能模块的具体实现104.1 模块功能104.2流程图114.3程序清

5、单及各模块的实现效果图114.4 系统仿真与调试215 总结与体会22参考文献23附录24 1 引言2设计内容2.1设计内容我选取的是图像的几何变换,设计内容如下,(1)能够读取和存储图像。(2)实现图像的平移、缩放、旋转几何变换。(3)分别采用最近邻插值和双线性插值技术进行图像重建。(4)编写代码实现上述功能。图像几何处理系统2.2 系统框图缩放变换旋转变换平移变换存储双线性插值旋转最邻近插值旋转最邻近插值缩放双线性插值缩放存储存储存储存储图2-1系统框图本次课设所做的图像几何变换包括平移变换、缩放变换和旋转变换。缩放变换和旋转变换均用双线性插值变换和最近邻插值变换两种方法来做,对图像进行处

6、理后再存储。3 设计方案3.1功能模块的划分本次设计整体分为四大模块:原图、平移、缩放和旋转。其中缩放和旋转又分别有双线性插值和最近邻插值两模块。3.2算法描述图像比例缩放是指将给定的图像在x轴方向按比例缩放fx倍,在y轴按比例缩放fy倍,从而获得一幅新的图像。如果fx=fy,即在x轴方向和y轴方向缩放的比率相同,称这样的比例缩放为图像的全比例缩放。如果fxfy,图像的比例缩放会改变原始图象的像素间的相对位置,产生几何畸变。设原图像中的点P0(x0,y0)比例缩放后,在新图像中的对应点为P(x,y),则比例缩放前后两点P0(x0,y0)、P(x,y)之间的关系用矩阵形式可以表示为 (3-1)其

7、逆运算为 (3-2)即 (3-3)比例缩放所产生的图像中的像素可能在原图像中找不到相应得像素点,这样就必须进行插值处理。下面首先讨论图像的比例缩小。最简单的比例缩小时当fx=fy=0.5时,图像被缩到一半大小,此时缩小后图像中的(0,0)像素对应于原图像中的(0,0)像素;(0,1)像素对应于原图像中的(0,2)像素;(1,0)像素对应于原图像中的(2,0)像素,以此类推。图像缩小之后,因为承载的数据量小了,所以画布可相应缩小。此时,只需在原图像基础上,每行隔一个像素取一点,每隔一行进行操作,即取原图的偶奇数行和偶奇数列构成新的图像。如果图像按任意比例缩小,则需要计算选择的行和列。如果M

8、15;N大小的原图像F(x,y)缩小为kM×kN大小的新图像I(x,y)时,则I(x,y)=F(int(c×x),int(c×y) (3-4)其中,c=1/k。由此公式可以构造出新图像。当fxfy时,图像不按比例缩小,这种操作因为在方向和方向的缩小比例不同,一定会带来图像的几何畸变。图像不按比例缩小的方法是:如果M×N大小的旧图F(x,y)缩小为k1M×k2N大小的新图像I(x,y)时,则I(x,y)=F(int(c1×x),int(c2×y) (3-5)其中c1=1/k1,c2=1/k2,由此公式可以构造出新图像。图像的缩

9、小操作中,是在现有的信息里如何挑选所需要的有用信息。而在图像的放大操作中,则需要对尺寸放大后所多出来的空格填入适当的像素值,这是信息的估计问题,所以较图像的缩小要难一些。当fx=fy=2时,图像被按全比例放大二倍,放大后图像中的(0,0)像素对应于原图中的(0,0)像素;(0,1)像素对应于原图中的(0,0.5)像素,该像素不存在,可以近似为(0,0)也可以近似为(0,1);(0,2)像素对应于原图像中的(0,1)像素;(1,0)像素对应于原图中的(0.5,0),它的像素值近似于(0,0)或(1,0)像素;(2,0)像素对应于原图中的(1,0)像素,依此类推。其实这是将原图像每行中的像素重复取

10、值一遍,然后每行重复一次。按比例将原图像放大k倍时,如果按照最近邻域法则需要将一个像素值添在新图像的k×k的子块中。显然,如果放大倍数太大,按照这种方法处理会出现马赛克效应。当时,图像在方向和方向不按比例放大,此时这种操作由于方向和方向的放大倍数不同,一定会带来图像的几何畸变。放大的方法是将原图像的一个像素添到新图像的一个的子块中去。为了提高几何变换后的图像质量,常采用线性插值法。该方法的原理是,当求出的分数地址与像素点不一致时,求出周围四个像素点的距离比,根据该比率,由四个邻域的像素灰度值进行线性插值。旋转。一般图像的旋转是以图像的中心为原点,旋转一定的角度,也就是将图像上的所有像

11、素都旋转一个相同的角度。旋转后图像的的大小一般会改变,即可以把转出显示区域的图像截去,或者扩大图像范围来显示所有的图像。图像的旋转变换也可以用矩阵变换来表示。设点逆时针旋转角后的对应点为。那么,旋转前后点、的坐标分别是: (3-6) (3-7)写成矩阵表达式为 (3-8)其逆运算为 (3-9)利用上述方法进行图像旋转时需要注意如下两点:(1)图像旋转之前,为了避免信息的丢失,一定要有坐标平移。(2)图像旋转之后,会出现许多空洞点。对这些空洞点必须进行填充处理,否则画面效果不好,一般也称这种操作为插值处理。以上所讨论的旋转是绕坐标轴原点(0,0)进行的。如果图像旋转是绕一个指定点(a,b)旋转,

12、则先要将坐标系平移到该点,再进行旋转,然后将旋转后的图象平移回原来的坐标原点,这实际上是图像的复合变换。如将一幅图像绕点(a,b)逆时针旋转度,首先将原点平移到(a,b),即 (3-10)然后旋转 (3-11)然后再平移回来 (3-12)综上所述,变换矩阵为。3.3实现主要功能的原理和方法3.3.1最近邻域插值法最近邻域插值法:它输出的像素灰度值就等于距离它映射到的位置最近的输入像素的灰度值,取离I(i/b,j/a,k)最近的整数点的灰度值为点I(i/b,j/a,k)的灰度值。取最近整数点用四舍五入。在许多情况下,最近邻插值的结果可以令人接受。最邻近点插值取插值点的4个邻点中距离最近的邻点灰度

13、值作为该点的灰度值。设插值点(i,j)到周边4个邻点fk(i,j)(k 1,2,3,4)的距离为dk(k 1,2,3,4),则:g(i,j)fk(i,j),dlmind1,d2,d3,d4,l1,2,3,4。最近邻点插值的一个隐含的假设条件是任一网格点p(x,y)的属性值都使用距它最的位置点的属性值,用每一个网格节点的最邻点值作为待的节点值3。当数据已经是均匀间隔分布,要先将数据转换为SURFER的网格文件,可以应用最近邻点插值法;或者在一个文件中,数据紧密完整,只有少数点没有取值,可用最近邻点插值法来填充无值的数据点。有时需要排除网格文件中的无值数据的区域,在搜索椭圆(SearchEllip

14、se)设置一个值,对无数据区域赋予该网格文件里的空白值。设置的搜索半径的大小要小于该网格文件数据值之间的距离,所有的无数据网格节点都被赋予空白值。在使用最近邻点插值网格化法,将一个规则间隔的XYZ数据转换为一个网格文件时,可设置网格间隔和XYZ数据的数据点之间的间距相等。最近邻点插值网格化法没有选项,它是均质且无变化的,对均匀间隔的数据进行插值很有用,同时,它对填充无值数据的区域很有效。3.3.2双线性插值法双线性插值法:它是利用了需要处理的原始图像像素点周围的四个像素点的相关陛,通过双线眭算法计算得出的。对于一个目的坐标,通过向后映射法得到其在原始图像的对应的浮点坐标(i+u,j+v),其中

15、i,j均为非负整数,u,v为0,l区间的浮点数,则这个像素的值f(i+u,j+v)可由原图像中坐标为(I,j)、(i+l,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:f(i+u,j+v)=(1-u)×(1-v)×f(,j)+(1-u)×v× f(i,j+1)+u×(1-v)×f(i+l,j)+u×v×f(i+,j+1),其中f(i,j)表示源图像(i,j)处的的像素值,以此类推,这就是双线性插值法。如图3-1所示,已知(0,0)、(0,1)、(1,0)、(1,1)四点的的灰度,可以由相

16、邻像素的灰度值f(0,0)和f(1,0)在X方向上线性插值求出(x,0)的灰度f(x,0),由另外两个相邻像素f(0,1)和f(1,1)在X方向上线性插值可求出(x,1)的灰度f(x,1),最后由f(x,0),f(x,1)在Y方向上进行线性插值就可以得到(x,y)的灰度f(x,y)。在同一行内根据待插值像素点与其前后的原图像像素点的位置距离进行加权线性插值,即离原图像像素点越近的待插值像素点,原图像像素的加权系数就越大;行间根据待插值行与其上下的原图像行间的距离进行加权线性插值,即离原图像行越近的待插值行,原图像行的加权系数就越大。假设原始图像大小为size=,其中m与n分别是原始图像的行数与

17、列<数。若图像的缩放因子是t(t>0),则目标图像的大小size=。对于目标图像的某个像素点P(x,y)通过P*1/t可得到对应的原始图像坐标P( x1,y1),其中x1=x/t,y1=y/t,由于x1,y1都不是整数所以并不存在这样的点,这样可以找出与它相邻的四个点的灰度f1、f2、f3、f4,使用双线性插值算法就可以得到这个像素点P(x1,y1)的灰度,也就是像素点P(x,y)的灰度。一个完整的双线性插值算法可描述如下:(1)通过原始图像和比例因子得到新图像的大小,并创建新图像。(2)由新图像的某个像素(x,y)映射到原始图像(x,y)处。(3)对x,y取整得到(xx,yy)并

18、得到(xx,yy)、(xx+1,yy)、(xx,yy+1)和(xx+1,yy+1)的值。(4)利用双线性插值得到像素点(x,y)的值并写回新图像。(5)重复步骤(2)直到新图像的所有像素写完。 图3-1双线性插值原理双线性插值缩放双线性插值缩放4功能模块的具体实现4.1 模块功能本课程设计通过菜单和按钮的方式来对图片进行各种几何变换,操作简单,处理结果一目了然。系统具备良好的图形用户界面,通过按钮或菜单进行操作控制,能让用户方便地选择不同的图像文件进行处理,并显示图像处理的结果。利用菜单按钮及简介的版块设计实现各功能的处理结果与操作方式。介绍图片处理按钮菜单的功能。主界面设计如下:图4-1主界

19、面4.2流程图对图像进行平移、缩放或旋转处理完成,得到新图并储存结束开始获取图片路径,打开所需图片 图4-2流程图4.3程序清单及各模块的实现效果图读入原图代码如下,img=imread('lena.bmp'); subplot(2,3,1);imshow(img); title('原始图像');imread函数读入图像并通过imshow函数显示出来。运行结果如下, 图4-3原始图像图像的平移代码如下, delta_x=str2double(inputdlg('请输入向右平移量', 'INPUT scale factor', 1,

20、 '-60'); %负数为向左 delta_y=str2double(inputdlg('请输入向下平移量', 'INPUT scale factor', 1, '-89'); %负数为向上img=imread('lena.bmp'); %这里v为原图像的高度,u为原图像的宽度v u=size(img); %这里y为变换后图像高度,x为变换后图像宽度imgn=zeros(v+abs(delta_y),u+abs(delta_x);rot=1 0 0;0 1 0;delta_y delta_x 1; inv_rot=

21、inv(rot);pix1=1 1 1*rot; %pix1(1),pix1(2)分别为变换后图像的左上角的y,xpix4=v u 1*rot; %pix4(1),pix4(2)分别为变换后图像的右下角的y,x%向右下方移动if delta_x>=0 && delta_y>=0 for y=pix1(1):pix4(1) for x=pix1(2):pix4(2) pix=y x 1*inv_rot; if pix(1)>=0.5 && pix(2)>=0.5 && pix(1)<=v && pix(

22、2)<=u imgn(y,x)=img(round(pix(1),round(pix(2); end end endend %向左下方移动if delta_x<0 && delta_y>=0 for y=pix1(1):pix4(1) for x=pix1(2):pix4(2) pix=y x 1*inv_rot; if pix(1)>=0.5 && pix(2)>=0.5 && pix(1)<=v && pix(2)<=u imgn(y,x-delta_x)=img(round(pix(

23、1),round(pix(2); end end endend%向左上方移动if delta_x<0 && delta_y<0 for y=pix1(1):pix4(1) for x=pix1(2):pix4(2) pix=y x 1*inv_rot; if pix(1)>=0.5 && pix(2)>=0.5 && pix(1)<=v && pix(2)<=u imgn(y-delta_y,x-delta_x)=img(round(pix(1),round(pix(2); end end en

24、dend %向右上方移动if delta_x>=0 && delta_y<0 for y=pix1(1):pix4(1) for x=pix1(2):pix4(2) pix=y x 1*inv_rot; if pix(1)>=0.5 && pix(2)>=0.5 && pix(1)<=v && pix(2)<=u imgn(y-delta_y,x)=img(round(pix(1),round(pix(2); end end endendsubplot(2,3,4);imshow(uint8(i

25、mgn);imwrite(uint8(imgn),'平移.bmp','bmp') ; title('平移');通过imread函数读取图像并编译运行之后首先出现对话框,输入数据点击确认,默认为向左偏移量为60 向上偏移量为89。再通过imwrite函数对图像进行存储。 图4-5运行平移出现的对话框 图4-6平移后的图像图像的缩放变换。设计的缩放变换有双线性插值缩放和最近邻差值缩放两种。两种代码分别如下,双线性插值缩放代码如下,I=imread('lena.bmp'); %读入原图像rows,cols=size(I);K1 =str

26、2double(inputdlg('请输入列缩放倍数', 'INPUT scale factor', 1, '0.5');%行默认变为原来的0.5倍K2 =str2double(inputdlg('请输入行缩放倍数', 'INPUT scale factor', 1, '1.5');%列默认变为原来的1.5倍width = K1 * rows; height = K2 * cols;Out = uint8(zeros(width,height); %创建输出图像矩阵widthScale = rows

27、/width;heightScale = cols/height;for x = 6:width - 6 % 6是为了防止矩阵超出边界溢出 for y = 6:height - 6 oldX = x * widthScale; % oldX,oldY为原坐标,x,y为新坐标 oldY = y * heightScale; if (oldX/double(uint16(oldX) = 1.0) & (oldY/double(uint16(oldY) = 1.0) Out(x,y) = I(int16(oldX),int16(oldY);%若oldX,oldY为整数,直接赋值 else a

28、 = double(uint16(oldX); b = double(uint16(oldY); x11 = double(I(a,b); % x11 赋值为 I(a,b) x12 = double(I(a,b+1); % x12 赋值为 I(a,b+1) x21 = double(I(a+1,b); % x21 赋值为 I(a+1,b) x22 = double(I(a+1,b+1); % x22 赋值为 I(a+1,b+1) Out(x,y) = uint8( (b+1-oldY) * (oldX-a)*x21 + (a+1-oldX)*x11) + (oldY-b) * (oldX-a)

29、*x22 +(a+1-oldX) * x12) ); % 用双线性插值计算公式计算 end endendsubplot(2,3,5);imshow(Out);title('双线性插值缩放');imwrite(uint8(imgn),'双线性插值缩放.bmp','bmp') ; 运行程序之后,和平移一样也是会先后出现两个对话框,输入合适的数据,点击确认即出现结果。下图是行缩放0.5倍,列缩放0.5倍。 图4-7运行双线性插值缩放出现的对话框图4-8双线性插值缩放后的图像最近邻差值缩放代码如下,I=imread('lena.bmp')

30、;%读入图像rows,cols=size(I);K1 = str2double(inputdlg('请输入列缩放倍数', 'INPUT scale factor', 1, '0.5');%列默认变为原来的0.6倍K2 = str2double(inputdlg('请输入行缩放倍数', 'INPUT scale factor', 1, '1.5');%行默认变为原来的0.4倍width = K1 * rows; height = K2 * cols;im2 = uint8(zeros(width,he

31、ight); %定义输出图像矩阵widthScale = rows/width;heightScale = cols/height;for x = 6:width - 6 %为防止矩阵溢出而选择的参数6 for y = 6:height - 6 oldX = x * widthScale; %oldX,oldY为原坐标,x,y为新坐标 oldY = y * heightScale; if(oldX/double(uint16(oldX) = 1.0) & (oldY/double(uint16(oldY) = 1.0) im2(x,y) = I(int16(oldX),int16(ol

32、dY); else a = double(round(oldX); b = double(round(oldY); %若不是整数四舍五入后把临近值赋过去 im2(x,y) = I(a,b); end endendsubplot(2,3,6);imshow(im2);title('最近邻缩放');imwrite(Out,'最近邻缩放.bmp','bmp');运行程序之后,和上面一样也是会先后出现两个对话框,输入合适的数据,点击确认即出现结果。下图是选用默认值行缩放0.5倍,列缩放0.5倍。 图4-9运行最近邻插值缩放出现的对话框 图4-10最近邻插

33、值缩放后的图像旋转变换。设计的旋转变换有双线性插值旋转和最近邻插值旋转两种。双线性插值旋转代码如下,jiaodu=str2double(inputdlg('请输入旋转角度', 'INPUT scale factor', 1, '60'); %要旋转的角度,旋转方向为顺时针img=imread('lena.bmp'); %这里v为原图像的高度,u为原图像的宽度h w=size(img);theta=jiaodu/180*pi;rot=cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0

34、 0 1; pix1=1 1 1*rot; %变换后图像左上点的坐标pix2=1 w 1*rot; %变换后图像右上点的坐标pix3=h 1 1*rot; %变换后图像左下点的坐标pix4=h w 1*rot; %变换后图像右下点的坐标height=round(max(abs(pix1(1)-pix4(1)+0.5 abs(pix2(1)-pix3(1)+0.5); %变换后图像的高度width=round(max(abs(pix1(2)-pix4(2)+0.5abs(pix2(2)-pix3(2)+0.5); %变换后图像的宽度imgn=zeros(height,width);delta_y

35、=abs(min(pix1(1) pix2(1) pix3(1) pix4(1); %取得y方向的负轴超出的偏移量delta_x=abs(min(pix1(2) pix2(2) pix3(2) pix4(2); %取得x方向的负轴超出的偏移量for i=1-delta_y:height-delta_y for j=1-delta_x:width-delta_x pix=i j 1/rot; %用变换后图像的点的坐标去寻找原图像点的坐标, float_Y=pix(1)-floor(pix(1); float_X=pix(2)-floor(pix(2); if pix(1)>=1 &

36、& pix(2)>=1 && pix(1) <= h && pix(2) <= w pix_up_left=floor(pix(1) floor(pix(2); %四个相邻的点 pix_up_right=floor(pix(1) ceil(pix(2); pix_down_left=ceil(pix(1) floor(pix(2); pix_down_right=ceil(pix(1) ceil(pix(2); value_up_left=(1-float_X)*(1-float_Y);%计算临近四个点的权重 value_up_righ

37、t=float_X*(1-float_Y); value_down_left=(1-float_X)*float_Y; value_down_right=float_X*float_Y; imgn(i+delta_y,j+delta_x)=value_up_left*img(pix_up_left(1),pix_up_left(2)+. value_up_right*img(pix_up_right(1),pix_up_right(2)+. value_down_left*img(pix_down_left(1),pix_down_left(2)+. value_down_right*img(

38、pix_down_right(1),pix_down_right(2); end endendsubplot(2,3,2);imshow(uint8(imgn);title('双线性插值旋转');imwrite(uint8(imgn),'双线性插值旋转.bmp','bmp') ;运行程序之后,先后出现一个对话框,输入合适的数据,点击确认即出现结果。下图是选用默认值顺时针旋转60度。 图4-11运行双线性插值旋转出现的对话框 图4-12双线性插值旋转后的图像最近邻插值旋转代码如下,H=1; %索引pix中第一个元素,即高度W=2; %索引pix中第

39、二个元素,即宽度jiaodu=str2double(inputdlg('请输入旋转角度', 'INPUT scale factor', 1, '60'); %要旋转的角度,旋转方向为顺时针img=imread('lena.bmp'); %这里v为原图像的高度,u为原图像的宽度v u=size(img);theta=jiaodu/180*pi;rot=cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1; inv_rot=inv(rot);pix1=1 1 1*rot; %变换

40、后图像左上点的坐标pix2=1 u 1*rot; %变换后图像右上点的坐标pix3=v 1 1*rot; %变换后图像左下点的坐标pix4=v u 1*rot; %变换后图像右下点的坐标height=round(max(abs(pix1(H)-pix4(H)+0.5abs(pix2(H)-pix3(H)+0.5); %变换后图像的高度width=round(max(abs(pix1(W)-pix4(W)+0.5abs(pix2(W)-pix3(W)+0.5); %变换后图像的宽度imgn=zeros(height,width);delta_y=abs(min(pix1(H) pix2(H) p

41、ix3(H) pix4(H); %取得y方向的负轴超出的偏移量delta_x=abs(min(pix1(W) pix2(W) pix3(W) pix4(W);%取得x方向的负轴超出的偏移量for y=1-delta_y:height-delta_y for x=1-delta_x:width-delta_x pix=y x 1*inv_rot; if pix(H)>=0.5 && pix(W)>=0.5 && pix(H)<=v && pix(W)<=u imgn(y+delta_y,x+delta_x)=img(roun

42、d(pix(H),round(pix(W); end end endsubplot(2,3,3);imshow(uint8(imgn);title('最近邻插值旋转');imwrite(uint8(imgn),'最近邻插值旋转.bmp','bmp') ; 运行程序之后,先后出现一个对话框,输入合适的数据,点击确认即出现结果。下图是选用默认值顺时针旋转60度。 图4-13运行最近邻插值旋转出现的对话框 图4-13双线性插值旋转后的图像4.4 系统仿真与调试上面已经说明每个按钮都分别对应着图像的某一种变换。打开Matlab软件,编译运行GUI程序后得

43、下图,图4-14GUI运行之后总界面分析得到的图像可知最近邻插法质量最差,但是算法简单,速度快;双线性插值法质量好,但是需要较大的计算量才能完成。 5总结与体会 参考文献1郑阿奇,曹戈,赵阳. MATLAB实用教程M. 电子工业出版社, 2002 2张弘. 数字图像处理与分析M. 机械工业出版社, 2005 3孙兆林. MATLAB6图像处理M. 清华大学出版社, 2010 4姚敏. 数字图像处理M. 北京机械工业出版社, 20065李显宏. MATLAB7.x界面设计与编程技巧M. 北京.电子工业出版社, 20066龚声蓉. 数字图像处理与分析M. 北京.清华大学出版社, 2006附录img

44、=imread('lena.bmp'); %这里v为原图像的高度,u为原图像的宽度subplot(2,3,1);imshow(img); title('原始图像');function pushbutton2_Callback(hObject, eventdata, handles)delta_x=str2double(inputdlg('请输入向右平移量', 'INPUT scale factor', 1, '-60'); %负数为向左 delta_y=str2double(inputdlg('请输入向下平

45、移量', 'INPUT scale factor', 1, '-89'); %负数为向上img=imread('lena.bmp'); %这里v为原图像的高度,u为原图像的宽度v u=size(img); %这里y为变换后图像的高度,x为变换后图像的宽度imgn=zeros(v+abs(delta_y),u+abs(delta_x);rot=1 0 0;0 1 0;delta_y delta_x 1; inv_rot=inv(rot);pix1=1 1 1*rot; %pix1(1),pix1(2)分别为变换后图像的左上角的y,xpix4

46、=v u 1*rot; %pix4(1),pix4(2)分别为变换后图像的右下角的y,x%向右下方移动if delta_x>=0 && delta_y>=0 for y=pix1(1):pix4(1) for x=pix1(2):pix4(2) pix=y x 1*inv_rot; if pix(1)>=0.5 && pix(2)>=0.5 && pix(1)<=v && pix(2)<=u imgn(y,x)=img(round(pix(1),round(pix(2); end end end

47、end%向左下方移动if delta_x<0 && delta_y>=0 for y=pix1(1):pix4(1) for x=pix1(2):pix4(2) pix=y x 1*inv_rot; if pix(1)>=0.5 && pix(2)>=0.5 && pix(1)<=v && pix(2)<=u imgn(y,x-delta_x)=img(round(pix(1),round(pix(2); end end endend%向左上方移动if delta_x<0 &&am

48、p; delta_y<0 for y=pix1(1):pix4(1) for x=pix1(2):pix4(2) pix=y x 1*inv_rot; if pix(1)>=0.5 && pix(2)>=0.5 && pix(1)<=v && pix(2)<=u imgn(y-delta_y,x-delta_x)=img(round(pix(1),round(pix(2); end end endend%向右上方移动if delta_x>=0 && delta_y<0 for y=pix1(1):pix4(1) for x=pix1(2):pix4(2) pix=y x 1*inv_rot; if pix(1)>=0.5 && pix(2)>=0.5 && pix(1)<=v && pix(2)<=u imgn(y-delta_y,x)=img(round(pix(1),round(pix(2); end end endendsubplot(2,3,4);imshow(uint8(imgn);imwrite(uint8(imgn),'平移.bmp'

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论