基于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图像处理的鱼眼图像矫正一、问题描述通过鱼眼摄取图像,可以在相同的条件下获得更大的视野,但与此同时,所带来的负面影响就是图像的失真,直线变为曲线,平面变为曲面等等,为了获得更大的视野,有做到获取更为真实的图像,需要对鱼眼图像进行矫正,通过与真实图像,和鱼眼图像的对应控制点对比,推导出相应的几何关系,通过几何变换,获取更为真实的图像。
二、基本方法基于matlab图像处理的鱼眼图像矫正主要包括:真实图像的载入与控制点的选择、鱼眼图像的读取与控制点的选择、控制点间几何变换关系推导、鱼眼图像的矫正四个关键环节。
基本流程如图所示:三、参考文献1.《基于圆分割的鱼眼镜头图像畸变校正算法》作者张琨王翠荣东北大学学报:自然科学版2011,32(9)tp391.412.鱼眼图像矫正算法的matlab实现提供者:林庆道 四、小组成员及初步分工崔孝洋(102685):控制点的选取,几何关系的推导王文浩(102631):图像矫正,算法判别及优化下面资料为赠送的地产广告语不需要的下载后可以编辑删除就可以,谢谢选择,祝您工作顺利,生活愉快!地产广告语1、让世界向往的故乡2、某沿河楼盘:生活,在水岸停泊3、一江春水一种人生4、某钱塘江边楼盘:面对潮流经典依旧5、海景房:站在家里,海是美景;站在海上,家是美景6、以山水为卖点的楼盘:山水是真正的不动产7、某城区的山腰上的楼盘:凌驾尊贵俯瞰繁华8、某地势较高的楼盘:高人,只住有高度的房子9、某学区房:不要让孩子输在起跑线上10、尾盘:最后,最珍贵11、回家就是度假的生活12、生命就该浪费在美好的事情上我们造城——2、我的工作就是享受生活——3、我家的客厅,就是我的生活名片——4、在自己的阳台看上海的未来——5、公园不在我家里我家住在公园里——6、这里的花园没有四季——7、***,装饰城市的风景——8、***,我把天空搬回家——9、房在林中,人在树下——10、生活,就是居住在别人的爱慕里——11、到〖星河湾〗看看好房子的标准——12、好生活在〖珠江〗——13、爱家的男人住〖百合〗城市岸泊:城市的岸泊,生活的小镇生活之美不缺少,在于发现情趣不在于奢华,在于精彩生活有了美感才值得思考……玫瑰庄园:山地生态,健康人生卓越地段,超大社区一种完整且完善的环境,像原生一样和谐原生景象自然天成人本理念精品建筑知名物业智能安防诚信为本实力铸造比华利山庄:海岸生活——引领世界的生活方式海岸生活——22公里的奢华海岸生活——高尚人生的序曲海岸生活——人与自然的融合苹果二十二院街:人文自然现代铺的蔓伸荣和山水美地:让世界向往的故乡香港时代:时代精英开拓未来领衔建筑,彰显尊贵绿地崴廉公寓:金桥40万平方米德国音乐艺术生活汇都国际:昆明都心,城市引擎财富之都风情之都梦幻之都文化之都商贸之都西部首座巨型商业之城颠峰商圈的原动力,缔造西部财富新领地新江湾城:绿色生态港国际智慧城新江湾城,一座承载上海新梦想的城区上海城投,全心以赴建设知识型,生态型花园城区风和日丽:入住准现楼,升值在望湾区大户,空中花园大格局下的西海岸市中心:市中心少数人的专属颠峰珍贵市中心的稀世名宅正中心城市颠峰领地颠峰勾勒稀世名宅繁华不落幕的居家风景地利皇者尽得先机稀世经典180席阳光国际公寓:阳光金桥来自纽约的生活蓝本钟宅湾:海峡西岸生态人居休闲商务区汇聚国际财富与人居梦想的绝版宝地二十一世纪是城市的世纪,二十一世纪也是海洋的世纪谁控制了海洋,谁就控制了一切站在蓝色海岸的前沿,开启一个新的地产时代东南门户海湾之心海峡西岸生态人居休闲商务区让所有财富的目光聚集钟宅湾,这里每一天都在创造历史上海A座(科维大厦):创富人生的黄金眼掘金上海!创富人生!远东大厦:花小公司的钱,做大公司的事未来城:无可挑战的优势无可限量的空间绿地集团:居住问题的答疑者,舒适生活的提案人茶马驿栈:精明置业时机享受附加值财富最大化雪山下的世外桃源茶马古道上千年清泉之乡金地格林春岸:城市精英的梦想家园繁华与宁静共存,阔绰身份不显自露建筑覆盖率仅20%,令视野更为广阔占据最佳景观位置,用高度提炼生活完美演绎自然精髓,谱写古城新篇章创新房型推陈出新,阔气空间彰显不凡365天的贴身护卫,阔度管理以您为尊金地格林小城:心没有界限,身没有界限春光永驻童话之城我的家,我的天下东渡国际:梦想建筑,建筑梦想齐鲁置业:传承经典,创新生活比天空更宽广的是人的思想创新远见生活嘉德中央公园:一群绝不妥协的居住理想家完成一座改变你对住宅想象的超越作品极至的资源整合丰富住家的生活内涵苛求的建造细节提升住家的生活品质地段优势,就是永恒价值优势设计优势,就是生活质量优势景观优势,就是生命健康优势管理优势,就是生活品味优势空中华尔兹:自然而来的气质,华尔兹的生活等级享受,没有不可逾越的极限所谓完美的习惯,是舒适空间的心情定格!临江花园:经典生活品质风景中的舞台美林别墅:源欧美经典纯自然空间住原味别墅赏园林艺术淡雅怡景温馨自然钱江时代:核心时代,核心生活核心位置创意空间优雅规划人文景观财富未来城市精神,自然风景,渗透私人空间泰达时尚广场:是球场更是剧场城市经济活力源时尚天津水舞中国未来都会休闲之居创意时尚天天嘉年华健康快乐新境界商旅新天地缔造好生意城市运营战略联盟,参与协作,多方共赢华龙碧水豪园:浪漫一次,相守一生东方莱茵:品鉴品位宜家宜人建筑一道贵族色彩品鉴一方美学空间品位一份怡然自得荡漾一股生命活力坐拥一处旺地静宅体会一种尊崇感受常青花园(新康苑):新康苑生活感受凌驾常规大非凡生活领域成功人士的生活礼遇拥有与自己身份地位相等的花园社区在属于自己的宴会餐厅里会宾邀朋只与自己品味爱好相同的成功人士为邻孩子的起步就与优越同步酒店式物管礼遇拥有[一屋两公园前后是氧吧]的美极环境水木清华:住在你心里福星惠誉(金色华府):金色华府,市府街才智名门——释放生命的金色魅力真正了解一个人,要看他的朋友,看他的对手。
理想透镜衍射matlab
理想透镜衍射matlab
在MATLAB中,可以使用物理光学工具箱来模拟理想透镜的衍射
效应。
衍射是光通过边缘或孔径时发生的偏折现象,理想透镜的衍
射模拟可以帮助我们理解光的传播规律和光学系统的性能。
首先,我们需要定义理想透镜的参数,包括透镜的曲率半径、
折射率等。
然后,我们可以使用MATLAB中的衍射函数(例如fft2)来模拟透镜的衍射效应。
具体步骤如下:
1. 定义透镜参数,包括透镜的孔径大小、曲率半径、折射率等
参数。
2. 生成输入光场,可以使用MATLAB中的函数生成一个表示入
射光场的二维矩阵,可以是单色光或者白光。
3. 衍射计算,使用MATLAB中的快速傅里叶变换函数fft2对输
入光场进行衍射计算,得到透镜后的光场分布。
4. 显示结果,可以使用MATLAB中的图像显示函数imshow来显
示衍射后的光场分布,观察衍射效应。
在模拟理想透镜的衍射过程中,需要考虑透镜的孔径大小、入射光波长、透镜的焦距等因素,这些参数都会影响衍射效应的模拟结果。
此外,还可以通过调整透镜参数、入射光场的波前形状等来进一步探究理想透镜的衍射特性。
总的来说,通过MATLAB中物理光学工具箱提供的函数和工具,我们可以比较直观地模拟理想透镜的衍射效应,从而更好地理解光学系统的行为。
希望这个回答能够帮到你,如果你有更多关于理想透镜衍射模拟的问题,欢迎继续提问。
透镜matlab编程
1.0269
1.1798
1.3333
1.4865
1.6381
1.7870
1.9319
2.0715
2.2044
2.3292
2.4444
2.5490
2.6415
2.7211
2.7868
2.8380
2.8742
2.8951
2.9009
2.8916
2.8677
2.8297
2.7783
2.7144
0.3185
0.3381
0.3577
0.3774
0.3970
0.4167
0.4363
0.4559
0.4756
0.4952
0.5148
0.5345
0.5541
0.5737
0.5934
0.6130
0.6326
0.6523
0.6719
0.6915
0.7112
0.7308
0.7445
0.7581
0.7718
n=length(x);
y1=x;
y1(1)=y0;
for i=1:n-1
K1=f(x(i),y1(i));
K2=f(x(i)+h/2,y1(i)+h/2*K1);
K3=f(x(i)+h/2,y1(i)+h/2*K2);
K4=f(x(i)+h,y1(i)+h*K3);
y1(i+1)=y1(i)+h/6*(K1+2*K2+2*K3+K4);
如题,用的这篇文章的公式编的M程序,程序和运行结构如下,x(i)为角度,y(i)为文章中的Z2.算出来的结果好像不符合,请大家给点意见。
利用Matlab进行机器视觉与图像处理的技巧与方法
利用Matlab进行机器视觉与图像处理的技巧与方法导语:机器视觉与图像处理是当今科学技术领域中备受关注的热门研究方向。
利用Matlab这一功能强大的软件平台,可以实现诸多机器视觉与图像处理的任务。
本文将介绍如何利用Matlab进行机器视觉与图像处理,包括图像读取与显示、图像增强与滤波、图像分割与对象检测等多个方面的技巧与方法。
一、图像读取与显示在进行机器视觉与图像处理的任务之前,首先需要将图像从外部文件读取到Matlab中,并进行显示。
Matlab提供了丰富的函数来实现这一过程。
其中,`imread`函数用于读取图像文件,`imshow`函数用于显示图像。
例如,下面的代码演示了如何读取名为“image.jpg”的图像文件,并将其显示在Matlab窗口中:```image = imread('image.jpg');imshow(image);```二、图像增强与滤波图像增强与滤波是图像处理的重要任务,可以提升图像的质量与清晰度。
Matlab提供了多种图像增强与滤波的函数,如直方图均衡化`histeq`函数、图像平滑滤波`imfilter`函数等。
下面通过一个例子来演示如何利用Matlab进行图像增强与滤波:```image = imread('image.jpg');enhanced_image = histeq(image); %直方图均衡化smoothed_image = medfilt2(enhanced_image); %中值滤波imshow(smoothed_image);```三、图像分割与对象检测图像分割是将图像划分为不同的区域或对象的过程,是机器视觉与图像处理的核心任务之一。
Matlab提供了多种图像分割的函数,如基于阈值的分割`im2bw`函数、基于边缘的分割`edge`函数等。
下面通过一个例子来演示如何利用Matlab进行图像分割与对象检测:```image = imread('image.jpg');gray_image = rgb2gray(image); %将彩色图像转为灰度图像binary_image = im2bw(gray_image, 0.5); %基于阈值的二值分割edges = edge(binary_image, 'Canny'); %Canny边缘检测imshow(edges);```四、图像特征提取与描述子匹配图像特征提取与描述子匹配是机器视觉与图像处理中的关键任务,可以用于对象识别、运动跟踪等应用。
立体视觉系统的参数标定的Matlab实现
立体视觉系统的参数标定的Matlab实现立体视觉系统是一种获得三维图像的方法,它可以模拟人类的双眼视觉,从而对场景进行深度感知。
在立体视觉系统中,常常需要进行参数标定,以确定相机的内部参数和外部参数,从而建立相机坐标系和世界坐标系之间的映射关系,实现对场景的深度感知。
在Matlab中实现立体视觉系统的参数标定,需要进行以下几步:1. 采集图像首先需要对立体视觉系统进行校准,以获取相机的内部参数和外部参数。
校准过程中需要采集多组不同位置的图像,以覆盖场景的不同视角。
可以使用Matlab中的Camera Calibration Toolbox来进行相机校准和图像采集。
2. 提取特征点采集图像后,需要对每张图像提取相应的特征点,以便进行匹配和三维重建。
可以使用Matlab中的SURF(Speeded Up Robust Feature)算法或SIFT(Scale-Invariant Feature Transform)算法来提取图像特征点。
3. 特征点匹配特征点提取完成后,需要对每组图像进行特征点匹配,以确定它们之间的对应关系。
可以使用Matlab中的基于特征的图像匹配算法(如SURF匹配算法)来进行特征点匹配。
4. 计算基本矩阵根据特征点匹配结果,可以计算每对相机之间的基本矩阵,它表示了两个相机之间的本质关系。
可以使用Matlab中的八点法算法来计算基本矩阵。
5. 计算相机姿态和位移基本矩阵计算完成后,根据相机内部参数和外部参数,我们可以计算出每个相机的姿态和位移,以确定相机坐标系和世界坐标系之间的映射关系。
可以使用Matlab中的平移向量和旋转矩阵来计算相机的姿态和位移。
6. 三维重建根据相机的姿态和位移,以及特征点匹配结果,我们可以进行三维重建,以生成场景的三维模型。
可以使用Matlab中的三角测量算法来进行三维重建。
综上所述,Matlab提供了完整的立体视觉系统参数标定解决方案,包括相机校准、特征点提取、特征点匹配、基本矩阵计算、相机姿态和位移计算、以及三维重建等一系列工具和算法,方便我们进行立体视觉系统的开发和应用。
实验4 图像几何变换—哈哈镜制作
实验4 图像几何变换—哈哈镜制作一. 实验目的熟悉图像的基本格式和数据结构。
掌握图像几何变换的原理。
二.实验原理1. 图像平移将图像中所有的点都按照指定的平移量水平、垂直移动。
设(x 0, y 0)是原图像上的一点,图像水平平移量为t x ,垂直平移量为t y ,则平移后点(x 0, y 0)的坐标变为(x 1, y 1)。
(x 0, y 0)与(x 1, y 1)之间的关系为:1010xy x x t y y t =+⎧⎨=+⎩ (1)以矩阵的形式表示为:1010100110011x y x t x y t y ⎛⎫⎛⎫⎛⎫ ⎪ ⎪⎪= ⎪⎪⎪ ⎪ ⎪⎪⎝⎭⎝⎭⎝⎭(2)它的逆变换:0101100110011x y x t x y t y -⎛⎫⎛⎫⎛⎫ ⎪ ⎪⎪=- ⎪⎪⎪ ⎪ ⎪⎪⎝⎭⎝⎭⎝⎭(3)平移后的图像中每个像素的颜色是由原图像中的对应点颜色确定的。
图像平移处理流程如图1所示。
2. 图像旋转通常是以图像的中心为圆心旋转,按顺时针方向旋转,如图2所示。
旋转前:00cos sin x r by r b =⎧⎨=⎩ (4)旋转a 角度后:()()100100cos cos cos sin sin sin sin sin cos cos sin sin cos x r b a r b a r b a x cona y a y r b a r b a r b a x a y a=-=+=+=-=-=+ (5)以矩阵的形式表示为:图2 旋转示意图1010cos sin 0sin cos 010011x a a x y a a y ⎛⎫⎛⎫⎛⎫ ⎪ ⎪⎪=- ⎪ ⎪⎪ ⎪ ⎪⎪⎝⎭⎝⎭⎝⎭(6)(6)式中,坐标系是以图像的中心为原点,向右为x 轴正方向,向上为y 轴正方向。
它和以图像左上角为原点,向右为x 轴正方向,向下为y 轴正方向的坐标系之间的转换关系如图3所示。
图3 两种坐标系间的转换关系图设图像的宽度为w ,高度为h ,容易得到:100.5010.510011x w x y h y I I ⎛⎫⎛⎫⎛⎫ ⎪ ⎪⎪=- ⎪ ⎪⎪ ⎪ ⎪⎪⎝⎭⎝⎭⎝⎭ⅡⅡ (7)逆变换为:100.5010.510011x w x y h y I I -⎛⎫⎛⎫⎛⎫ ⎪ ⎪⎪=- ⎪ ⎪⎪ ⎪ ⎪⎪⎝⎭⎝⎭⎝⎭ⅡⅡ (8)有了以上公式,可以把变换分成三步:第一步,将坐标系Ⅰ变成Ⅱ; 第二步,将该点顺时针旋转a 角度; 第三步,将坐标系Ⅱ变回Ⅰ。
基于MATLAB语言的数字图像处理实验(GUI)
数字图像处理实验报告——基于MATLAB语言的图像处理软件姓名:班级:学号:专业:目录1.设计目的 (2)2.设计要求 (2)3.总体设计 (2)4.模块设计 (3)4.1图像的读取、保存和程序退出 (3)4.2图像转化为灰度图像 (5)4.3底片处理(反色) (6)4.4截图 (6)4.5亮度和对比度度调节 (6)4.6图像的翻转与旋转 (7)4.7添加噪声 (9)4.8平滑和锐化 (10)4.9直方图均衡化处理 (11)4.10图像的腐蚀和膨胀 (12)4.11边缘检测 (13)4.12还原和撤销 (16)5.结果分析 (17)5.1转为灰度图像 (17)5.2底片处理 (17)5.3截图 (17)5.4亮度和对比度调节 (18)5.5图像翻转与旋转 (19)5.6添加噪声、平滑和锐化 (20)5.7直方图均衡化 (23)5.8腐蚀和膨胀 (24)5.9边缘检测 (25)6.心得体会 (26)7.附录代码 (27)1.设计目的利用MATLAB的GUI程序设计一个简单实用的图像处理程序。
该程序应具备图像处理的常用功能,以满足要求。
2.设计要求设计程序有以下基本功能:1)图像的读取和保存2)图像转化为灰度图像3)底片处理(反色)4)截图5)亮度和对比度度调节6)图像的翻转与旋转7)添加噪声8)平滑和锐化9)直方图均衡化处理10)图像的腐蚀和膨胀11)边缘检测3.总体设计软件的总体设计界面布局如上图所示,主要分为2个区域:显示区域与操作区域。
显示区域:显示原图像,以及效果图,即处理前与处理后的图像。
操作区域:通过功能键实现对图像的各种处理。
在图中可见,界面左边和下方为一系列功能按键如“转为灰度图像”、“撤销”、“还原”等等;界面正中部分为图片显示部分。
设计完成后运行的软件界面如下:4.模块设计以下介绍各个功能模块的功能与实现4.1图像的读取、保存和程序退出通过Menu Editor 创建如下菜单,通过以下菜单来实现“载入图像”、“保存图像”、“退出”的功能。
课程设计报告---基于Matlab的图像放缩技术
数字图像处理课程设计基于Matlab的图像放缩技术院系:信息科学与技术学院专业班级:电子0801班姓名:学号:2011年1月8日1.设计目标图像放缩处理存在较大失真,本设计要求输入一副图像,经放大或缩小后,使输出图像尽量减少失真度。
可采用插值算法(最近邻插值和双线性插值法),使图像内物体的边界得以保持,尽可能减少失真度。
通过本次设计加强对数字图像处理的理解。
2.设计原理:2.1 最近邻插值法所谓的最近邻法,即输出图像像素的灰度值等于离它所映射到的位置最近的输入像素的灰度值。
现在假设放大或缩小后的图像的某一像素映射到原图像的像素坐标为(2.2, 4.0),想要得到这个坐标对应的灰度,那么比较简单的方法是用四舍五入方法来得到距离该点最近的像素,即像素(2, 4)的值来代替,当然这并不十分的精确,如果用这个方法进行图像放大,那么在比例较大的情况下就会出现明显的“马赛克”现象。
2.2 双线性插值法双线性插值法,即通过已知输入四点灰度内插输出点灰度,将临近的像素点的灰度值按一定比例混合而成,离哪个像素近,哪个像素的比例就大些。
具体原理如下:令f(x,y)为两个变量的函数,其在单位正方形顶点的值已知,要通过插值得到正方形内任意点的灰度值,则可由双曲线方程=)++(,axbycxyf+dyx(2-1)来定义的一个双曲抛物面与四个已知点拟合。
从a到d这四个系数需由已知的四个顶点的f(x,y)灰度值拟合。
首先,对上端的两个顶点进行线性插值,可得fxx+f=f-)0,0()0,1(0,0([)])0,(f(2-2)同理,对底端的两个顶点进行线性插值,可得fxxf-=+f1,0((f)1,1()])1,)1,0([(2-3)最后,进行垂直方向的线性插值,可得xyfxff=+f-xy)]()1,(0,[)0,,)((x(2-4)将式(2-2)、式(2-3)代入式(2-4),展开等式并合并同类项,可得xffyfffyf-f+-=++f+--x[)1,1([)])0,0()0,1()0,0()]1,0(f0,0(,(fxy)1,0()[)0,1()]0,0(该式形式类似于式(2-1),因此是双线性的。
数字图像水平镜像,垂直镜像和平移的matlab编程
(x0,y0)为原图像上一点,图像水平平移量为tx,垂直平移量为ty,平移后的点为(x1,y1)x1=x0+tx;y1=y0+ty,转换后x0=x1-tx;y0=y1-ty这样平移后的图像上的每一点都可以在原图像中找到对应的点,可以根据x0和y0的值,判断原来的点是否在图像中,如果超出了原来图像的范围,就把点(x1,y1)的值设置成0(黑色)和255(白色).int OriginX;int OriginY;for(int i=0;i<gray->height;i++){for(int j=0;j<gray->width;j++){OriginX=j-m_XOffset;OriginY=i-m_YOffset;//if((OriginX>0)&&(OriginX<tran->width)&&(OriginY>0)&&(OriginY<tran->height))if(OriginX<0 || OriginY<0)((uchar *)(tran->imageData+i*tran->widthStep))[j]=0;else((uchar *)(tran->imageData+i*tran->widthStep))[j]=((uchar *)(gray->imageData+OriginY*gray->widthStep))[OriginX];;}}镜像原理for(int i=0;i<gray->height;i++){for(int j=0;j<gray->width;j++){OriginX=(gray->width-j);OriginY=i;((uchar *)(tran->imageData+i*tran->widthStep))[j]=((uchar *)(gray->imageData+OriginY*gray->widthStep))[OriginX];}}转置,在构建目标图时,要高度值和宽度值进行互换,转换时,目标坐标进行互换!gray=cvCreateImage(cvSize(plmg->width,plmg->height),IPL_DEPTH_8U,1);tran=cvCreateImage(cvSize(gray->height,gray->width),IPL_DEPTH_8U,1);cvCvtColor(plmg,gray,CV_BGR2GRAY);int OriginX;int OriginY;for(int i=0;i<gray->height;i++){for(int j=0;j<gray->width;j++){OriginX=i;OriginY=j;//((uchar *)(tran->imageData+i*tran->widthStep))[j]=((uchar *)(tran->imageData+OriginY*tran->widthStep))[OriginX];((uchar *)(tran->imageData+i*tran->widthStep))[j]=((uchar *)(gray->imageData+OriginY*gray->widthStep))[OriginX];}}扩大,缩放的算法plmg=cvLoadImage(lpszPathName,-1);gray=cvCreateImage(cvSize(plmg->width,plmg->height),IPL_DEPTH_8U,1);tran=cvCreateImage(cvSize((int)(gray->width*fXZoomRatio+0.5),(int)(gray->height*fYZoomRatio+0.5)),IPL_DEPTH_8U,1); //首先要设定缩放后的大小,加上0.5是为了四舍五入.cvCvtColor(plmg,gray,CV_BGR2GRAY);float OriginX;float OriginY;for(int i=0;i<tran->height;i++){for(int j=0;j<tran->width;j++){OriginX=j/fXZoomRatio+0.5;//原始坐标也要进行四舍五入OriginY=i/fYZoomRatio+0.5;((uchar *)(tran->imageData+i*tran->widthStep))[j]=((uchar *)(gray->imageData+((int)OriginY)*gray->widthStep))[(int)OriginX];//用的是领近插值法}}cvNamedWindow("Image",1);cvShowImage("Image",tran);旋转的算法x0=x1cos(Q)+y1sin(Q)-ccos(Q)-dsin(Q)+ay0=-x1sin(Q)+y1cos(Q)+csin(Q)-dcos(Q)+b旋转以后图像会变大,先以原图像中心为坐标系原点,求得原图像四个点的坐标,就可以求得新图像的宽度和高度,以这两个参数设置输出的参数.用以上两个公式计算原始图像和输出图像的匹配点.LONG i0;LONG j0;IplImage* Img;IplImage* gray;IplImage* dst;Img=cvLoadImage(lpszPathName,-1);gray=cvCreateImage(cvSize(Img->width,Img->height),IPL_DEPTH_8U,1);//dst=cvCreateImage(cvSize(Img->width,Img->height),IPL_DEPTH_8U,1);cvCvtColor(Img,gray,CV_BGR2GRAY);LONG lWidth=Img->width;LONG lHeight=Img->height;//原始图像的高和宽像素值float fSina=0.5;float fCosa=0.866;// 源图四个角的坐标(以图像中心为坐标系原点)float fSrcX1,fSrcY1,fSrcX2,fSrcY2,fSrcX3,fSrcY3,fSrcX4,fSrcY4;// 旋转后四个角的坐标(以图像中心为坐标系原点)float fDstX1,fDstY1,fDstX2,fDstY2,fDstX3,fDstY3,fDstX4,fDstY4;// 计算原图的四个角的坐标(以图像中心为坐标系原点)fSrcX1 = (float) (- (lWidth - 1) / 2);fSrcY1 = (float) ( (lHeight - 1) / 2);fSrcX2 = (float) ( (lWidth - 1) / 2);fSrcY2 = (float) ( (lHeight - 1) / 2);fSrcX3 = (float) (- (lWidth - 1) / 2);fSrcY3 = (float) (- (lHeight - 1) / 2);fSrcX4 = (float) ( (lWidth - 1) / 2);fSrcY4 = (float) (- (lHeight - 1) / 2);// 计算新图四个角的坐标(以图像中心为坐标系原点)fDstX1 = fCosa * fSrcX1 + fSina * fSrcY1;fDstY1 = -fSina * fSrcX1 + fCosa * fSrcY1;fDstX2 = fCosa * fSrcX2 + fSina * fSrcY2;fDstY2 = -fSina * fSrcX2 + fCosa * fSrcY2;fDstX3 = fCosa * fSrcX3 + fSina * fSrcY3;fDstY3 = -fSina * fSrcX3 + fCosa * fSrcY3;fDstX4 = fCosa * fSrcX4 + fSina * fSrcY4;fDstY4 = -fSina * fSrcX4 + fCosa * fSrcY4;// 计算旋转后的图像实际宽度LONG lNewWidth = (LONG)(max(fabs(fDstX4 - fDstX1), fabs(fDstX3 - fDstX2)) + 0.5);// 计算旋转后的图像高度LONG lNewHeight = (LONG)(max(fabs(fDstY4 - fDstY1), fabs(fDstY3 - fDstY2)) + 0.5);dst=cvCreateImage(cvSize(lNewWidth,lNewHeight),IPL_DEPTH_8U,1);float f1 = (float) (-0.5 * (lNewWidth - 1) * fCosa - 0.5 * (lNewHeight - 1) * fSina + 0.5 * (lWidth - 1));float f2 = (float) ( 0.5 * (lNewWidth - 1) * fSina - 0.5 * (lNewHeight - 1) * fCosa + 0.5 * (lHeight - 1));for(int i=0;i<dst->height;i++){for(int j=0;j<dst->width;j++){// 计算该象素在源DIB中的坐标i0 = (LONG) (-((float) j) * fSina + ((float) i) * fCosa + f2 + 0.5);j0 = (LONG) ( ((float) j) * fCosa + ((float) i) * fSina + f1 + 0.5);if((j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight)){((uchar *)(dst->imageData+i*dst->widthStep))[j]=((uchar *)(gray->imageData+i0*gray->widthStep))[j0];}else{((uchar *)(dst->imageData+i*dst->widthStep))[j]=0;}}}cvNamedWindow("Image",1);cvShowImage("Image",dst);c。
基于MATLAB的图像处理算法综合应用算法开发
基于MATLAB的图像处理算法综合应用算法开发(一)实验类型:研究(二)实验目的:1、培养应用MATLAB开发图像处理算法的能力。
2、掌握开发综合性图像算法的技能与方法。
(三)实验内容:弹孔中心位置的图像处理方法。
(四)实验要求:开发出算法及程序代码,并获得处理结果。
其基本原理是,先对图像进行边缘检测,后应用数学形态学的方法将边缘连接在一起,后填充,应用数学形态学方法对分割弹孔圆形化,再进行边缘检测获得弹孔边缘,最后应用最小二乘法拟合圆心的方法,获得弹孔中心。
实验过程:打开MATLAB软件,在OPEN中选择我们在软件中设计好的算法程序。
clear;close all;I0=imread('pic.jpg');%I0=rgb2gray(I3);[x,y,z]=size(I0);%I6=im2bw(I3,0.4);I4=edge(I0,'canny',0.1);BW=strel('disk',1);BW2=strel('disk',1);I5=imdilate(I4,BW);I6=imfill(I5,'holes');I7=imdilate(I6,BW2);BW3=strel('disk',3);I8=imerode(I7,BW3);I81=imfill(I8,'holes');BW4=strel('disk',7);I9=imerode(I81,BW4);BW5=strel('disk',7);I10=imopen(I9,BW5);figure(1),imshow(I0);figure(2),imshow(I4);figure(3),imshow(I5);figure(4),imshow(I6);figure(5),imshow(I7);figure(6),imshow(I8);figure(7),imshow(I9);figure(8),imshow(I10);hold on;boundaries = bwboundaries(I5);[mun1,mun2]=size(boundaries);for k=1:mun1b = boundaries{k};plot(b(:,2),b(:,1),'g','LineWidth',3);hold on;bt1=b(:,1);bt2=b(:,2);[cir_x,cir_y,radis]=circlefitting(bt1,bt2);plot(cir_y,cir_x,'r*','LineWidth',3);end然后选择run。
matlab 鱼眼矫正公式
matlab 鱼眼矫正公式鱼眼矫正是一种常见的图像处理技术,用于将鱼眼镜头拍摄的图像进行畸变校正,使其更符合人眼的观察习惯。
在Matlab中,可以使用不同的方法来实现鱼眼矫正,其中一个常见的方法是使用多项式畸变校正模型。
下面是一个简单的示例代码,演示了如何在Matlab中实现鱼眼矫正:matlab.% 假设有一个鱼眼图像fisheyeImage需要进行矫正。
fisheyeImage = imread('fisheyeImage.jpg');% 获取图像尺寸。
[height, width, ~] = size(fisheyeImage);% 定义畸变校正参数。
focalLength = 800; % 焦距。
k1 = 0.2; % 畸变参数。
% 计算图像中心。
centerX = width / 2;centerY = height / 2;% 生成网格。
[X, Y] = meshgrid(1:width, 1:height);% 将网格坐标转换为极坐标。
theta = atan2(Y centerY, X centerX);r = hypot(X centerX, Y centerY);% 应用畸变校正公式。
rCorrected = r . (1 + k1 r.^2 / focalLength^2);% 将极坐标转换回直角坐标。
Xcorrected = rCorrected . cos(theta) + centerX; Ycorrected = rCorrected . sin(theta) + centerY; % 对校正后的坐标进行插值,得到校正后的图像。
correctedImage = zeros(height, width, 3);for i = 1:3。
correctedImage(:,:,i) = interp2(X, Y,double(fisheyeImage(:,:,i)), Xcorrected, Ycorrected); end.% 显示原始图像和校正后的图像。
如何使用MATLAB进行图像处理和计算机视觉
如何使用MATLAB进行图像处理和计算机视觉第一章:MATLAB 图像处理基础图像处理是计算机视觉领域中的重要组成部分,而MATLAB是一种强大的数值计算和数据分析工具,也是图像处理和计算机视觉研究的常用工具之一。
本章将介绍MATLAB中的图像处理基础知识,并介绍如何使用MATLAB进行图像的加载、显示和保存。
1.1 MATLAB中的图像处理函数MATLAB提供了丰富的图像处理函数,包括图像的加载和保存、图像的显示和绘制、图像的滤波和增强等。
常用的图像处理函数包括imread、imshow、imwrite、imfilter等。
1.2 图像的加载和显示使用imread函数可以加载图像,imread函数可以读取各种格式的图像文件,如PNG、JPEG、BMP等。
使用imshow函数可以显示图像,并提供了多种显示选项,如调整图像的亮度、对比度等。
1.3 图像的保存使用imwrite函数可以保存图像到指定的文件中,可以保存为各种格式的图像文件,如PNG、JPEG、BMP等。
同时,imwrite函数也支持指定图像的压缩质量和压缩格式。
第二章:图像滤波和增强图像滤波和增强是图像处理中重要的操作,可以用于去除图像中的噪声、增强图像的细节等。
MATLAB提供了丰富的图像滤波和增强函数,本章将介绍常用的图像滤波和增强方法,并结合MATLAB中的函数进行实例演示。
2.1 图像平滑使用平滑滤波可以去除图像中的噪声,常用的平滑滤波方法有均值滤波、中值滤波和高斯滤波等。
MATLAB中的imfilter函数可以实现这些滤波方法,根据需要选择不同的参数进行滤波操作。
2.2 图像锐化图像锐化可以增强图像的细节和边缘,常用的图像锐化方法有拉普拉斯锐化和梯度锐化等。
MATLAB中的imfilter函数和imgradient函数可以实现这些锐化方法,同样需要根据需求选择不同的参数。
2.3 对比度增强对比度增强可以增强图像的视觉效果,而不改变图像的色彩信息。
(趣味哈哈镜)图像处理算法的实现
(趣味哈哈镜)图像处理算法的实现⿁影特效:package functions;import javax.media.*;import javax.media.Effect;import javax.media.format.*;import javax.media.Buffer;import javax.media.ResourceUnavailableException;public class NegativeEffect implements Effect {private static String EffectName = "NegativeEffect"; // 类名protected RGBFormat inputFormat; // 输⼊的RGB ⾊彩格式protected RGBFormat outputFormat; // 输出的RGB ⾊彩格式protected Format[] supportedInputFormats; // 所有⽀持的输⼊格式protected Format[] supportedOutputFormats; // 所有⽀持的输出格式// 构造⽅法,实例化所有⽀持的输⼊输出⾊彩为RGB ⾊彩格式public NegativeEffect() {supportedInputFormats = new Format[] { new RGBFormat() };supportedOutputFormats = new Format[] { new RGBFormat() };}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回所有⽀持的输⼊格式public Format[] getSupportedInputFormats() {/** @todo Implement this javax.media.Codec method */// throw new ng.UnsupportedOperationException("Method// getSupportedInputFormats() not yet implemented.");System.out.println("getSupportedInputFormats");return supportedInputFormats;}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回所有⽀持的输出格式public Format[] getSupportedOutputFormats(Format parm1) {/** @todo Implement this javax.media.Codec method */// throw new ng.UnsupportedOperationException("Method// getSupportedOutputFormats() not yet implemented.");System.out.println("getSupportedOutputFormats [in = " + parm1 + "]");// 如果传⼊的Format 对象parm1 不是GRBFormat 实例,则返回默认的RGBFormat 格式对象if (parm1 == null)return supportedOutputFormats;if (!(parm1 instanceof RGBFormat))return new Format[0];// 如果是,根据该格式返回⼀个对象引⽤RGBFormat irf = (RGBFormat) parm1;RGBFormat orf = (RGBFormat) parm1.clone();return new Format[] { orf };}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回传⼊的数据格式public Format setInputFormat(Format parm1) {/** @todo Implement this javax.media.Codec method */// throw new ng.UnsupportedOperationException("Method// setInputFormat() not yet implemented.");System.out.println("setInputFormat [input = " + parm1 + "]");inputFormat = (RGBFormat) parm1;return (Format) inputFormat;}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回传⼊的数据格式public Format setOutputFormat(Format parm1) {/** @todo Implement this javax.media.Codec method */// throw new ng.UnsupportedOperationException("Method// setOutputFormat() not yet implemented.");System.out.println("setOutputFormat [ output = " + parm1 + "]");outputFormat = (RGBFormat) parm1;return (Format) outputFormat;}// 不⼀定要实现的两个⽅法,仅仅满⾜getXXX,setXXX 的对称性public Format getInputFormat() {System.out.println("getInputFormat");return inputFormat;}public Format getOutputFormat() {System.out.println("getOutputFormat");return outputFormat;}// 实现Effect 接⼝继承⾃Codec 的⽅法,处理输⼊的媒体数据parm1,得到经处理的输出的媒体数据parm2// 该⽅法完成本类的效⽤,处理媒体数据,达到使⾊彩反⾊输出的处理效果// 是本类的核⼼⽅法public int process(Buffer parm1, Buffer parm2) {/** @todo Implement this javax.media.Codec method */// throw new ng.UnsupportedOperationException("Method process()// not yet implemented.");Object o1 = parm1.getData(); // 获得输⼊的数据对象的引⽤int inLength = parm1.getLength(); // 输⼊的数据的长度int inOffset = parm1.getOffset(); // 偏移量// 如果输⼊输出的媒体数据⾮合法的short[] int[]形式,返回出错信息if (!(o1 instanceof short[]) && !(o1 instanceof int[])&& !(o1 instanceof byte[])) return this.BUFFER_PROCESSED_FAILED;Object o2 = parm2.getData();if (o2 != null) {if (!(o2 instanceof short[]) && !(o2 instanceof int[])&& !(o1 instanceof byte[])) return this.BUFFER_PROCESSED_FAILED;} else {// 根据输⼊的数据长度,设置输出的数据长度if (o1 instanceof short[])parm2.setData(new short[inLength]);else if (o1 instanceof int[])parm2.setData(new int[inLength]);elseparm2.setData(new byte[inLength]);o2 = parm2.getData();}// 根据输⼊的数据偏移量,设置输出的数据偏移量int outOffset = parm2.getOffset();if (o1 instanceof short[]) {short[] inData = (short[]) o1;short[] outData = (short[]) o2;// 处理输⼊的媒体数据,似的⾊彩反⾊,并将数据放⼊输出的媒体数据对象中 for (int i = 0; i < inLength; i++)outData[outOffset++] = (short) ~inData[inOffset++];} else if (o1 instanceof int[]){int[] inData = (int[]) o1;int[] outData = (int[]) o2;for (int i = 0; i < inLength; i++)outData[outOffset++] = ~inData[inOffset++];}else {byte[] inData = (byte[]) o1;byte[] outData = (byte[]) o2;for (int i = 0; i < inLength; i++)outData[outOffset++] = (byte)~inData[inOffset++];}// 设置输出媒体数据的格式parm2.setFormat(outputFormat);// 设置输出媒体数据的长度和偏移parm2.setLength(inLength);parm2.setOffset(0);// 返回数据处理成功完成信息return this.BUFFER_PROCESSED_OK;}// 返回类名public String getName() {/** @todo Implement this javax.media.PlugIn method */// throw new ng.UnsupportedOperationException("Method getName() // not yet implemented.");System.out.println("getName");return EffectName;}// 以下的⽅法不⼀定要求实现,这些⽅法是Effect 接⼝的⽗类的上层类// 如javax.media.Controls、javax.media.PlugIn 的⽅法public void open() throws javax.media.ResourceUnavailableException {/** @todo Implement this javax.media.PlugIn method */// throw new ng.UnsupportedOperationException("Method open() not // yet implemented.");System.out.println("open");}public void close() {/** @todo Implement this javax.media.PlugIn method */// throw new ng.UnsupportedOperationException("Method close() not // yet implemented.");System.out.println("close");}public void reset() {/** @todo Implement this javax.media.PlugIn method */// throw new ng.UnsupportedOperationException("Method reset() not // yet implemented.");System.out.println("reset");}public Object[] getControls() {/** @todo Implement this javax.media.Controls method */// throw new ng.UnsupportedOperationException("Method// getControls() not yet implemented.");System.out.println("getControls");return new Controls[0];}public Object getControl(String parm1) {/** @todo Implement this javax.media.Controls method */// throw new ng.UnsupportedOperationException("Method // getControl() not yet implemented.");System.out.println("getControl [controlType = " + parm1 + "]");try {Class cls = Class.forName(parm1);Object[] cs = this.getControls();for (int i = 0; i < cs.length; i++) {if (cls.isInstance(cs[i])) {return cs[i];}}return null;} catch (Exception err) {return null;}}}中⼼内凹特效:package functions;import java.awt.Dimension;import javax.media.*;import javax.media.format.*;/**** @author hp* 只⽀持RGB,每个分量⽤⼀个8位字节* 视频流是byte数组*/public class HahajingEffect implements Effect {private static String EffectName = "HahajingEffect"; // 类名protected RGBFormat inputFormat; // 输⼊的⾊彩格式protected RGBFormat outputFormat; // 输出的⾊彩格式protected Format[] supportedInputFormats; // 所有⽀持的输⼊格式 protected Format[] supportedOutputFormats; // 所有⽀持的输出格式 // 构造⽅法,实例化所有⽀持的输⼊输出⾊彩为RGB ⾊彩格式public HahajingEffect() {supportedInputFormats = new Format[] { new RGBFormat()};supportedOutputFormats = new Format[] { new RGBFormat() };}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回所有⽀持的输⼊格式 public Format[] getSupportedInputFormats() {return supportedInputFormats;}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回所有⽀持的输出格式 public Format[] getSupportedOutputFormats(Format parm1) {if (parm1 == null)return supportedOutputFormats;if (!(parm1 instanceof RGBFormat))return new Format[0];// 如果是,根据该格式返回⼀个对象引⽤RGBFormat orf = (RGBFormat) parm1.clone();return new Format[] { orf };}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回传⼊的数据格式public Format setInputFormat(Format parm1) {System.out.println("setInputFormat [input = " + parm1 + "]");inputFormat = (RGBFormat) parm1;return (Format) inputFormat;}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回传⼊的数据格式public Format setOutputFormat(Format parm1) {/** @todo Implement this javax.media.Codec method */// throw new ng.UnsupportedOperationException("Method // setOutputFormat() not yet implemented.");System.out.println("setOutputFormat [ output = " + parm1 + "]");outputFormat = (RGBFormat) parm1;return (Format) outputFormat;}// 不⼀定要实现的两个⽅法,仅仅满⾜getXXX,setXXX 的对称性 public Format getInputFormat() {System.out.println("getInputFormat");return inputFormat;}public Format getOutputFormat() {System.out.println("getOutputFormat");return outputFormat;}// 实现Effect 接⼝继承⾃Codec 的⽅法,处理输⼊的媒体数据parm1,得到经处理的输出的媒体数据parm2 // 该⽅法完成本类的效⽤,处理媒体数据,// 是本类的核⼼⽅法public int process(Buffer parm1, Buffer parm2) {// this.setInputFormat(parm1.getFormat()); // 设置输⼊格式// this.setOutputFormat(parm1.getFormat());// 获取输⼊格式的视频分辨率Dimension size = ((VideoFormat) parm1.getFormat()).getSize();int inWidth = size.width;int inHeight = size.height;Object srcData = parm1.getData(); // 获得输⼊的数据对象的引⽤// System.out.println(srcData.getClass().toString());// 如果输⼊输出的媒体数据⾮合法的short[] int[]形式,返回出错信息if (!(srcData instanceof byte[]))return this.BUFFER_PROCESSED_FAILED;Object outputData = null; // parm2.getData();if (outputData != null) {if (!(srcData instanceof byte[]))return this.BUFFER_PROCESSED_FAILED;}outputData = this.hahajingMirror((byte[]) srcData, 0.0, inWidth, inHeight, inWidth / 2, inHeight / 2);parm2.setData(outputData);int inLength = parm1.getLength(); // 输⼊的数据的长度int inOffset = parm1.getOffset(); // 偏移量// 设置输出媒体数据的格式parm2.setFormat(parm1.getFormat());// 设置输出媒体数据的长度和偏移parm2.setLength(inLength);parm2.setOffset(inOffset);// 返回数据处理成功完成信息return this.BUFFER_PROCESSED_OK;}// 返回类名public String getName() {/** @todo Implement this javax.media.PlugIn method */// throw new ng.UnsupportedOperationException("Method getName()// not yet implemented.");System.out.println("getName");return EffectName;}// 以下的⽅法不⼀定要求实现,这些⽅法是Effect 接⼝的⽗类的上层类// 如javax.media.Controls、javax.media.PlugIn 的⽅法public void open() throws javax.media.ResourceUnavailableException {/** @todo Implement this javax.media.PlugIn method */// throw new ng.UnsupportedOperationException("Method open() not// yet implemented.");System.out.println("open");}public void close() {/** @todo Implement this javax.media.PlugIn method */// throw new ng.UnsupportedOperationException("Method close() not// yet implemented.");System.out.println("close");}public void reset() {/** @todo Implement this javax.media.PlugIn method */// throw new ng.UnsupportedOperationException("Method reset() not// yet implemented.");System.out.println("reset");}public Object[] getControls() {/** @todo Implement this javax.media.Controls method */// throw new ng.UnsupportedOperationException("Method// getControls() not yet implemented.");System.out.println("getControls");return new Controls[0];}public Object getControl(String parm1) {/** @todo Implement this javax.media.Controls method */// throw new ng.UnsupportedOperationException("Method// getControl() not yet implemented.");System.out.println("getControl [controlType = " + parm1 + "]");try {Class cls = Class.forName(parm1);Object[] cs = this.getControls();for (int i = 0; i < cs.length; i++) {if (cls.isInstance(cs[i])) {return cs[i];}}return null;} catch (Exception err) {return null;}}private byte[] hahajingMirror(byte[] srcData, double factor, int w, int h, int x, int y) {int cenX = x;int cenY = y;int newX = 0;//新坐标int newY = 0;int offsetX = 0;int offsetY = 0;int radius = 0;double theta = 0;byte[] tempData = (byte[]) srcData.clone();int length = srcData.length;for (int j = 0; j < h; j++) {for (int i = 0; i < w; i++) {int tX = i - cenX;int tY = j - cenY;theta = Math.atan2((double) tY, (double) tX);radius = (int) Math.sqrt((double) (tX * tX + tY * tY));int newR = (int) (Math.sqrt((double) radius) * 12);newX = cenX + (int) (newR * Math.cos(theta));newY = cenY + (int) (newR * Math.sin(theta));if (newX > 0 && newX < w) {offsetX = newX;} else {newX = 0;}if (newY > 0 && newY < h) {offsetY = newY;} else {newY = 0;}int tempLocation1 = i * 3 + j * w * 3;int tempLocation2 = i * 3 + 1 + j * w * 3;int tempLocation3 = i * 3 + 2 + j * w * 3;int srcLocation1 = newX * 3 + newY * w * 3;int srcLocation2 = newX * 3 + 1 + newY * w * 3;int srcLocation3 = newX * 3 + 2 + newY * w * 3;if ((tempLocation1 <= length)&& (tempLocation2 <= length) && (tempLocation3 <= length) && (srcLocation1 <= length) && (srcLocation2 <= length) && (srcLocation3 <= length)) { tempData[tempLocation1] = srcData[srcLocation1];tempData[tempLocation2] = srcData[srcLocation2];tempData[tempLocation3] = srcData[srcLocation3];}}}return tempData;}}纵向拉长特效:package functions;import java.awt.Dimension;import javax.media.*;import javax.media.format.*;/**** @author hp* 只⽀持RGB,每个分量⽤⼀个8位字节* 视频流是byte数组*/public class HahajingEffect2 implements Effect {private static String EffectName = "HahajingEffect"; // 类名protected RGBFormat inputFormat; // 输⼊的⾊彩格式protected RGBFormat outputFormat; // 输出的⾊彩格式protected Format[] supportedInputFormats; // 所有⽀持的输⼊格式protected Format[] supportedOutputFormats; // 所有⽀持的输出格式// 构造⽅法,实例化所有⽀持的输⼊输出⾊彩为RGB ⾊彩格式public HahajingEffect2() {supportedInputFormats = new Format[] { new RGBFormat()};supportedOutputFormats = new Format[] { new RGBFormat() };}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回所有⽀持的输⼊格式public Format[] getSupportedInputFormats() {return supportedInputFormats;}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回所有⽀持的输出格式public Format[] getSupportedOutputFormats(Format parm1) {if (parm1 == null)return supportedOutputFormats;if (!(parm1 instanceof RGBFormat))return new Format[0];// 如果是,根据该格式返回⼀个对象引⽤RGBFormat orf = (RGBFormat) parm1.clone();return new Format[] { orf };}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回传⼊的数据格式public Format setInputFormat(Format parm1) {System.out.println("setInputFormat [input = " + parm1 + "]");inputFormat = (RGBFormat) parm1;return (Format) inputFormat;}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回传⼊的数据格式public Format setOutputFormat(Format parm1) {/** @todo Implement this javax.media.Codec method */// throw new ng.UnsupportedOperationException("Method// setOutputFormat() not yet implemented.");System.out.println("setOutputFormat [ output = " + parm1 + "]");outputFormat = (RGBFormat) parm1;return (Format) outputFormat;}// 不⼀定要实现的两个⽅法,仅仅满⾜getXXX,setXXX 的对称性public Format getInputFormat() {System.out.println("getInputFormat");return inputFormat;}public Format getOutputFormat() {System.out.println("getOutputFormat");return outputFormat;}// 实现Effect 接⼝继承⾃Codec 的⽅法,处理输⼊的媒体数据parm1,得到经处理的输出的媒体数据parm2 // 该⽅法完成本类的效⽤,处理媒体数据,// 是本类的核⼼⽅法public int process(Buffer parm1, Buffer parm2) {// this.setInputFormat(parm1.getFormat()); // 设置输⼊格式// this.setOutputFormat(parm1.getFormat());// 获取输⼊格式的视频分辨率Dimension size = ((VideoFormat) parm1.getFormat()).getSize();int inWidth = size.width;int inHeight = size.height;Object srcData = parm1.getData(); // 获得输⼊的数据对象的引⽤// System.out.println(srcData.getClass().toString());// 如果输⼊输出的媒体数据⾮合法的short[] int[]形式,返回出错信息if (!(srcData instanceof byte[]))return this.BUFFER_PROCESSED_FAILED;Object outputData = null; // parm2.getData();if (outputData != null) {if (!(srcData instanceof byte[]))return this.BUFFER_PROCESSED_FAILED;}outputData = this.hahajingMirror((byte[]) srcData, inWidth, inHeight);parm2.setData(outputData);int inLength = parm1.getLength(); // 输⼊的数据的长度int inOffset = parm1.getOffset(); // 偏移量// 设置输出媒体数据的格式parm2.setFormat(parm1.getFormat());// 设置输出媒体数据的长度和偏移parm2.setLength(inLength);parm2.setOffset(inOffset);// 返回数据处理成功完成信息return this.BUFFER_PROCESSED_OK;}// 返回类名public String getName() {/** @todo Implement this javax.media.PlugIn method */// throw new ng.UnsupportedOperationException("Method getName()// not yet implemented.");System.out.println("getName");return EffectName;}// 以下的⽅法不⼀定要求实现,这些⽅法是Effect 接⼝的⽗类的上层类// 如javax.media.Controls、javax.media.PlugIn 的⽅法public void open() throws javax.media.ResourceUnavailableException {/** @todo Implement this javax.media.PlugIn method */// throw new ng.UnsupportedOperationException("Method open() not// yet implemented.");System.out.println("open");}public void close() {/** @todo Implement this javax.media.PlugIn method */// throw new ng.UnsupportedOperationException("Method close() not// yet implemented.");System.out.println("close");}public void reset() {/** @todo Implement this javax.media.PlugIn method */// throw new ng.UnsupportedOperationException("Method reset() not// yet implemented.");System.out.println("reset");}public Object[] getControls() {/** @todo Implement this javax.media.Controls method */// throw new ng.UnsupportedOperationException("Method// getControls() not yet implemented.");System.out.println("getControls");return new Controls[0];}public Object getControl(String parm1) {/** @todo Implement this javax.media.Controls method */// throw new ng.UnsupportedOperationException("Method// getControl() not yet implemented.");System.out.println("getControl [controlType = " + parm1 + "]");try {Class cls = Class.forName(parm1);Object[] cs = this.getControls();for (int i = 0; i < cs.length; i++) {if (cls.isInstance(cs[i])) {return cs[i];}}return null;} catch (Exception err) {return null;}}private byte[] hahajingMirror(byte[] srcData, int w, int h) {int oldX = 0;int oldY = 0;byte[] tempData = (byte[]) srcData.clone();int length = srcData.length;for (int j = 0; j < h; j++) {for (int i = 0; i < w; i++) {oldX = i;//x坐标不变oldY = j/6;//旧的坐标是新y坐标的1/6int tempLocation1 = i * 3 + j * w * 3;int tempLocation2 = i * 3 + 1 + j * w * 3;int tempLocation3 = i * 3 + 2 + j * w * 3;int srcLocation1 = oldX * 3 + oldY * w * 3;int srcLocation2 = oldX * 3 + 1 + oldY * w * 3;int srcLocation3 = oldX * 3 + 2 + oldY * w * 3;if ((tempLocation1 <= length)&& (tempLocation2 <= length) && (tempLocation3 <= length) && (srcLocation1 <= length) && (srcLocation2 <= length) && (srcLocation3 <= length)) { tempData[tempLocation1] = srcData[srcLocation1];tempData[tempLocation2] = srcData[srcLocation2];tempData[tempLocation3] = srcData[srcLocation3];}}}return tempData;}}中轴外凸特效:package functions;import java.awt.Dimension;import javax.media.*;import javax.media.format.*;/**** @author hp* 只⽀持RGB,每个分量⽤⼀个8位字节* 视频流是byte数组*/public class HahajingEffect3 implements Effect {private static String EffectName = "HahajingEffect"; // 类名protected RGBFormat inputFormat; // 输⼊的⾊彩格式protected RGBFormat outputFormat; // 输出的⾊彩格式protected Format[] supportedInputFormats; // 所有⽀持的输⼊格式protected Format[] supportedOutputFormats; // 所有⽀持的输出格式// 构造⽅法,实例化所有⽀持的输⼊输出⾊彩为RGB ⾊彩格式public HahajingEffect3() {supportedInputFormats = new Format[] { new RGBFormat()};supportedOutputFormats = new Format[] { new RGBFormat() };}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回所有⽀持的输⼊格式public Format[] getSupportedInputFormats() {return supportedInputFormats;}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回所有⽀持的输出格式public Format[] getSupportedOutputFormats(Format parm1) {if (parm1 == null)return supportedOutputFormats;if (!(parm1 instanceof RGBFormat))return new Format[0];// 如果是,根据该格式返回⼀个对象引⽤RGBFormat orf = (RGBFormat) parm1.clone();return new Format[] { orf };}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回传⼊的数据格式public Format setInputFormat(Format parm1) {System.out.println("setInputFormat [input = " + parm1 + "]");inputFormat = (RGBFormat) parm1;return (Format) inputFormat;}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回传⼊的数据格式public Format setOutputFormat(Format parm1) {/** @todo Implement this javax.media.Codec method */// throw new ng.UnsupportedOperationException("Method// setOutputFormat() not yet implemented.");System.out.println("setOutputFormat [ output = " + parm1 + "]");outputFormat = (RGBFormat) parm1;return (Format) outputFormat;}// 不⼀定要实现的两个⽅法,仅仅满⾜getXXX,setXXX 的对称性public Format getInputFormat() {System.out.println("getInputFormat");return inputFormat;}public Format getOutputFormat() {System.out.println("getOutputFormat");return outputFormat;}// 实现Effect 接⼝继承⾃Codec 的⽅法,处理输⼊的媒体数据parm1,得到经处理的输出的媒体数据parm2 // 该⽅法完成本类的效⽤,处理媒体数据,// 是本类的核⼼⽅法public int process(Buffer parm1, Buffer parm2) {// this.setInputFormat(parm1.getFormat()); // 设置输⼊格式// this.setOutputFormat(parm1.getFormat());// 获取输⼊格式的视频分辨率Dimension size = ((VideoFormat) parm1.getFormat()).getSize();int inWidth = size.width;int inHeight = size.height;Object srcData = parm1.getData(); // 获得输⼊的数据对象的引⽤// System.out.println(srcData.getClass().toString());// 如果输⼊输出的媒体数据⾮合法的short[] int[]形式,返回出错信息if (!(srcData instanceof byte[]))return this.BUFFER_PROCESSED_FAILED;Object outputData = null; // parm2.getData();if (outputData != null) {if (!(srcData instanceof byte[]))return this.BUFFER_PROCESSED_FAILED;}outputData = this.hahajingMirror((byte[]) srcData, 0.0, inWidth, inHeight, inWidth / 2, inHeight / 2);parm2.setData(outputData);int inLength = parm1.getLength(); // 输⼊的数据的长度int inOffset = parm1.getOffset(); // 偏移量// 设置输出媒体数据的格式parm2.setFormat(parm1.getFormat());// 设置输出媒体数据的长度和偏移parm2.setLength(inLength);parm2.setOffset(inOffset);// 返回数据处理成功完成信息return this.BUFFER_PROCESSED_OK;}// 返回类名public String getName() {/** @todo Implement this javax.media.PlugIn method */// throw new ng.UnsupportedOperationException("Method getName()// not yet implemented.");System.out.println("getName");return EffectName;}// 以下的⽅法不⼀定要求实现,这些⽅法是Effect 接⼝的⽗类的上层类// 如javax.media.Controls、javax.media.PlugIn 的⽅法public void open() throws javax.media.ResourceUnavailableException {/** @todo Implement this javax.media.PlugIn method */// throw new ng.UnsupportedOperationException("Method open() not// yet implemented.");System.out.println("open");}public void close() {/** @todo Implement this javax.media.PlugIn method */// throw new ng.UnsupportedOperationException("Method close() not// yet implemented.");System.out.println("close");}public void reset() {/** @todo Implement this javax.media.PlugIn method */// throw new ng.UnsupportedOperationException("Method reset() not// yet implemented.");System.out.println("reset");}public Object[] getControls() {/** @todo Implement this javax.media.Controls method */// throw new ng.UnsupportedOperationException("Method// getControls() not yet implemented.");System.out.println("getControls");return new Controls[0];}public Object getControl(String parm1) {/** @todo Implement this javax.media.Controls method */// throw new ng.UnsupportedOperationException("Method// getControl() not yet implemented.");System.out.println("getControl [controlType = " + parm1 + "]");try {Class cls = Class.forName(parm1);Object[] cs = this.getControls();for (int i = 0; i < cs.length; i++) {if (cls.isInstance(cs[i])) {return cs[i];}}return null;} catch (Exception err) {return null;}}private byte[] hahajingMirror(byte[] srcData, double factor, int w, int h, int x, int y) {int cenX = x;int cenY = y;int newX = 0;int newY = 0;int R=(int) (Math.sqrt(h*h+w*w)/2);int radius = 0;byte[] tempData = (byte[]) srcData.clone();int length = srcData.length;for (int j = 0; j < h; j++) {for (int i = 0; i < w; i++) {int tX = i - cenX;int tY = j - cenY;radius = (int) Math.sqrt((double) (tX * tX +tY*tY ));if(radius<R) {newX=cenX+tX*radius/R;newY=cenY+tY*radius/R;}int tempLocation1 = i * 3 + j * w * 3;int tempLocation2 = i * 3 + 1 + j * w * 3;int tempLocation3 = i * 3 + 2 + j * w * 3;int srcLocation1 = newX * 3 + newY * w * 3;int srcLocation2 = newX * 3 + 1 + newY * w * 3;int srcLocation3 = newX * 3 + 2 + newY * w * 3;if ((tempLocation1 <= length)&& (tempLocation2 <= length) && (tempLocation3 <= length) && (srcLocation1 <= length) && (srcLocation2 <= length) && (srcLocation3 <= length)) { tempData[tempLocation1] = srcData[srcLocation1];tempData[tempLocation2] = srcData[srcLocation2];tempData[tempLocation3] = srcData[srcLocation3];}}}return tempData;}}复合特效:package functions;import java.awt.Dimension;import javax.media.*;import javax.media.format.*;/**** @author hp* 只⽀持RGB,每个分量⽤⼀个8位字节* 视频流是byte数组*/public class HahajingEffect4 implements Effect {private static String EffectName = "HahajingEffect"; // 类名protected RGBFormat inputFormat; // 输⼊的⾊彩格式protected RGBFormat outputFormat; // 输出的⾊彩格式protected Format[] supportedInputFormats; // 所有⽀持的输⼊格式protected Format[] supportedOutputFormats; // 所有⽀持的输出格式// 构造⽅法,实例化所有⽀持的输⼊输出⾊彩为RGB ⾊彩格式public HahajingEffect4() {supportedInputFormats = new Format[] { new RGBFormat()};supportedOutputFormats = new Format[] { new RGBFormat() };}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回所有⽀持的输⼊格式public Format[] getSupportedInputFormats() {return supportedInputFormats;}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回所有⽀持的输出格式public Format[] getSupportedOutputFormats(Format parm1) {if (parm1 == null)return supportedOutputFormats;if (!(parm1 instanceof RGBFormat))return new Format[0];// 如果是,根据该格式返回⼀个对象引⽤RGBFormat orf = (RGBFormat) parm1.clone();return new Format[] { orf };}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回传⼊的数据格式public Format setInputFormat(Format parm1) {System.out.println("setInputFormat [input = " + parm1 + "]");inputFormat = (RGBFormat) parm1;return (Format) inputFormat;}// 实现Effect 接⼝继承⾃Codec 的⽅法,返回传⼊的数据格式public Format setOutputFormat(Format parm1) {/** @todo Implement this javax.media.Codec method */// throw new ng.UnsupportedOperationException("Method// setOutputFormat() not yet implemented.");System.out.println("setOutputFormat [ output = " + parm1 + "]");outputFormat = (RGBFormat) parm1;return (Format) outputFormat;}// 不⼀定要实现的两个⽅法,仅仅满⾜getXXX,setXXX 的对称性public Format getInputFormat() {System.out.println("getInputFormat");return inputFormat;}public Format getOutputFormat() {System.out.println("getOutputFormat");return outputFormat;}// 实现Effect 接⼝继承⾃Codec 的⽅法,处理输⼊的媒体数据parm1,得到经处理的输出的媒体数据parm2 // 该⽅法完成本类的效⽤,处理媒体数据,// 是本类的核⼼⽅法public int process(Buffer parm1, Buffer parm2) {。
Unity3D用简单的Cube、Sphere实现镜面哈哈镜效果,只需十几秒哦!
Unity3D⽤简单的Cube、Sphere实现镜⾯哈哈镜效果,只需⼗⼏秒哦!Unity实现镜⾯和哈哈镜效果本⽂提供全流程,中⽂翻译。
Chinar 坚持将简单的⽣活⽅式,带给世⼈!(拥有更好的阅读体验 —— ⾼分辨率⽤户请根据需求调整⽹页缩放⽐例)Chinar —— ⼼分享、⼼创新!助⼒快速⽤ Cube 和 Sphere 完成镜⾯效果为新⼿节省宝贵的时间,避免采坑!Chinar 教程效果:全⽂⾼清图⽚,点击即可放⼤观看 (很多⼈竟然不知道)1Hint —— 提⽰提⽰:由于制作过程过于简单本教程仅⽤ Unity 提供的标准 Shader ,来实现仅反射天空盒周边环境的镜⾯效果如果需要实现真实镜⾯,反射所有物体,可直接跳转我的另⼀篇博⽂2Create Resources —— 创建所需资源我们需要的资源有:1:Plane —— 对应需创建⼀个Material,给Plane上⾊(为了当作地⾯、参照物。
不创建也可) 2:⼀个Cube —— 对应需创建⼀个Material,给Cube上⾊其他看图即可理解层次列表结构如下3Finish —— 完成基本做完第⼆步,即可具备镜⾯效果但很多⼈会发现,镜⾯很模糊那是因为分辨率默认值很低,需要在 Lighting 中进⾏设置分辨率越⾼、显⽰效果越清晰、对性能要求越⼤。
请根据⾃⼰需求设置默认值!4Distorting Mirror —— 哈哈镜哈哈镜,同理可做⼀个哈哈镜出来创建⼀个 Sphere /球体、将Cube的材质丢到 Sphere 上即可由于CSDN限制图⽚5M⼀下,图⽚太⾼清导致只能录制10帧。
所以以下动图会很卡5Download Demo —— 下载⽰例贴⼼的 Chinar 为⼤家准备好了 Demo温馨提⽰:其实仔细看教程,是不需要下载Demo的⽀持May Be —— 搞开发,总有⼀天要做的事!拥有⾃⼰的服务器,⽆需再找攻略!Chinar 提供⼀站式教程,闭眼式创建!为新⼿节省宝贵时间,避免采坑!1 ——2 ——3——4 ——技术交流群:806091680 ! Chinar 欢迎你的加⼊END本博客为⾮营利性个⼈原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本⼈所拥有,本⼈保留所有法定权利。
基于MATLAB7.0对数字滤波器的可视化设计与实现
基于MATLAB7.0对数字滤波器的可视化设计与实现
李彬
【期刊名称】《魅力中国》
【年(卷),期】2009(000)025
【摘要】为方便用户的设计,降低设计难度,MATLAB软件中设置了一些综合、简便的图形用户工具,本文主要介绍包括:FDATool(Filter Design & Analysis Tool)和FVTool(Full View Analysis Tool)等工具对数字滤波器的设计方法.
【总页数】2页(P141,132)
【作者】李彬
【作者单位】安阳师范学院物理与电气工程学院,河南,安阳,455000
【正文语种】中文
【中图分类】O17
【相关文献】
1.基于DSP的FIR数字滤波器设计与实现 [J], 付强;杨建军
2.基于Delphi的IIR数字滤波器的设计与实现 [J], 张倩;喻金科
3.基于FPGA的FIR数字滤波器的设计与实现 [J], 熊洁;黄蕾
4.基于LabVIEW的数字滤波器设计与实现 [J], 孟月霞; 张谦; 韩亚丽
5.基于LabVIEW的数字滤波器设计与实现 [J], 陈亮
因版权原因,仅展示原文概要,查看原文内容请购买。
基于VC与MATLAB的全景视觉反射镜设计
基于VC与MATLAB的全景视觉反射镜设计
凌云峰;朱齐丹;甄景蕾;刘海
【期刊名称】《计算机应用与软件》
【年(卷),期】2008(025)004
【摘要】介绍了Visual C+ +和Matlab的特点及其在数学计算、图形显示方面的优势,在分析了全景视觉系统反射镜设计原理的基础上,首次提出应用VC和Matlab 混合编程方法实现反射镜设计.该方法实现了反射镜设计的自动化及可视化,最后介绍了设计实例,实践证明该方法显著提高了系统设计的效率.
【总页数】3页(P199-201)
【作者】凌云峰;朱齐丹;甄景蕾;刘海
【作者单位】哈尔滨工程大学自动化学院,黑龙江,哈尔滨,150001;哈尔滨工程大学自动化学院,黑龙江,哈尔滨,150001;哈尔滨工程大学自动化学院,黑龙江,哈尔
滨,150001;哈尔滨工程大学自动化学院,黑龙江,哈尔滨,150001
【正文语种】中文
【中图分类】TP3
【相关文献】
1.全景式航空相机扫描反射镜及支撑结构设计 [J], 孙建军
2.一种基于凸曲面反射镜的柱面全景图像无缝快速生成系统 [J], 徐玮;王炜;张茂军;吴玲达
3.多维视觉设计透视全景湖北——湖北日报网视觉传达设计宣传的“底气”和“地气” [J], 孙方生;谌若兰
4.基于机器视觉的智能手语识别翻译器设计与实现——评《机器人学、机器视觉与控制:MATLAB算法基础》 [J], 花有清
5.基于机器视觉的智能手语识别翻译器设计与实现——评《机器人学、机器视觉与控制:MATLAB算法基础》 [J], 花有清
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机视觉课程设计实验报告一、题目:哈哈镜的制作三、实验目的:1、掌握几何变换的原理。
2、读入待制作的图片,实现图片的缩小放大、水平外凹、水平外凸、梯形变形、三角形,S 形和波浪型。
四、实验原理:变形处理整体都是一个思路,把原图每一行经过缩放拷到新图的相应行。
每次变形都是在原图的基础上,根据想要变换的图象形状,计算出每一行的起始位,再计算出每一行新的总长度。
1)对于放大、缩小可以根据最近邻插值或者双线性插值来进行变化,放大我们采用了双线性方法,缩小采用了最近邻插值方法。
2)对于水平内凹和水平外凸,以周期为2倍高度的正弦函数来进行变化,变化后远图象的高度坐标不变,宽度坐标以一定比例变化。
3)对于三角形和梯形,原图象高度坐标不变,宽度坐标以线性来进行变化。
4)对于宽度不变的变形,如波浪形,直接一次变形拷贝一整行。
对于高度不变的图形,如S形,也可以用这个方法,或者说是把起始点确定后,将坐标点进行平移。
5)除放大效果外,缩小、水平外凹、水平外凸、梯形变形、三角形,S形和波浪型均采用最近邻插值方法进行变化。
五、实验步骤(附程序主代码):1、打开图象clear;clc; %清空工作空间[filename,pathname]=uigetfile({'*.*','All Files(*.*)'});file=fullfile(pathname,filename);t1=imread(file);t2=rgb2gray(t1); %将打开的彩色图像转换为灰度图imshow(t2)save temp t2;2、缩小load temp t2 %加载打开的图片[m,n]=size(t2);x2=double(t2);for i=1:mfor j=1:nw=round(i*0.5); %宽度缩小为原来一半h=round(j*0.5); %高度缩小为原来一半x3(w,h)=x2(i,j); %最近邻插值,象素值赋给新的图象endendfigure,imshow(mat2gray(x3))3、放大x3=zeros(fix(m*2),fix(n*2)); %开辟空间for i=2:fix((m-1)*2)for j=2:fix((n-1)*2)p=fix(i/2);q=fix(j/2);x3(i,j)=[x2(p+1,q)-x2(p,q)]*(i/2-fix(i/2))+[x2(p,q+1)-x2(p,q)]*(j/2-fix(j/2))+[x2(p+1,q+1)+x2(p,q)-x2(p,q+1)-x2(p+1,q)]*(i/2-fix(i/2))*(j/2-fix(j/2))+x2(p,q); %双线性插值endend4、水平内凹t3(m,n)=0; %开辟新图象空间for i = 1:ma = (2*pi/m)*i; %i转化为弧度形式p=round(abs(30*sin(a/2))+0.5);q=round(-abs(30*sin(a/2))-0.5); % 正弦函数变换,周期为2Mfor j=p:q+nx=i; %变化后高度坐标不变y=round((j-p)*n/((q+n-p+1))); %宽度坐标以(j-p)*n/((q+n-p+1)))比例变化 if (x>0&&x<=m) &&(y>0&&y<=n)t3(i,j)=t2(x,y);elset3(i,j)=255;endendend5、水平外凸a=round(sin(pi/2));t3(m,n+2*a)=0;grade=50;for i =1:mb =2*pi/m*i; %i转化为弧度形式j1=round(abs(sin(2*pi-b/2)*grade+grade)+0.5);j2=round(sin(b/2)*grade-grade-0.5); % 正弦函数变换,周期为2Mfor j=j1:j2+nx=i; %变化后高度坐标不变y=round((j-j1)*n/((j2+n-j1+1))); %宽度坐标以(j-j1)*n/((j2+n-j1+1))比例变化 if (x>0&&x<=m) &&(y>0&&y<=n)t3(i,j)=t2(x,y);elset3(i,j)=255;endendend6、梯形prompt={'please input p:'};title='请输入上底缩放比例:';lines=1;def={'0.5'}; %默认上底缩放比例值p=inputdlg(prompt,title,lines,def); %对话框输入上底缩放比例 p=str2double(p);prompt={'please input q:'};title='请输入下底缩放比例:';lines=1;def={'0.8'}; %默认下底缩放比例值q=inputdlg(prompt,title,lines,def); %对话框输入下底缩放比例 q=str2double(q);n1=round(n*p+0.5);n2=round(n*q+0.5);sd=min(n1,n2); %短底xd=max(n1,n2); %长底t3 = zeros(m,xd);bi=abs(n2-n1)/2/m;%斜率for i = 1:mif n1<n2a=round((m-i+1)*bi+0.5);%缩进长度newx=sd+2*i*bi;%变化后的下底的长度elsea=round((i-1)*bi+0.5);newx=xd-2*i*bi;%变化后的下底的长度endfor j=a:a+round(newx+0.5)x=i;y=round((j-a)*n/newx);if (x>0&&x<=m) &&(y>0&&y<=n)t3(i,j)=t2(x,y);elset3(i,j)=255;endendend7、三角形t3(m,n)=0;for i=1:mfor j=1:round(i*n/m)x=i; %高度坐标不变y=round((m/x)*j); %宽度坐标以(m/x)*j比例变化if (x>0&&x<=m) &&(y>0&&y<=n)t3(i,j)=t2(x,y);elset3(i,j)=255;endendend8、S 形b=round(30*sin(pi/2));a=n+2*b;t3(m,a)=0;for i=1:mfor j=1:nx=i;y1=round(30*sin(i*2*pi/(n-1))); %宽度坐标移动距离 y=j+y1; %变化后新旧坐标的关系if y<at3(x,y+30) =t2(i,j) ;elset3(i,j)=255;endendend9、波浪形b=round(30*sin(pi/2));a=m+2\b;t3(a,n)=0;for i=1:mfor j=1:ny=j;x1=round(30*sin(j*2*pi/(n-1))); %高度坐标移动距离 x=i+x1; %变化后新旧坐标的关系if y<at3(x+30,y) =t2(i,j) ; %坐标平移elset3(i,j)=255;endendend六、实验结果图:1、原图2、缩小(缩小为原来的1/4)3、放大(放大为原图的4倍)4、水平内凹5、水平外凸(内凹幅度为30)(外凸幅度为50)6、梯形7、三角形(上底缩放比例为0.5,下底缩放比例为0.8)8、S形9、波浪形(变化幅度为30)(变化幅度为30)七、心得体会:1、通过课程设计,对采用MATLAB对图象进行几何变化的原理与方法有了更深的理解。
2、熟练应用最近邻插值与双线性插值方法,采用最近邻方法对图象进行放大时会出现网格现象,因此采用双线性插值方法,由于图片较大,放大效果未能很好实现。
3、在分析新旧坐标关系时,对各点在变化后在图象中的新点坐标的关系有了更进一步的认识。
在编程过程中,由于分析得体,坐标关系找得准确,这也是编程过程较为顺利的关键所在。
4、对于各种变化,在新旧坐标的对应关系上,要注意坐标范围,以免溢出。
5、在两边界变化不同时,要注意整体考虑,以免出现图象断层或者重叠现象。
6、遗憾的是,由于一些细节问题,而且时间紧迫,可能未能完全达到老师要求的最理想效果。
function varargout = untitled1(varargin)% UNTITLED1 M-file for untitled1.fig% UNTITLED1, by itself, creates a new UNTITLED1 or raises the existing% singleton*.%% H = UNTITLED1 returns the handle to a new UNTITLED1 or the handle to% the existing singleton*.%% UNTITLED1('CALLBACK',hObject,eventData,handles,...) calls the local% function named CALLBACK in UNTITLED1.M with the given input arguments. %% UNTITLED1('Property','Value',...) creates a new UNTITLED1 or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before untitled1_OpeningFunction gets called. An% unrecognized property name or invalid value makes property application % stop. All inputs are passed to untitled1_OpeningFcn via varargin.%% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one% instance to run (singleton)".%% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help untitled1% Last Modified by GUIDE v2.5 01-Feb-2007 11:12:10% Begin initialization code - DO NOT EDITgui_Singleton = 1;gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @untitled1_OpeningFcn, ...'gui_OutputFcn', @untitled1_OutputFcn, ...'gui_LayoutFcn', [] , ...'gui_Callback', []);if nargin & isstr(varargin{1})gui_State.gui_Callback = str2func(varargin{1});endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); elsegui_mainfcn(gui_State, varargin{:});end% End initialization code - DO NOT EDIT% --- Executes just before untitled1 is made visible.function untitled1_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn.% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)% varargin command line arguments to untitled1 (see VARARGIN)% Choose default command line output for untitled1handles.output = hObject;% Update handles structureguidata(hObject, handles);% UIWAIT makes untitled1 wait for user response (see UIRESUME)% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line. function varargout = untitled1_OutputFcn(hObject, eventdata, handles)% varargout cell array for returning output args (see VARARGOUT);% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% Get default command line output from handles structurevarargout{1} = handles.output;% -------------------------------------------------------------------- function Untitled_1_Callback(hObject, eventdata, handles)% hObject handle to Untitled_1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% -------------------------------------------------------------------- function Untitled_2_Callback(hObject, eventdata, handles)% hObject handle to Untitled_2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)%打开clear;clc;[filename,pathname]=uigetfile({'*.*','All Files(*.*)'});file=fullfile(pathname,filename);t1=imread(file);t2=rgb2gray(t1); %将打开的彩色图像转换为灰度图%subplot(2,2,1);imshow(t2)save temp t2;%''*.bmp','*.tif',% --------------------------------------------------------------------% -------------------------------------------------------------------- function Untitled_5_Callback(hObject, eventdata, handles)% hObject handle to Untitled_5 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% -------------------------------------------------------------------- function Untitled_6_Callback(hObject, eventdata, handles)% hObject handle to Untitled_6 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)%缩小load temp t2[m,n]=size(t2);x2=double(t2);for i=1:mfor j=1:nbw(i,j)=x2(i,j)+1;endendfor i=1:mfor j=1:nw=round(i*0.5);h=round(j*0.5);x3(w,h)=bw(i,j);endendfigure,imshow(mat2gray(x3))% --------------------------------------------------------------------function Untitled_7_Callback(hObject, eventdata, handles)% hObject handle to Untitled_7 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)%放大load temp t2;[m,n]=size(t2);x2=double(t2);x3=zeros(fix(m*2),fix(n*2));for i=2:fix((m-1)*2)for j=2:fix((n-1)*2)p=fix(i/2);q=fix(j/2);x3(i,j)=[x2(p+1,q)-x2(p,q)]*(i/2-fix(i/2))+[x2(p,q+1)-x2(p,q)]*(j/2-fix(j/2))+[ x2(p+1,q+1)+x2(p,q)-x2(p,q+1)-x2(p+1,q)]*(i/2-fix(i/2))*(j/2-fix(j/2))+x2(p,q); endendfigure,imshow(mat2gray(x3))% --------------------------------------------------------------------function Untitled_8_Callback(hObject, eventdata, handles)% hObject handle to Untitled_8 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)%水平外凸load temp t2;[m,n]=size(t2);a=round(sin(pi/2));t3(m,n+2*a)=0;grade=50;for i =1:mb =2*pi/m*i; %i转化为弧度形式j1=round(abs(sin(2*pi-b/2)*grade+grade)+0.5);j2=round(sin(b/2)*grade-grade-0.5); % 正弦函数变换,周期为2Mfor j=j1:j2+nx=i; %变化后高度坐标不变y=round((j-j1)*n/((j2+n-j1+1))); %宽度坐标以(j-j1)*n/((j2+n-j1+1))比例变化 if (x>0&&x<=m) &&(y>0&&y<=n)t3(i,j)=t2(x,y);elset3(i,j)=255;endendendfigure,imshow(mat2gray(t3));% --------------------------------------------------------------------function Untitled_10_Callback(hObject, eventdata, handles)% hObject handle to Untitled_10 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% 水平内凹load temp t2;[m,n]=size(t2);t3(m,n)=0; %开辟新图象空间for i = 1:ma = (2*pi/m)*i; %i转化为弧度形式p=round(abs(30*sin(a/2))+0.5);q=round(-abs(30*sin(a/2))-0.5); % 正弦函数变换,周期为2Mfor j=p:q+nx=i; %变化后高度坐标不变y=round((j-p)*n/((q+n-p+1))); %宽度坐标以(j-p)*n/((q+n-p+1)))比例变化 if (x>0&&x<=m) &&(y>0&&y<=n)t3(i,j)=t2(x,y);elset3(i,j)=255;endendendfigure,imshow(mat2gray(t3));% -------------------------------------------------------------------- function Untitled_11_Callback(hObject, eventdata, handles)% hObject handle to Untitled_11 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)%梯形load temp t2;t2=double(t2);[m,n]=size(t2);prompt={'please input p:'};title='请输入上底缩放比例:';lines=1;def={'0.5'};p=inputdlg(prompt,title,lines,def);p=str2double(p);prompt={'please input q:'};title='请输入下底缩放比例:';lines=1;def={'0.8'};q=inputdlg(prompt,title,lines,def);q=str2double(q);n1=round(n*p+0.5);n2=round(n*q+0.5);sd=min(n1,n2); %短底xd=max(n1,n2); %长底t3 = zeros(m,xd);bi=abs(n2-n1)/2/m;%斜率for i = 1:mif n1<n2a=round((m-i+1)*bi+0.5);%缩进长度newx=sd+2*i*bi;%变化后的下底的长度elsea=round((i-1)*bi+0.5);newx=xd-2*i*bi;%变化后的下底的长度endfor j=a:a+round(newx+0.5)x=i;y=round((j-a)*n/newx);if (x>0&&x<=m) &&(y>0&&y<=n)t3(i,j)=t2(x,y);elset3(i,j)=255;endendendfigure,imshow(mat2gray(t3));% -------------------------------------------------------------------- function Untitled_9_Callback(hObject, eventdata, handles)% hObject handle to Untitled_9 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)close;% --- Executes during object creation, after setting all properties. function figure1_CreateFcn(hObject, eventdata, handles)% hObject handle to figure1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called % --------------------------------------------------------------------function Untitled_12_Callback(hObject, eventdata, handles)% hObject handle to Untitled_12 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% -------------------------------------------------------------------- function Untitled_13_Callback(hObject, eventdata, handles)% hObject handle to Untitled_13 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)load temp t2[m,n]=size(t2);b=round(30*sin(pi/2));a=n+2*b;t3(m,a)=0;for i=1:mfor j=1:nx=i;y1=round(30*sin(i*2*pi/(n-1))); %宽度坐标移动距离y=j+y1; %变化后新旧坐标的关系if y<at3(x,y+30) =t2(i,j) ;elset3(i,j)=255;endendendfigure,imshow(mat2gray(t3));% -------------------------------------------------------------------- function Untitled_14_Callback(hObject, eventdata, handles)% hObject handle to Untitled_14 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)%function wavewarp();% 水波型load temp t2[m,n]=size(t2);t2=double(t2);t3(m,n)=0;for i=1:mfor j=1:nx=round(i+sin(j/2));y=round(j+sin(i/2));if (x>0&&x<=m) &&(y>0&&y<=n)t3(i,j)=t2(x,y);elset3(i,j)=0;endendendfigure,imshow(mat2gray(t3));% -------------------------------------------------------------------- function Untitled_15_Callback(hObject, eventdata, handles)% hObject handle to Untitled_15 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% --- Executes on mouse press over figure background, over a disabled or % --- inactive control, or over an axes background.function figure1_WindowButtonDownFcn(hObject, eventdata, handles)% hObject handle to figure1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% -------------------------------------------------------------------- function Untitled_16_Callback(hObject, eventdata, handles)% hObject handle to Untitled_16 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% 波浪型load temp t2[m,n]=size(t2);b=round(30*sin(pi/2));a=m+2\b;t3(a,n)=0;for i=1:mfor j=1:ny=j;x1=round(30*sin(j*2*pi/(n-1))); %高度坐标移动距离x=i+x1; %变化后新旧坐标的关系if y<at3(x+30,y) =t2(i,j) ; %坐标平移elset3(i,j)=255;endendendfigure,imshow(mat2gray(t3));% -------------------------------------------------------------------- function Untitled_17_Callback(hObject, eventdata, handles)% hObject handle to Untitled_17 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% 三角形load temp t2;[m,n]=size(t2);t3(m,n)=0;for i=1:mfor j=1:round(i*n/m)x=i; %高度坐标不变y=round((m/x)*j); %宽度坐标以(m/x)*j比例变化if (x>0&&x<=m) &&(y>0&&y<=n)t3(i,j)=t2(x,y);elset3(i,j)=255;endendendfigure,imshow(mat2gray(t3));% -------------------------------------------------------------------- function figure1_WindowButtonMotionFcn(hObject, eventdata, handles)% hObject handle to figure1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% -------------------------------------------------------------------- function Untitled_18_Callback(hObject, eventdata, handles)% hObject handle to Untitled_18 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% --- Executes on mouse press over figure background.function figure1_ButtonDownFcn(hObject, eventdata, handles)% hObject handle to figure1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)。