您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 市场营销 > 基于matlab哈哈镜制作
计算机视觉课程设计实验报告一、题目:哈哈镜的制作三、实验目的:1、掌握几何变换的原理。2、读入待制作的图片,实现图片的缩小放大、水平外凹、水平外凸、梯形变形、三角形,S形和波浪型。四、实验原理:变形处理整体都是一个思路,把原图每一行经过缩放拷到新图的相应行。每次变形都是在原图的基础上,根据想要变换的图象形状,计算出每一行的起始位,再计算出每一行新的总长度。1)对于放大、缩小可以根据最近邻插值或者双线性插值来进行变化,放大我们采用了双线性方法,缩小采用了最近邻插值方法。2)对于水平内凹和水平外凸,以周期为2倍高度的正弦函数来进行变化,变化后远图象的高度坐标不变,宽度坐标以一定比例变化。3)对于三角形和梯形,原图象高度坐标不变,宽度坐标以线性来进行变化。4)对于宽度不变的变形,如波浪形,直接一次变形拷贝一整行。对于高度不变的图形,如S形,也可以用这个方法,或者说是把起始点确定后,将坐标点进行平移。5)除放大效果外,缩小、水平外凹、水平外凸、梯形变形、三角形,S形和波浪型均采用最近邻插值方法进行变化。五、实验步骤(附程序主代码):1、打开图象clear;clc;%清空工作空间[filename,pathname]=uigetfile({'*.*','AllFiles(*.*)'});file=fullfile(pathname,filename);t1=imread(file);t2=rgb2gray(t1);%将打开的彩色图像转换为灰度图imshow(t2)savetempt2;2、缩小loadtempt2%加载打开的图片[m,n]=size(t2);x2=double(t2);fori=1:mforj=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));%开辟空间fori=2:fix((m-1)*2)forj=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;%开辟新图象空间fori=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);%正弦函数变换,周期为2Mforj=p:q+nx=i;%变化后高度坐标不变y=round((j-p)*n/((q+n-p+1)));%宽度坐标以(j-p)*n/((q+n-p+1)))比例变化if(x0&&x=m)&&(y0&&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;fori=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);%正弦函数变换,周期为2Mforj=j1:j2+nx=i;%变化后高度坐标不变y=round((j-j1)*n/((j2+n-j1+1)));%宽度坐标以(j-j1)*n/((j2+n-j1+1))比例变化if(x0&&x=m)&&(y0&&y=n)t3(i,j)=t2(x,y);elset3(i,j)=255;endendend6、梯形prompt={'pleaseinputp:'};title='请输入上底缩放比例:';lines=1;def={'0.5'};%默认上底缩放比例值p=inputdlg(prompt,title,lines,def);%对话框输入上底缩放比例p=str2double(p);prompt={'pleaseinputq:'};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;%斜率fori=1:mifn1n2a=round((m-i+1)*bi+0.5);%缩进长度newx=sd+2*i*bi;%变化后的下底的长度elsea=round((i-1)*bi+0.5);newx=xd-2*i*bi;%变化后的下底的长度endforj=a:a+round(newx+0.5)x=i;y=round((j-a)*n/newx);if(x0&&x=m)&&(y0&&y=n)t3(i,j)=t2(x,y);elset3(i,j)=255;endendend7、三角形t3(m,n)=0;fori=1:mforj=1:round(i*n/m)x=i;%高度坐标不变y=round((m/x)*j);%宽度坐标以(m/x)*j比例变化if(x0&&x=m)&&(y0&&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;fori=1:mforj=1:nx=i;y1=round(30*sin(i*2*pi/(n-1)));%宽度坐标移动距离y=j+y1;%变化后新旧坐标的关系ifyat3(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;fori=1:mforj=1:ny=j;x1=round(30*sin(j*2*pi/(n-1)));%高度坐标移动距离x=i+x1;%变化后新旧坐标的关系ifyat3(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、遗憾的是,由于一些细节问题,而且时间紧迫,可能未能完全达到老师要求的最理想效果。functionvarargout=untitled1(varargin)%UNTITLED1M-fileforuntitled1.fig%UNTITLED1,byitself,createsanewUNTITLED1orraisestheexisting%singleton*.%%H=UNTITLED1returnsthehandletoanewUNTITLED1orthehandleto%theexistingsingleton*.%%UNTITLED1('CALLBACK',hObject,eventData,handles,...)callsthelocal%functionnamedCALLBACKinUNTITLED1.Mwiththegiveninputarguments.%%UNTITLED1('Property','Value',...)createsanewUNTITLED1orraisesthe%existingsingleton*.Startingfromtheleft,propertyvaluepairsare%appliedtotheGUIbeforeuntitled1_OpeningFunctiongetscalled.An%unrecognizedpropertynameorinvalidvaluemakespropertyapplication%stop.Allinputsarepassedtountitled1_OpeningFcnviavarargin.%%*SeeGUIOptionsonGUIDE'sToolsmenu.ChooseGUIallowsonlyone%instancetorun(singleton).%%Seealso:GUIDE,GUIDATA,GUIHANDLES%Edittheabovetexttomodifytheresponsetohelpuntitled1%LastModifiedbyGUIDEv2.501-Feb-200711:12:10%Begininitializationcode-DONOTEDITgui_Singleton=1;gui_State=struct('gui_Name',mfilename,...'gui_Singleton',gui_Singleton,...'gui_OpeningFcn',@untitled1_OpeningFcn,...'gui_OutputFcn',@untitled1_OutputFcn,...'gui_LayoutFcn',[],...'gui_Callback',[]);ifnargin&isstr(varargin{1})gui_State.gui_Callback=str2func(varargin{1});endifnargout[varargout{1:nargout}]=gui_mainfcn(gui_State,varargin{:});elsegui_mainfcn(gui_State,varargin{:});end%Endinitializationcode-DONOTEDIT%---Executesjustbeforeuntitled1ismadevisible.functionuntitled1_OpeningFcn(hObject,eventdata,handles,varargin)%Thisfunctionhasnooutputargs,seeOutputFcn.%hObjecthandletofigure%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)%varargincommandlineargumentstountitled1(seeVARARGIN)%Choosedefaultcommandlineoutputforuntitled1handles.output=hObject;%U
本文标题:基于matlab哈哈镜制作
链接地址:https://www.777doc.com/doc-5689257 .html