图像旋转MATLAB代码实现

合集下载

编程实现一幅图像的平移、镜像、旋转、缩小和放大。

编程实现一幅图像的平移、镜像、旋转、缩小和放大。

课程设计任务书学生姓名: zhh 专业班级: 通信1002班指导教师:徐文君工作单位:信息工程学院题目: 通信工程应用技术综合训练与实习初始条件:1。

数字图像处理课程相关知识。

2。

Matlab软件的软件编程应用与仿真.要求完成的主要任务:任务:编程实现一幅图像的平移、镜像、旋转、缩小和放大.要求:1。

给出所用算法的理论依据和必要的推导过程。

2.给出原始图像和处理后的图像。

时间安排:指导教师签名:年月日系主任签名:年月日目录摘要............................................................................ Abstract (I)1 图像的几何变换 01.1图像几何变换内容 01.2 Matlab仿真使用的主要函数 02图像的平移变换 (3)2。

1图像平移变换原理 (3)2.2图像平移变换的matlab实现 (4)3图像的镜像变换 (5)3.1 图像镜像变换原理 (6)3。

2 图像镜像变换的matlab实现 (7)4图像的旋转变换 (8)4。

1图像旋转变换原理 (9)4。

2 图像旋转变换的matlab实现 (10)5图像的比例变换................................................. 错误!未定义书签。

5.1 图像比例变换原理 (13)5。

2 图像比例变换的matlab实现 (13)6 心得体会 (17)参考文献 (18)附录 (19)摘要图像是对三维实际景物的平面投影,图形图像处理主要是通过计算机对图像进行处理,从而达到预期的效果的技术.为了观测需要,常常需要进行各种不同的几何变换,主要包括图像的平移变换,图像水平、垂直镜像变换,图像旋转变换,图像比例变换。

实际上,几何变换不改变像素值,而是改变像素所在的位置。

在图像处理中,可以通过Matlab来实现图像的几何变换,此软件的语法结构简单,并且具有极强的数值计算、图形文字处理、数据分析、图形绘制及图像处理等功能。

数字图像处理_旋转与幅度谱(含MATLAB代码)

数字图像处理_旋转与幅度谱(含MATLAB代码)

数字图像处理实验一15生医一、实验容产生右图所示图像 f1(m,n),其中图像大小为256×256,中间亮条为128×32,暗处=0,亮处=100。

对其进行FFT:①同屏显示原图f1(m,n)和FFT(f1)的幅度谱图;②若令f2(m,n)=(-1)^(m+n)f1(m,n),重复以上过程,比较二者幅度谱的异同,简述理由;③若将f2(m,n)顺时针旋转90度得到f3(m,n),试显示FFT(f3)的幅度谱,并与FFT(f2)的幅度谱进行比较;④若将f1(m,n) 顺时针旋转90度得到f4(m,n),令f5(m,n) = f1(m,n) + f4(m,n),试显示FFT(f5)的幅度谱,指出其与FFT(f1)和FFT(f4)的关系;⑤若令f6(m,n)=f2(m,n)+f3(m,n),试显示FFT(f6)的幅度谱,并指出其与FFT(f2)和FFT(f3)的关系,比较FFT(f6)和FFT(f5)的幅度谱。

二、运行环境MATLAB R2014a三、运行结果及分析1.同屏显示原图f1(m,n)和FFT(f1)的幅度谱图:50100150200250100150200250501001502002501001502002502.令f2(m,n)=(-1)^(m+n )f1(m,n),对其进行FFT ,比较f2与f1幅度谱的异同,简述理由:5010015020025010015020025050100150200250100150200250异同及理由:①空域:f2由于前边乘了系数(-1)^(m+n ),导致灰度值有正有负,而在MATLAB 的imshow 函数中默认把负值变为0(有些情况是取反),所以形成了如左图所示的黑白花纹。

②频域:FFT(2)为FFT(1)中心化后的图像。

空域进行乘以(-1)^(m+n )的操作,即相当于频域里的位移,实现频谱的中心化。

3.将f2(m,n)顺时针旋转90度得到f3(m,n),试显示FFT(f3)的幅度谱,并与FFT(f2)的幅度谱进行比较:5010015020025010015020025050100150200250100150200250比较:空域图像旋转90度后,频域幅度谱也旋转90度。

编程实现一幅图像的平移、镜像、旋转、缩小和放大

编程实现一幅图像的平移、镜像、旋转、缩小和放大

课程设计任务书学生姓名:专业班级:通信1003班指导教师:郭志强工作单位:信息工程学院题目: 通信工程应用技术初始条件:(1)使用matlab软件进行操作(2)选择一个图像进行处理要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)编程实现一幅图像的平移、镜像、旋转、缩小和放大。

(2)给出所用算法的理论依据和必要的推导过程,给出原始图像和处理后的图像。

时间安排:第15周:安排任务,布置题目;第15—18周:设计仿真,撰写报告第19周:完成设计,提交报告,答辩指导教师签名:年月日系主任(或责任教师)签名:年月日目录摘要 (I)Abstract ........................................................................................................................................................... I I 1 MA TLAB简介 .. (1)1.1 MA TLAB用途 (1)2图像选择及变换 (4)2.1 原始图像选择读取 (4)2.2 图像放大和缩小 (6)2.2.1 图像放大缩小的知识 (6)2.2.2 函数说明及参数选择 (8)2.2.3 源程序及运行结果 (8)2.3 图像任意角度的旋转 (10)2.3.1 函数说明及参数选择 (10)2.3.2 源程序及运行结果 (10)2.4 图像的平移 (12)2.4.1 函数说明及参数选择 (12)2.4.2 源程序及运行结果 (13)2.5 图像经过镜像 (13)3.5.1 函数说明及参数选择 (13)2.5.2 源程序及运行结果 (14)4 感悟体会小结 (17)5 参考文献 (18)附录 (19)全部源程序代码: (19)摘要MATLAB是—套高性能的数值计算和可视化软件,它集数值分析、矩阵运算、信号处理和图形显示于一体,构成—个方便的、界面友好的用户环境。

matlab实现图像的放大及旋转

matlab实现图像的放大及旋转

MATLAB是一个包含大量计算算法的集合。

其拥有600多个工程中要用到的数学运算函数,可以方便的实现用户所需的各种计算功能。

函数中所使用的算法都是科研和工程计算中的最新研究成果,而前经过了各种优化和容错处理。

在通常情况下,可以用它来代替底层编程语言,如C和C 。

在计算要求相同的情况下,使用MATLAB的编程工作量会大大减少。

MATLAB的这些函数集包括从最简单最基本的函数到诸如距阵,特征向量、快速傅立叶变换的复杂函数。

函数所能解决的问题其大致包括矩阵运算和线性方程组的求解、微分方程及偏微分方程的组的求解、符号运算、傅立叶变换和数据的统计分析、工程中的优化问题、稀疏矩阵运算、复数的各种运算、三角函数和其他初等数学运算、多维数组操作以及建模动态仿真等。

(4)出色的图形处理功能MATLAB自产生之日起就具有方便的数据可视化功能,以将向量和距阵用图形表现出来,并且可以对图形进行标注和打印。

高层次的作图包括二维和三维的可视化、图象处理、动画和表达式作图。

可用于科学计算和工程绘图。

新版本的MATLAB 对整个图形处理功能作了很大的改进和完善,使他不仅在一般数据可视化软件都具有的功能(例如二维曲线和三维曲面的绘制和处理等)方面更加完善,而且对于一些其他软件所没有的功能(例如图形的光照处理、色度处理以及四维数据的表现等),MATLAB 同样表现了出色的处理能力。

同时对一些特殊的可视化要求,例如图形对话等,MATLAB也有相应的功能函数,保证了用户不同层次的要求。

另外新版本的MATLAB还着重在图形用户界面(GUI)的制作上作了很大的改善,对这方面有特殊要求的用户也可以得到满足。

(5)应用广泛的模块集合工具箱MATLAB对许多专门的领域都开发了功能强大的模块集和工具箱。

一般来说,他们都是由特定领域的专家开发的,用户可以直接使用工具箱学习、应用和评估不同的方法而不需要自己编写代码。

目前,MATLAB已经把工具箱延伸到了科学研究和工程应用的诸多领域,诸如数据采集、数据库接口、概率统计、样条拟合、优化算法、偏微分方程求解、神经网络、小波分析、信号处理、图像处理、系统辨识、控制系统设计、LMI控制、鲁棒控制、模型预测、模糊逻辑、金融分析、地图工具、非线性控制设计、实时快速原型及半物理仿真、嵌入式系统开发、定点仿真、DSP 与通讯、电力系统仿真等,都在工具箱(Toolbox)家族中有了自己的一席之地。

matlab图像旋转

matlab图像旋转

=摘要=图像处理老师的课很"抽像",很会"跳"....刚讲了一点"RBG转灰度图",就马上进军图像的几何变换了,同时也带来了一个新的实验(作業):<图像的旋转>.要求:旋转弧度: 0<radian<pi/2 (顺时针旋转).对于我这个"好学生"来说...当然掩盖不了心中的好奇心----图像旋转是怎么实现的?于是经过一定的探索(主要是matlab的用法)...终于实现了这个"旋转":)本文就是关于这个"探索"过程的一点文字记录啦.=预览一下=matlab有一个图像处理工具(IPT),里面已经有一个图像旋转算法的实现了...函数名:imrotate(源图像,旋转角度)...这里将给出:源图像,IPT版本处理过的旋转后图像,我自己的算法处理过的旋转图像:==原图像====IPT(imrotate)实现旋转====我自己的旋转函数結果====说明==上面的旋转对于玩过图像处理PS的人来说是不是太简单了?在PS里面或者其他图像处理工具里面对于图像的旋转是"极"简单的...一点就是了:)上面的"旋转"在生活中经常看到...你把一张生活照旋转一下就感觉到了哈.=什么是图像的旋转=图像的旋转是图像几何变换的一种...看到上面预览的图就能知道...旋转前后的图像的像素的RGB都是没有改变的,改变的只是每一个像素的所在位置....这个就是旋转的本质:把原图像像素从原点(x,y)放到目标位置点上(x',y')..这个(x,y)到(x',y')的转换是经过旋转计算而来的...那么这个图像处理就是旋转处理(几何变换).再看看上面的图,还真的发现只是图像的像素点的位置改变了,图像本身的彩色信息并没有改动什么.=怎么SHOW旋转后的图像==图像是怎么显示的=图像的显示都是基于矩阵像素来显示的...上面每一张图像的图像信息其实是一个RGB矩阵来的.所以必须把旋转后的图像放到一个像素矩阵中才能显示这个旋转后的图像.设一张图像的大小是col*row的.那么以这个图像对角线为直径的圆就能够包含这个图像经旋转后的图像..在这里因为图像的显示是矩阵式的,所以这里以图像对角线为边长构造一个正方形来保存旋转后的图像.从上面旋转后的图像可以看出效果啦,旋转后的图像就包含在这个正方形的矩阵中.=计算旋转图像所需要的正方形=因为图像是col*row的,所以这个正方形的边长new_img_size = (col^2+row^2)^0.5;这样使用matlab就可以生成一个存储最终图像的rgb矩阵了:[cpp]view plaincopy1.img_rotated = uint8(zeros(new_img_size , new_img_size , 3); //%一个像素由RGB三个分量表现.=怎么旋转?=现在来到正题了,上面已经把旋转的原理给讲清楚了...本质就是找到原点(x,y)的新位置(x',y'),然后把原点的像素复制到目标点上就行了...上面也提到了一点:旧坐标到新坐的变的是"旋转"而来的...下面来体现一下旋转的原因:设一个原点P,P的坐标是:(x,y),这里的x是列分量,y是行分量.那么P点离图像左上角的距离是:r=(x^2+y^2)^0.5; 同时p到(1,1)点的连线与列方向有一个夹角:a此时r,x,y的关系可以进一步表示成:[cpp]view plaincopy1.x = r*cos(a);2.y = r*sin(a);到了这里可以知道(x,y)本身与"旋转"角度有一定的关系了,....下面就将p点绕(1,1)这点顺时针旋转b角度...得到p的新位置(x',y')..由r,x,y的关系可以得到r,x',y'的关系如下:[cpp]view plaincopy1.x' = r*cos(a+b);2.y' = r*sin(a+b);进一步化简:[cpp]view plaincopy1.x' = r*cos(a)*cos(b) - r*sin(a)*sin(b);2.y' = r*sin(a)*cos(b) + r*cos(a)*sin(b);然后再结合r,x,y的关系得到x,y,x',y'的关系如下:[cpp]view plaincopy1.x' = x*cos(b) - y*sin(b);2.y' = y*cos(b) + x*sin(b);于是上面提到的点旋转位置关系就出来了....即(x,y)经过顺时针旋转b角度后可以得到(x',y')..这个转换公式就是上面的线性方程..写成matlab的方式就是如下啦:[cpp]view plaincopy1.[x',y'] = [cos(b) -sin(b);sin(b) cos(b)]*[x,y]; //%这里的x'不是x的转置哦.好了,到此为止,我们有了旋转公式了...下面就可以利用这个公式对原图的每一个像素点(x,y)计算其旋转后的位置(x',y')了,然后就是复制图像的像素点了(简单不?)...=怎么复制像素点=由上面两节可以看出,图像旋转后的像素应该保存在img_rotated当中. 同时每一个像素的坐标都是正的,即没有(-10,-10)坐标位置的像素点..而从上面(x,y)到(x',y')的计算过程可以看出....x'或者y'都可能出现是负值的问题...于是不能够在计算出x',y'后就直接把x,y处的像素复制到x',y'...因为x',y'可能是一个非法的位置.从上面的图来看,这个问题还是可以解决了..要不然上面我就不能做出那么像样的旋转了呵呵.为了让x',y'合法,让我们来看看原图像顺时针旋转后,原图上哪些点会导致对应的x',y'不合法...经过分析.不难看出只有x'这个变量会出现负值,而x'为负值时x的值就分布在图像的左下角处....而且x'达到最小负数的绝对值是row*sin(b).注意y'永远是一个正的...因为题目的要求可以知道..而且矩阵的左上角是(1,1).即采用计算机的坐标系统.好了,找到了x'不合法的原因了...这个时候就可以找找解决方法了....联想到图像旋转后是存储在img_rotated当中的...而且原图的左下角像素显示在img_rotated的左边界上面...所以解决方法就是计算完成x',y'后,再将x',y'右移一段距离,以让x'始终是正值...很明显,这右移的距离大小就是row*sin(b),注意这里y'是不需要调整的.所以最终x,y得到的目标位置x'',y''就由如下公式计算了.[cpp]view plaincopy1.x'' = x*cos(b) - y*sin(b) + row*sin(b);2.y'' = y*cos(b) + x*sin(b);(可以看出与上面x',y'的计算没有差多少,只是图像右移了下呵呵)得到了x'',y''的同时,我们也知道原图像素(x,y)的目标位置就是img_rotated(x'',y'')哈哈,终于写到这里了...这里也标记着我的这个旋转算法的尾声了....正个算法就是找到(x,y)在img_rotated的显示位置(x'',y'')..经过上面的算法处理后,我是能够看到图像"旋转"了...但是也能明显发现:图像的质量很差...因为img_rotated当中也许多有规律性的背景点没有得到原图像的像素来填充...=存在像素空洞的图像=下图是直接运用上面算法进行的旋转处理后的图像:=解决空洞像素问题=仔细看看有空洞像素的图像可以看出,没有像素填充的点都是有规律的....再想想上面的计算都是基于三角函数的,而且三角函数的值都是小数...于是原因就可以猜出来了.:原点(x,y)到(x'',y'')的计算不是连续的,因为x'',y''是有取整操作的....这个就是造成空洞的原因了...哈哈,知道原因了...查找解决方案就有方向了...由上面可以知道是x'',y''有取整操作...造成部分点没有达到其对应的点上去...所以我在计算x'',y''的时候故意加上了+0.5,-0.5分量到x''或者y''分量上去..目的是把x'',y''周围不可能由x,y达到的点用x,y像素点去填充...这个思想也是今天老师在课堂说的"插值"问题(老师也向我们演示这个问题,他的解决方法是x'',y''周围8个没有填充的像素点用x'',y''点去填充)经过上面的x'',y''调整...图像旋转后的的空洞点就没有了,表面上看起来就是我们想要的旋转后的图像了.呵呵...没有考虑到像素空洞的图像:=图像边界齿距=我个人感觉我的这个算法还是有问题的,于是与IPT工具里面的旋转图像算法相比...結果是我旋转后的图像不仅在尺寸要比imrotate的输出图像要大一点点,而且边界上面的齿距也没有imrotate的输出图像那么完美.(这点我用老师的算法比较也是一样.)于是我想应该是因为上面x'',y''调整问题了...把边界某些点复制多出来了....于是一个一个调整算法(-0.5,+0.5)..最终调试成功了....四个边界的齿距都与IPT的imrotate的输出图像99%一致了(但是右下角的一个点有点不一样呵呵)下面是一张显示齿距的图像块:=算法复杂度=上面提到了就是对图像每一个点的坐标进行计算,然后把点上的像素数据复制到目标坐标上...所以对于一个col*row大小的图像,我这个图像处理算法的时间复杂度是:O(N^2);=小结=呼呼...写到这里也不容易的(写了1小时多一丁点),特别是对于我这种没杂写过文字的人.上面討論了我是怎么实现这个图像旋转算法,同时也考虑了一些图像像素点空洞,边界齿距问题...如果还是有点不明白的,那直接可以结合我的m文件源代码看看,源代码我放到csdn.download里面咯...核心代码量是20行吧.。

Matlab在图像处理中的应用与技巧

Matlab在图像处理中的应用与技巧

Matlab在图像处理中的应用与技巧引言图像处理是计算机科学领域中的一个重要分支,通过对图像进行处理和分析,可以获得许多有价值的信息。

而MATLAB作为一个强大的计算软件,具备了丰富的图像处理函数和工具箱,可以帮助我们实现各种复杂的图像处理任务。

本文将介绍MATLAB在图像处理中的应用与技巧,帮助读者更好地利用MATLAB进行图像处理。

一、图像的读取与显示在MATLAB中,可以使用imread函数读取图像文件。

例如,要读取一张名为"image.jpg"的图像文件,可以使用以下代码:```MATLABimage = imread('image.jpg');```而imshow函数则可以将图像显示在窗口中,例如:```MATLABimshow(image);```通过这两个简单的函数,我们可以很方便地读取和显示图像。

二、图像的基本处理1.图像的缩放在图像处理过程中,经常需要将图像进行缩放。

MATLAB提供了imresize函数来实现图像的缩放,例如:```MATLABnew_image = imresize(image, [height, width]);```其中,height和width分别表示缩放后图像的高度和宽度。

2.图像的灰度化有时候我们只关注图像的亮度信息,而忽略了彩色信息。

此时可以将图像转换为灰度图像,MATLAB提供了rgb2gray函数来实现图像的灰度化,例如:```MATLABgray_image = rgb2gray(image);```gray_image即为灰度图像。

3.图像的旋转有时候我们需要将图像进行旋转,MATLAB提供了imrotate函数来实现图像的旋转,例如:```MATLABrotated_image = imrotate(image, angle);```其中,angle表示旋转的角度。

三、图像的增强处理1.图像的边缘检测在许多图像处理任务中,边缘是重要的特征之一。

Matlab图形界面图像的旋转、平移和缩放要点

Matlab图形界面图像的旋转、平移和缩放要点

Matlab图形界面图像的旋转、平移和缩放姓名:班级:学号:目录问题描述 (2)摘要 (2)正文 (3)1、界面设计 (3)2、打开图片功能 (4)3、实现图片的任意角度的旋转 (5)4、图像的平移 (8)5、图像的缩放(放大与缩小) (12)实验心得 (17)附录: (17)Matlab图形界面操作—-—--—图像的旋转、平移和缩放问题描述期末运用学习的matlab知识通过图形用户界面对图片进行操作,实现如下功能.●能够查找和读取计算机中存储图像.●实现图像的旋转、平移、缩放等几何变换。

●通过matlab界面功能实现界面的完美布局。

●编写代码和回调函数实现上述功能.摘要本次任务旨在完成以下几个任务:●整体分为四大模块:原图、旋转、平移和缩放。

●利用数字图像处理技术,以MATLAB为平台,建立一个实现设计主题的简易处理系统。

●能显示输入图像、输出图像.●程序代码要有注释说明,调用MATLAB函数要清楚并理解函数的功能、使用范围,在设计说明书中要写清楚函数的功能和参数意义。

●完成自己课程设计说明书。

正文1、界面设计(1)在MATLAB命令窗口中输入“guide”,确定后,弹出GUI窗口.(2)本次设计中,包含两个坐标轴(axes1、axes2),分别显示原图和处理后的图像.包含六个按钮(Push Button),分别实现“打开图片、保存处理后的图片、旋转、平移、放大、缩小以及退出功能”。

(3)旋转功能同时可以实现选择0-360度任意的度数,当选择不同的度数后,axes2位置就会显示不同选择角度的图片.如果需要保存该图片可以单击保存按钮进行保存。

(4)平移功能的实现,当单击平移按钮,可以有一个默认的平移位置。

在设计中预设了几个固定位置,可以选择,分别是X单位Y单位方向都可以选择。

达到平移的目的。

(5)放大和缩小功能类似,在界面上表现为选择不同的数据,反映出来不同大小的图片。

(6)操作完成后,点击退出功能,将询问是否退出,如果退出则点击“是",不退出点击“我还要看看”.2、打开图片功能进入程序界面后,要实现几何操作,需要先打开一张图片。

MATLAB实现RGB图像的平移、缩放和旋转

MATLAB实现RGB图像的平移、缩放和旋转

Func的1 2 3分别对应平移、旋转、缩放功能function []=transition(func,I)if func==1delta_x=str2double(inputdlg('请输入向右平移量', 'INPUT scale factor', 1, {'-60'})); %负数为向左delta_y=str2double(inputdlg('请输入向下平移量', 'INPUT scale factor', 1, {'-89'})); %负数为向上img=imread(I);%读入图像B=size(img); %获取原始图像的高和宽imgn(:,:,:)=zeros(B(1)+abs(delta_y),B(2)+abs(delta_x));%创建平移图像输出矩阵rot=[1 0 0;0 1 0;delta_y delta_x 1]; %寻求新坐标用到的平移矩阵pix1=[1 1 1]*rot; %pix1(1),pix1(2)分别为变换后图像的左上角的y,x,分别为1+delta_y,1+delta_x,这种三维空间坐标被称为齐次坐标表示法pix4=[B(1) B(2) 1]*rot; %pix4(1),pix4(2)分别为变换后图像的右下角的y,x,分别为v+delta_y,u+delta_xfor q=1:3 %为每个通道做相同处理%%向右下方移动if delta_x>=0 && delta_y>=0 %如果两个平移量都为正for y=pix1(1):pix4(1) %新图像纵坐标从最开始到结束处for x=pix1(2):pix4(2) %新图像横坐标从最开始到结束处pix=[y x 1]/rot; %pix矩阵经计算后为[y-delta_y,x-delta_x,1] if pix(1)>=0.5 && pix(2)>=0.5 && pix(1)<=B(1) && pix(2)<=B(2)%这里是判断是否有像素可进行平移,例如:若y-delta_y<0.5,则说明没有找到可平移的像素坐标imgn(y,x,q)=img(round(pix(1)),round(pix(2)),q); %新的图像(x,y)点的像素值选取(x-delta_x,y-delta_y)处的像素值,则实现了平移endendendend%%向左下方移动if delta_x<0 && delta_y>=0for y=pix1(1):pix4(1)for x=pix1(2):pix4(2)pix=[y x 1]/rot;if pix(1)>=0.5 && pix(2)>=0.5 && pix(1)<=B(1) && pix(2)<=B(2)imgn(y,x-delta_x,q)=img(round(pix(1)),round(pix(2)),q);endendendend%%向左上方移动if delta_x<0 && delta_y<0for y=pix1(1):pix4(1)for x=pix1(2):pix4(2)pix=[y x 1]/rot;if pix(1)>=0.5 && pix(2)>=0.5 && pix(1)<=B(1) && pix(2)<=B(2)imgn(y-delta_y,x-delta_x,q)=img(round(pix(1)),round(pix(2)),q);endendendend%%向右上方移动if delta_x>=0 && delta_y<0for y=pix1(1):pix4(1)for x=pix1(2):pix4(2)pix=[y x 1]/rot;if pix(1)>=0.5 && pix(2)>=0.5 && pix(1)<=B(1) && pix(2)<=B(2)imgn(y-delta_y,x,q)=img(round(pix(1)),round(pix(2)),q);endendendendendimshow(uint8(imgn));title('平移');endif func==2img=imread(I); %读入原图像B=size(img);%获取图像的高度和宽度K1 =str2double(inputdlg('请输入列缩放倍数', 'INPUT scale factor', 1, {'0.5'}));%行默认变为原来的0.5倍K2 =str2double(inputdlg('请输入行缩放倍数', 'INPUT scale factor', 1, {'0.5'}));%列默认变为原来的0.5倍width = K1 * B(1); %缩放后的图像宽度height = K2 * B(2); %缩放后的图像高度for p=1:3imgn(:,:,p) = uint8(zeros(round(width),round(height))); %创建输出图像矩阵,round是进行数值取整endwidthScale = B(1)/width; %列缩放倍数的倒数heightScale = B(2)/height;%行缩放倍数的倒数for q=1:3for x = 5:width - 5 % 5是为了防止矩阵超出边界溢出for y = 5:height - 5oldX = x * widthScale; % oldX,oldY为原坐标,x,y为新坐标oldY = y * heightScale;if(oldX/double(uint16(oldX)) == 1.0) && (oldY/double(uint16(oldY)) == 1.0) %判断oldx,oldy是否为整数imgn(x,y,q) = img(int16(oldX),int16(oldY),q);elsea = double(round(oldX));b = double(round(oldY)); %若不是整数四舍五入后把临近值赋过去imgn(x,y,q) = img(a,b,q);endendendendimshow(imgn);title('最邻近插值缩放');endif func==3H=1; %索引pix中第一个元素,即高度W=2; %索引pix中第二个元素,即宽度angle=str2double(inputdlg('请输入旋转角度', 'INPUT scale factor', 1, {'45'})); %要旋转的角度,旋转方向为顺时针img=imread(I); %这里v为原图像的高度,u为原图像的宽度B=size(img); %读入高度和宽度theta=angle/180*pi; %将角度单位换算成弧度单位rot=[cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1]; %寻求坐标所用到的旋转矩阵pix1=[1 1 1]*rot; %变换后图像左上点的坐标pix2=[1 B(2) 1]*rot; %变换后图像右上点的坐标pix3=[B(1) 1 1]*rot; %变换后图像左下点的坐标pix4=[B(1) B(2) 1]*rot; %变换后图像右下点的坐标height=round(max([abs(pix1(H)-pix4(H))+0.5 abs(pix2(H)-pix3(H))+0.5])); %变换后图像的高度,为避免溢出要加上0.5,相当于进一法width=round(max([abs(pix1(W)-pix4(W))+0.5 abs(pix2(W)-pix3(W))+0.5])); %变换后图像的宽度for p=1:3imgn(:,:,p)=zeros(height,width); %创建图像输出矩阵enddelta_y=abs(min([pix1(H) pix2(H) pix3(H) pix4(H)])); %取得y方向的负轴超出的偏移量(Y轴坐标是向下的)delta_x=abs(min([pix1(W) pix2(W) pix3(W) pix4(W)]));%取得x方向的负轴超出的偏移量for q=1:3for y=1-delta_y:height-delta_yfor x=1-delta_x:width-delta_xpix=[y x 1]/rot;if pix(H)>=0.5 && pix(W)>=0.5 && pix(H)<=B(1) && pix(W)<=B(2)imgn(y+delta_y,x+delta_x,q)=img(round(pix(H)),round(pix(W)),q);endendendendimshow(uint8(imgn));title('最近邻插值旋转');end。

matlab实现图像的放大及旋转

matlab实现图像的放大及旋转

实验三图像的几何操作一、图像的基本运算1、加法运算图像相加一般用于对同一场景的多幅图像求平均效果,以便有效地降低具有叠加性质的随机噪声。

直接采集的图像品质一般都较好,不需要进行加法运算处理,但是对于那些经过长距离模拟通信方式传送的图像(如卫星图像),这种处理是必不可少的。

在MA TLAB7.0中,如果要进行两幅图像的加法,或者给一幅图像加上一个常数,可以调用imadd函数来实现。

imadd函数将某一幅输入图像的每一个像素值与另一幅图像相应的像素值相加,返回相应的像素值之和作为输入图像。

imadd函数的调用格式可参考图像处理的工具箱。

下面的程序可将图1两幅图像叠加在一起,叠加效果如图2所示。

imshow('rice.png');imshow('cameraman.tif');I=imread('rice.png');J=imread('cameraman.tif');K=imadd(I,J,'uint16');%大小必须一样imshow(K,[])图1 图2给图像的每一个像素加上一个常数可以使图像的亮度增加。

例如以下程序示例的处理效果如图3所示。

I=imread('rice.png');J=imadd(I,50);subplot(1,2,1),imshow(I);subplot(1,2,2),imshow(J);图32、减法运算图像减法也称为差分方法,是一种常用于检测图像变化及运动物体的图像处理方法。

图像减法可以作为许多图像处理过程的准备步骤。

例如,可以使用图像减法来检测一系列相同场景图像的差异。

图像减法与阈值化处理的综合使用通常是建立机器视觉系统最有效的方法之一。

当然,在利用图像减法处理图像时,往往需要考虑背景的更新机制,尽量补偿因天气、光线等因素对图像显示效果造成的影响。

在MATLAB7.0中,使用imsubtract函数可以将一幅图像从另一幅图像中减去,或者从一幅图像中减去一个常数。

MATLAB图像处理之平移,旋转,倾斜,放缩

MATLAB图像处理之平移,旋转,倾斜,放缩

MATLAB图像处理之平移,旋转,倾斜,放缩实验内容:如何对号灰度图像(或彩色图像)进行方所、平移、旋转和综合变换实验内容一:图像的放缩实验程序:%注意,当处理图像大小过大时,请先使用size函数得出矩阵大小,否则处理之后图像会提示内存不足,或者先压缩图像,又或者可以改变电脑运行内存,具体方法可以根据具体情况通过论坛查询,这里就不再过多赘述. x1=imread('0045.jpg');%导入真彩图片0045.jpg,是三维矩阵b=imresize(x1,20);%将原图像放大20倍c=imresize(x1,0.05);%将原图像缩小为原来的20倍figure,subplot(131),imshow(x1),title('原始图像');%此区域内显示1行3列个图像,该图像位于第1个,显示x1的图像,并命名为“原始图像”subplot(132),imshow(b),title('放大20倍');%此区域内显示1行3列个图像,该图像位于第2个,显示b的图像,并命名为“放大200倍”subplot(133),imshow(c),title('缩小20倍');%此区域内显示1行3列个图像,该图像位于第3个,显示c的图像,并命名为“缩小20倍”实验结果:实验内容二:图像的旋转实验程序:clear allclc%imrotate(A,angle,method,bbox)%功能:将矩阵(图片)A旋转任意角度%参数:A——待操作矩阵,angle——需要旋转的角度,method——插值方法,bbox——输出图像大小%将矩阵A旋转angle度(任意),其中angle应用角度制表示;method包括'nearest'、'bilinear'、%'bicubic'分别为“邻近插值法”、“双线性插值法”、“三次卷积插值法”;%bbox(Bounding ? ? box defining size of output image)包括'crop'、'loose',%分别表示将旋转后的图像剪裁为输入图像大小后输出和已旋转后图像大小输出%x1=imread('0045.jpg');%导入真彩图片0045.jpg,是三维矩阵x2=rot90(x1,1);%将图片旋转整数倍个90度figure;%生成图像subplot(272);%此区域生成2行7列个图像,该图像位于第2个imshow(x1);%显示x1生成的图像title('原始图像');%命名x1图像为“原始图像”subplot(275);%此区域生成2行7列个图像,该图像位于第5个imshow(x2);%显示x2生成的图像title('旋转90度');%命名x1图像为“旋转90度”x3=imrotate(x1,30,'nearest','loose');%使用最邻近法逆时针将图像旋转30度,使用loose形式输出图像x5=imrotate(x1,30,'nearest','crop');%使用最邻近法逆时针将图像旋转30度,使用crop形式输出图像x4=imrotate(x1,30,'bilinear','crop');%使用双线性插值法逆时针将图像旋转30度,使用crop形式输出图像x6=imrotate(x1,30,'bilinear','loose');%使用双线性插值法逆时针将图像旋转30度,使用loose形式输出图像subplot(278);%此区域生成2行7列个图像,该图像位于第8个imshow(x3);%显示x3生成的图像title('最邻近法逆时针旋转30度1');%命名x3图像为“最邻近法逆时针旋转30度”subplot(2,7,12);%此区域生成2行7列个图像,该图像位于第12个imshow(x4);%显示x4生成的图像title('双线性插值法逆时针旋转30度1');%命名x4图像为“双线性插值法逆时针旋转30度”subplot(2,7,10);%此区域生成2行7列个图像,该图像位于第10个imshow(x5);%显示x5生成的图像title('最邻近法逆时针旋转30度2');%命名x5图像为“最邻近法逆时针旋转30度2”subplot(2,7,14);%此区域生成2行7列个图像,该图像位于第14个imshow(x6);%显示x6生成的图像title('双线性插值法逆时针旋转30度2');%命名x6图像为“双线性插值法逆时针旋转30度2”实验结果:实验内容三:图像的平移3.1将图像从一个位置平移到另一个位置实验程序:x1=imread('0045.jpg');%导入真彩图片0045.jpg,是三维矩阵figure(1);%生成图像subplot(121),imshow(x1),title('原始图像');%此区域生成1行2列个图像,该图像位于第1个,并命名为“原始图像”,显示x1的图像se1=translate(strel(1),[100 -100]);%形态学膨胀后j1就是平移后的图像j1=imdilate(x1,se1);%对x1,se1进行膨胀操作subplot(122),imshow(j1),title('左下平移');%此区域生成1行2列个图像,该图像位于第2个,并命名为“左下平移”,显示j1的图像实验结果:实验内容四:图像的倾斜实验程序:A=imread('0045.jpg');%将图像导入工作区tform=affine2d([2 0.33 0;0 1 0;0 0 1]);%创建定义仿射几何变换的affine2d 对象B=imwarp(A,tform);%使用 imwarp 对图像应用几何变换。

matlab图片旋转

matlab图片旋转
clear;clc;
I = imread('lena.png');
angle = deg2rad(45);%旋转角度
[Height,Weight,map] = size(I);%获取图片信息
NHeight = round(Weight*sin(angle) + Height*cos(angle));%旋转后图像的高度
0 0 1]; %平移矩阵
for i = 1 : Height %将原图像中各个点的坐标变换为新图像的坐标
for j = 1 :Weight
X1= M1*M2*M3*[i;j;1];
u =int32(X1(1));
0 0 1]; %平移矩阵
M2 = [cos(angle) sin(angle) 0;
-sin(angle) cos(angle) 0;
0 0 1];%旋转矩阵
M3 = [1 0 -0.5*Weight;
0 -1 0.5*Height;
NWeight = round(Weight*cos(angle) + Height*sin(angle));%旋转后图像的宽度
NewImg = uint8(zeros(NHeight,NWeight,map));%设置背景新图像矩阵
M1 = [1 Biblioteka 0.5*NWeight; 0 -1 0.5*NHeight;
NewImg(i,j,1)=temp1;
NewImg(i,j,2)=temp2;
NewImg(i,j,3)=temp3;
else
temp1=NewImg(i,j,1);
temp2=NewImg(i,j,2);

图像旋转MATLAB代码实现

图像旋转MATLAB代码实现

图像旋转MATLAB代码实现图像旋转MATLAB代码实现插值时采用了最近点法和双线性插值,结果与imrotate函数进行了比较。

myImrotate.m%实现Imrotate函数.clc;clear all;close all;Img=imread('E:\eye.bmp');Img=double(Img);[h w]=size(Img);alpha=pi/4; %逆时针旋转的角度wnew=w*cos(alpha)+h*sin(alpha); %新图像的宽widthhnew=w*sin(alpha)+h*cos(alpha); %新图像的高heighthwnew=ceil(wnew); %取整hnew=ceil(hnew);u0=w*sin(alpha); %平移量T=[cos(alpha),sin(alpha);-sin(alpha),cos(alpha)]; %变换矩阵Imgnew2=zeros(hnew,wnew);Imgnew1=zeros(hnew,wnew);for u=1:hnew %u和v是新图像坐标,变换到原图像坐标x和y 中。

for v=1:wnewtem=T*([u;v]-[u0;0]);x=tem(1);y=tem(2);if x>=1&x<=h&y>=1&y<=w %若变换出的x和y在原图像范围内x_low=floor(x);x_up=ceil(x);y_low=floor(y);y_up=ceil(y);if (x-x_low)<=(x_up-x) %采用最近点法,选取距离最近点的像素赋给新图像x=x_low;elsex=x_up;endif (y-y_low)<=(y_up-y)y=y_low;elsey=y_up;endp1=Img(x_low,y_low); %双线性插值,p1到p4是(x,y)周围的四个点p2=Img(x_up,y_low);p3=Img(x_low,y_low);p4=Img(x_up,y_up);s=x-x_low;t=y-y_low;Imgnew1(u,v)=Img(x,y);Imgnew2(u,v)=(1-s)*(1-t)*p1+(1-s)*t*p3+(1-t)*s*p2+s*t*p4;endendendimshow(Imgnew1,[]); figure;imshow(Imgnew2,[]);B=imrotate(Img,alpha/pi*180); figure;imshow(B,[]);。

matlab绕轴旋转代码

matlab绕轴旋转代码

matlab绕轴旋转代码(最新版)目录1.MATLAB 简介2.绕轴旋转的基本概念3.MATLAB 中绕轴旋转的实现方法4.实例:使用 MATLAB 编写绕轴旋转代码5.总结正文一、MATLAB 简介MATLAB(Matrix Laboratory)是一款广泛应用于科学计算、数据分析和可视化的编程软件。

它基于矩阵计算,具有丰富的函数库和强大的数据处理能力,是工程技术人员和科研人员的重要工具之一。

二、绕轴旋转的基本概念绕轴旋转是指将一个物体(如矩阵、向量或图像)沿着某个轴(如 x 轴、y 轴或 z 轴)旋转一定角度。

在 MATLAB 中,绕轴旋转常用于二维或三维图像处理、信号处理等领域。

三、MATLAB 中绕轴旋转的实现方法在 MATLAB 中,可以使用以下方法实现绕轴旋转:1.使用旋转矩阵:根据旋转轴和旋转角度,构造一个旋转矩阵,然后将需要旋转的矩阵或向量乘以旋转矩阵,得到旋转后的结果。

2.使用函数:MATLAB 提供了一些函数,如 rotation、imrotate 等,可以直接用于绕轴旋转。

四、实例:使用 MATLAB 编写绕轴旋转代码下面是一个使用 MATLAB 进行绕轴旋转的示例:假设有一个二维向量 A(大小为 3x3):```matlabA = [1, 2, 3;4, 5, 6;7, 8, 9];```现在要将向量 A 绕 y 轴旋转 90 度,可以使用以下代码:```matlab% 计算旋转矩阵R = rotation(0, 1, 0); % 绕 y 轴旋转,旋转角度为 90 度% 计算旋转后的向量A_rotated = A * R;```运行上述代码,可以得到绕 y 轴旋转 90 度后的向量 A_rotated:```A_rotated =7, 8, 9;1, 2, 3;4, 5, 6;```五、总结通过以上示例,我们可以看到在 MATLAB 中,可以使用旋转矩阵或相关函数轻松实现绕轴旋转操作。

matlab中rotate函数用法

matlab中rotate函数用法

一、介绍Matlab中rotate函数Matlab是一种常用的数学计算软件,其中的rotate函数可以用来对图形进行旋转操作。

在Matlab中,rotate函数的用法非常灵活,可以通过指定旋转角度、旋转中心和旋转轴来实现对图形的旋转操作。

本文将详细介绍rotate函数的用法,包括参数的设置和示例演示,帮助读者更好地理解和使用这一函数。

二、rotate函数的基本用法1. 旋转角度rotate函数的参数中,可以指定旋转的角度。

通过调整旋转角度,可以实现不同角度的旋转效果。

当旋转角度为90度时,图形会顺时针或逆时针旋转90度;当旋转角度为180度时,图形会倒转180度;当旋转角度为360度时,图形会复原至初始状态。

2. 旋转中心rotate函数中还可以指定旋转的中心点。

旋转中心点是指图形旋转的中心位置,可以通过坐标来设定。

通过调整旋转中心,可以实现不同位置的旋转效果。

当旋转中心在图形的中心位置时,图形会围绕中心点旋转;当旋转中心在图形的边缘位置时,图形会围绕边缘旋转。

3. 旋转轴rotate函数中还可以指定旋转的轴向。

旋转轴是指图形旋转的方向,可以通过指定x轴、y轴或z轴来进行旋转。

通过调整旋转轴,可以实现不同方向的旋转效果。

当以x轴为旋转轴时,图形会在水平方向上旋转;当以y轴为旋转轴时,图形会在垂直方向上旋转;当以z轴为旋转轴时,图形会在深度方向上旋转。

三、rotate函数的示例演示下面通过一个具体的示例来演示rotate函数的用法。

假设有一个矩形图形,我们希望对该图形进行旋转操作,使其绕中心点逆时针旋转90度。

可以按照以下步骤使用rotate函数实现:```matlab创建一个矩形图形rectangle = rectangle('Position', [0 0 5 3]);将图形绘制在坐标系中axis([-5 5 -5 5]);设置旋转中心rotateCenter = [2.5 1.5 0];设置旋转角度rotateAngle = 90;设置旋转轴rotateAxis = [0 0 1];对图形进行旋转操作rotate(rectangle, rotateAxis, rotateAngle, rotateCenter);```通过以上代码,我们成功实现了对矩形图形的旋转操作。

图像旋转代码MATLAB

图像旋转代码MATLAB
图像旋转
图像旋转的简单介绍 图像旋转的几何原理 插值方法 图像旋转仿真结果 不同插值方法的评价
一、图像旋转介绍
数字图像处理是计算机图像处理软件的一项核 心技术。在数字图像处理过程中, 经常要用到 旋转, 例如: ①图像扫描输入时常发生位置倾斜, 对其进行倾斜校正需要对图像进行旋转; ②在 多幅图像比较和模式识别中, 要对图像进行旋 转操作; ③在图像的剪裁和拼接前, 也要对图像 作旋转处理……。因此图像的旋转是数字图像 处理的一个非常重要的环节,目前已广泛地应 用于军事、航空、生物医学等方面。
两次插值方法图像
双线性插值方法
评价指标结果比较
插值方法
MSD
PD%
T
最近邻插值
43.1082
0.1438
0.96
双线性插值
48.7637
0.1424
1
双三线性插值
42.9536
0.1415
6.45
THANKS!
感谢下 载
①计算E和F的灰度值g(E),g(F)
②计算点 的灰度值
三、插值方法(5)
3、双三插值法
双三插值法则考虑到 点周围16 个邻点对它的影响。如图7 所示的是用三次多项式进行内插的方法,则该点像素的灰度 值为
上式中:
三、插值方法(6)
四、图像旋转结果分析(1)
1、图像旋转(以30度为例)
二、图像旋转的几何原理(9)
旋转后新图像的坐标与旋转前原图像坐标之间的关系
式(2.8)的逆变换为
二、图像旋转的几何原理(10)
对于新图中的每一点(x1,y1),可以根据公式(2.9)求出对应原图中的(x0, y0),得到它的灰度,如果超出原图范围,则填成黑色。

图形旋转与叠加

图形旋转与叠加

第三次作业:1.编写matlab程序,实现绕图像中心的任意角度图像旋转;2.编写matlab函数,实现两幅图像的任意比例叠加;说实话,我在这一次作业上花的时间比较多,,由于确实对这写还算感兴趣吧,,并且还打算在最后自己做一款手机段的应用软件(App),所以比较认真的完成了图形旋转与叠加部分,说实话,对于旋转,在上课的时候听的比较懂,心想不就几个公式吗,直接套不就完了,但后来实际操作起来的时候却不尽其然,,最开始我从原图向新图映射,映射过去如果不是整数的话,我就没法进行插值处理,开始一直找不到原因,后来向教员请教了之后知道应该从新图向原图映射,一下子恍然大悟,(姜还是老的辣啊),然后一下子有了很大进展,但是后来发现,图像旋转后的情况变化很大,比如旋转后长宽会变,即是要将新图的大小适当扩大,不然就会出现旋转后出现某个地方少了一块的现象:就像这样:左边是旋转后的图像,右边是原图,,为了使新图把原图所有的都保留下来,我就想到了两种解决方法:1.将新图扩大2.将新图缩小(指原图部分的像素)第二个方法貌似就是课件上的那种:(教学课件上的是图片大小没变,但人物被缩小了)不过,我选择前面的实现方法,因为感觉前一种会比较简单(=_=!),但后来发现实际上都差不多。

不过我选的是前者:我推到了一个公式(就不用公式编辑了,直接把我代码部分表示公式的部分贴出来):这是按照坐标变换公式推导的:然后这样做了以后,得到了这样的结果:效果还不错,非常开心。

(当然,,=_+,,在这个过程中还有多细节的收获,这里就不在一一细说了,反正通过这个编程我对matlab编程学到了很多,也积累了很多经验,,这些是那些从网上直接荡个代码粘贴上来的人永远体会不到的,算了不多说了,说多了就成愤青了)然后我又学习了一下matlab的GUI编程,简单做了一个GUI交互性的程序:下面是几个测试截图:好了就展示这么多,,,(这个程序我最大的疑惑就是和matlab自带的imrotate速度上相差的比较远,但是下面我还会研究的,,如果不行,就用c来写)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图像旋转MATLAB代码实现插值时采用了最近点法和双线性插值,结果与imrotate函数进行了比较。

myImrotate.m
%实现Imrotate函数.
clc;clear all;close all;
Img=imread('E:\eye.bmp');
Img=double(Img);
[h w]=size(Img);
alpha=pi/4; %逆时针旋转的角度
wnew=w*cos(alpha)+h*sin(alpha); %新图像的宽width
hnew=w*sin(alpha)+h*cos(alpha); %新图像的高heighth
wnew=ceil(wnew); %取整
hnew=ceil(hnew);
u0=w*sin(alpha); %平移量
T=[cos(alpha),sin(alpha);-sin(alpha),cos(alpha)]; %变换矩阵
Imgnew2=zeros(hnew,wnew);Imgnew1=zeros(hnew,wnew);
for u=1:hnew %u和v是新图像坐标,变换到原图像坐标x和y中。

for v=1:wnew
tem=T*([u;v]-[u0;0]);
x=tem(1);
y=tem(2);
if x>=1&x<=h&y>=1&y<=w %若变换出的x和y在原图像范围内
x_low=floor(x);
x_up=ceil(x);
y_low=floor(y);
y_up=ceil(y);
if (x-x_low)<=(x_up-x) %采用最近点法,选取距离最近点的像素赋给新图像x=x_low;
else
x=x_up;
end
if (y-y_low)<=(y_up-y)
y=y_low;
else
y=y_up;
end
p1=Img(x_low,y_low); %双线性插值,p1到p4是(x,y)周围的四个点p2=Img(x_up,y_low);
p3=Img(x_low,y_low);
p4=Img(x_up,y_up);
s=x-x_low;
t=y-y_low;
Imgnew1(u,v)=Img(x,y);
Imgnew2(u,v)=(1-s)*(1-t)*p1+(1-s)*t*p3+(1-t)*s*p2+s*t*p4;
end
end
end
imshow(Imgnew1,[]); figure;imshow(Imgnew2,[]);
B=imrotate(Img,alpha/pi*180); figure;imshow(B,[]);。

相关文档
最新文档