《MATLAB图像编程基础.ppt》由会员分享,可在线阅读,更多相关《MATLAB图像编程基础.ppt(77页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Digital Image Processing 数字图像处理基础李 剑 敏福州大学数学与计算机科学学院MATLAB图像编程基础MATLAB简介数组与矩阵数值计算M文件设计图形用户界面二维、三维图形绘制MATLAB图像工具的使用MATLAB参考书MATLAB实用指南(上)(下)电子工业出版社苏金明 王永利MATLAB简介Matlab是一种高级计算语言,是进行数据分析和算法与应用开发的交互式开放环境Matlab的基本特点:简单易学代码短小高效计算功能强大强大的图形表达功能可扩展性能MATLAB简介Matlab 7.0的新特点:开发环境桌面提供了多文档管理、锚点图形窗口以及保存定制输出和常用命令快
2、捷的能力。数组编辑器和工作空间浏览器,使得查看、编辑变量和用变量数据绘制图更加容易。可以在编辑器中执行一部分M代码自动将M代码发布为HTML,Word或LaTex文档MATLAB简介Matlab 7.0的新特点:编程可以创建嵌套函数可以在命令行或脚本式M文件中定义单行函数和隐函数标准调用语法等MATLAB简介Matlab 桌面介绍:启动按钮打开“Start”菜单及其子菜单命令窗口命令历史窗口工作空间窗口(数组编辑器)当前目录浏览器Matlab帮助系统数组与矩阵-表达式表达式:变量不需任何类型声明和维数说明数据表示:e指以10为底的幂次;虚数用i或j作为后缀运算符:*/()函数:内部函数和M函数
3、数组与矩阵-数组X=0 1 2 4 7 8A=10:15;A=-2.5:2.5;A=1:6.3注意:matlab创建的序列默认时的增量总是1(A=9:1错误)A=10:5:50;A=3:0.2:3.8;A=9:-1:1使用linspace函数构造数组:X=linspace(first,last,num)X=linspace(0,10,5)构造数组数组与矩阵-矩阵构造矩阵Row=e1,e2,em,或row=e1 e2 em A=10 12 62 93 8A=row1;row2;rown A=1 2 4 1;3 4 2 7 D=a b c;k s n;使用特殊函数构造矩阵创建所有元素都是1的矩阵。
4、ones(3,6)创建所有元素都是0的矩阵。zeros(4,6,unit32)Unit8:无符号8比特整数0,255unit32::无符号8比特整数0,232数组与矩阵-矩阵构造矩阵矩阵聚合问题:A=10 12 62;93 8 0B=1 2 4;1 3 4C=A B;D=A;B数组与矩阵-矩阵获取矩阵元素A=2 4 6;4 2 8;3 0 1 A(3,2)和A(6)都是获取第3行第2列的元素。Sum(A(1:3,3)1-3行第3列元素之和A(:)获取A中所有元素数组与矩阵-矩阵获取矩阵元素相关信息numel(A)返回元素个数例:A=2 4 6;4 2 8;3 0 1 Sum(A(:)/nume
5、l(A);%计算矩阵A中所有元素值的均值ndims(A)%返回维数数组与矩阵-矩阵重塑矩阵A=2 4 6;4 2 8;3 0 1;B=A.%转置矩阵B=rot90(A)%旋转矩阵B=fliplr(A)%翻转矩阵数组与矩阵-矩阵导入数据在命令行输入:load(data.txt,-ascii);data显示:data=1 3 6 3 5 10 9 4 8load(data.doc,-ascii);导入Matlab数据文件:load wind%wind是MAT格式数据使用Import Wizard工具数组与矩阵-矩阵A=1 3;4 6;B=6 1;9 3;A=8 5 0;B=2;A+B;A-B;A*
6、B;AB(A左除B);A/B(A右除B,较慢)A.B;A+5;A&B;A|B;AB;and(A,B);or(A,B);not(A);xor(A,B)矩阵代数运算和逻辑运算数值计算-方程求解求AX=B的解X=AB求XA=B的解X=B/AA B相同矩阵,则(B/A)=(A/B)数值计算-多项式多项式函数位于matlab的polyfun目录下conv多项式相乘deconv多项式相除poly用多项式的根求多项式系数polyder多项式求导polyval多项式评价polyvalm 矩阵多项式评价polyfit多项式曲线拟合residue残差运算roots求根运算(poly的逆运算)数值计算-多项式多项式
7、计算P(x)=x3-2x-5用向量表示为:P=1 0 2 5r=roots(P)按惯例matlab通常将根保留为列向量P2=poly(r)返求出多项式的系数用polyval计算多项式再指定点的值。Polyval(p,5)在矩阵意义上计算多项式P(X)=X3-2X-5I (I是单位矩阵)X=2 4 5;-1 0 3;7 1 5;Y=polyvalm(P,X)数值计算-多项式a(s)=s3+2s+3;b(s)=4s2+5s+6;a=1 2 3;b=4 5 6;c=conv(a,b);q,r=deconv(c,a)多项式求导P=1 0 2 5;Q=polyder(P)多项式求导数值计算-多项式多项式
8、曲线拟合X和Y包含要拟合的x和y的数据,n是多项式的系数P=Polyfit(X,Y,n)如:x=1 2 3 4 5;y=5.5 43.1 128 290.7 498.4;进行3次多项式拟合。P=polyfit(x,y,3)绘制拟合曲线x2=1:.1:5;y2=polyval(P,x2)plot(x,y,o,x2,y2)数值计算-多项式插值1.多项式插值(一维插值)函数interp1yi=interp1(x,Y,xi,method)x,Y 为给定数据向量;xi包含要插值点的向量;method为插值方法常见插值方法:nearest最临近插值linear 线性插值spline三次样条插值Cubic三
9、次插值数值计算-多项式2.插值实例:生成一条粗糙的正弦曲线x=0:10;y=sin(x);xi=0:.25:10;yi=interp1(x,y,xi);plot(x,y,o,xi,yi)数值计算-多项式3.插值实例:人口普查数据(19001990,美国)T=1900:10:1990p=75.995 91.972 105.711 123.203 131.669.150.697 179.323 203.212 226.505 249.633;插值求出1995年的人口:interp1(T,p,1975)插值求出1900到1990年每年的数据,绘制结果。x=1900:1:2000;y=interp1(
10、T,p,x,spline);plot(T,p,o,x,y);数值计算-多项式二维插值ZI=interp2(X,Y,Z,XI,YI,method)Z是一个矩形数组,包含二维函数的值;X和Y为大小相同的数组,包含对于Z的给定值;XI和YI为包含插值点数据的矩阵;method为插值方法,提供以下三种:nearest linear cubic数值计算-多项式实例:基于一个77矩阵的数据比较二维插值方法(1)生成低分辨率的peaks函数图形x,y=meshgrid(-3:1:3);z=peaks(x,y);surf(x,y,z)(2)生成一个精度更高的网格,为插值作准备xi,yi=meshgrid(-3
11、:0.25:3);(3)用最临近法插值zi1=interp2(x,y,z,xi,yi,nearest);surf(xi,yi,zi1);(4)用双线性法插值zi2=interp2(x,y,z,xi,yi,bilinear);surf(xi,yi,zi2);(5)用双三次法插值zi3=interp2(x,y,z,xi,yi,bicubic);surf(xi,yi,zi3);数值计算-多项式实例:在较好的网格上插值peaks图X,Y=meshgrid(-3:.25:3);Z=peaks(X,Y);XI,YI=meshgrid(-3:.125:3);ZI=interp2(X,Y,Z,XI,YI);m
12、esh(X,Y,Z),hold,mesh(XI,YI,ZI+15)hold offaxis(-3 3-3 3-5 20)(mesh:绘制网格图)数值计算-多项式实例:给定数据:years=1950:10:1990;%年份service=10:10:30;%服务年限wage=150.697 199.592 187.625 179.323 195.072 250.287 203.212 179.092 322.767 226.505 153.706 426.730 249.633 120.281 598.243;%工资通过插值方法求出在1975年一个服务了15年的员工的工资w=interp2(se
13、rvice,years,wage,15,1975)M文件设计-脚本式M文件M文件编辑器脚本式M文件和函数式M文件脚本式M文件sphere.mSphere%绘制球shading interp%插值着色axis equal%各坐标轴的度量单位相同在命令行输入spher生成单位球面M文件设计-函数式M文件函数式M文件drawsur.m%生成球面或柱面的函数function drawsur(surface)%定义函数switch surface casespheresphere%绘制球面 casecylindercylinder%绘制柱面endshading interp%插值着色axis equal
14、%设置坐标系,使各坐标方向上的度量单位相同在命令行输入drawsur(cylinder)生成柱面M文件设计-控制流如:if(attendance=0.90)&(grade_average=60)pass=1;end;如:eps=1;while(1+eps)1 eps=eps/2;endeps=eps*2M文件设计-函数(主函数以外的函数)function avg,med=newstats(u)%主函数,放在最上面%本函数用内部函数计算均值和中值n=length(u);avg=mean(u,n);med=median(u,n);function a=mean(v,n)%子函数a=sum(v)/n
15、;%计算均值function m=median(v,n)%子函数w=sort(v);%排列元素(递增或递减)if rem(n,2)=1 m=w(n+1)/2);M文件设计-函数(主函数以外的函数)else m=(w(n/2)+w(n/2+1)/2;end将上述存为newstats.m在命令行输入:u=2 3 5 6 1;newstats(u);注意1:在同一个M文件中,子函数不能获取用于主函数或其它子函数的变量,除非将他们声明为全局变量.或作为变量传递M文件设计-函数(主函数以外的函数)注意2:从M文件内部调用函数时,先检查文件,看是否时子函数.然后检查该名称的私有函数,最后搜索路径上的独立M
16、文件或内部函数。因此,可以用相同名称的子函数覆盖已经存在的M文件。私有函数时private子目录中的函数,子对父目录中的函数可见。M文件设计-编程技巧%函数的函数%matlab函数humps简化版本%function y=humps(x)%y=1./(x-.3).2+.01)+1./(x-.9).2+.04)-6;x=0:.002:1;y=humps(x);%计算0到1之间一系列点上的值并绘图plot(x,y);%fminsearch查找极小点p=fminsearch(humps,.5)%将函数句柄和极小点的位置初值作为参数调用humps(p)%计算极小点的函数值图形用户界面(GUI)GUI是
17、实现人机交互的中介,可以通过它实现数据输入、处理和输出。MATLAB提供了一个GUI设计工具-GUIDE启动GUIDE(在命令窗口输入GUIDE),创建或打开一个GUI在输出编辑器中编辑GUI运行GUI图形用户界面(GUI)创建GUI步骤:新建一个GUI设置GUI大小在GUI上添加组件对齐组件设置组件属性GUI编程图形用户界面(GUI)GUI编程步骤:1.创建GUIM文件2.打开GUIM3.在回调间共享数据4.在初始化函数中添加代码5.在回调中添加代码6.用对象浏览器识别回调图形用户界面(GUI)实例:创建如同所示的GUI图形用户界面(GUI)输入guide图形用户界面(GUI)选“Blank
18、 GUI(Default)”模版图形用户界面(GUI)从“File/Preferences”选“Show names in component palette”图形用户界面(GUI)调整窗口大小,添加组建图形用户界面(GUI)设置窗口的name 属性、Panel的Title属性Push Button的String属性、Pop-up Menu的String属性图形用户界面(GUI)设置Pop-up Menu的Tag属性,Callbadk属性显示回调函数。设置三个按钮的Tag属性。图形用户界面(GUI)保存文件,输入文件名simple_gui,可以保存两个文件:simple_gui.m和simpl
19、e_gui.fig图形用户界面(GUI)编辑文件simple_gui.m编辑初始化函数simple_gui_OpeningFcn编辑Surf按钮回调函数pushbutton1_Callback代码编辑Mesh按钮回调函数pushbutton2_Callback代码编辑Contour按钮回调函数pushbutton3_Callback代码编辑回调函数plot_popup_Callback代码代码添加情况见simple_gui.m文件二维、三维图像绘制-条形图叠加线形图%绘制条形图叠加线形图x=1 2 3 4 5 6;y=10 15 8 20 22 23;bar(x,y);colormap coo
20、l;hold onplot(x,y,LineWidth,3,Color,r,LineStyle,-);hold off二维、三维图像绘制-条形图叠加面积图%条形图叠加面积图x=1;2;3;4;y=1 5 3;3 2 7;1 5 3;2 6 1;area(y);hold onbar(x,y);colormap summeraxis auto二维、三维图像绘制-饼图%绘制饼图x=19.3 22.1 51.6;explode=0 0 1;pie(x,explode);colormap cool二维、三维图像绘制-误差条图%绘制误差条图y=10 6 17 13 20;e=2 1.5 1 3 1;err
21、orbar(y,e)%绘制误差条图X=0:pi/10:pi;Y=sin(X);E=std(Y)*ones(size(X);errorbar(X,Y,E)二维、三维图像绘制-散点图%绘制散点图x=1:40;y=rand(size(x);scatter(x,y)%绘制散点图load seamountscatter(x,y,5,z)二维、三维图像绘制-直方图%绘制直方图x=1,2,3,4,6,8,10,12;y=0,0,0,15,215,0,20,0;bar(x,y)%或stem(x,y)grid on%显示网格%绘制直方图,在同一窗口显示I=imread(lena_new.bmp);figure;
22、subplot(221);imshow(I)subplot(222);imhist(I)%显示直方图,默认256灰度级subplot(223);imhist(I,16)%16个bin“收集箱”,16灰度级二维、三维图像绘制-直方图%绘制直方图,不同窗口中显示I=imread(lena_new.bmp);figure;imshow(I);figure;imhist(I);h=imhist(I);h1=h(1:5:256);horz=1:5:256;figure;bar(horz,h1);%bar(horz,v,width)条形直方图,v是一个行向量,horz与v有相同维数的向量,width条宽二
23、维、三维图像绘制-直方图figure;stem(horz,h1,m,fill);%stem(horz,v,color,fill);k(黑)w(白)r(红)g(绿)b(蓝)c(青)y(黄)m(品红)figure;plot(horz,h1,m);%plot(horz,v,color_linestyle_marker);将一组点用直线连起来。title(titlestring);二维、三维图像绘制-对数坐标和半对数坐标%对数坐标图x=logspace(-1,2);%在10-1和102之间生成一个行具有50个分量的向量loglog(x,exp(x),-s)grid on二维、三维图像绘制-多轴图plo
24、tyy(X1,Y1,X2,Y2)用左侧的Y轴绘制X1,Y1;用右侧的Y轴绘制X2,Y2;plotyy(X1,Y1,X2,Y2,function)用function指定的函数绘制每个图像plotyy(X1,Y1,X2,Y2,function1,function2)左侧用function1(X1,Y1)绘制图像右侧用function1(X2,Y2)绘制图像AX,H1,H2=plotyy(.)二维、三维图像绘制-多轴图t=0:pi/20:2*pi;y=exp(sin(t);plotyy(t,y,t,y,plot,stem)二维、三维图像绘制-极坐标图t=0:.01:2*pi;polar(t,sin(
25、2*t).*cos(2*t),-r)二维、三维图像绘制-等直线图%等值线图p=peaks(50);contour(interp2(p,5);%填充等值线图p=peaks(50);contourf(p,15);colormap jet二维、三维图像绘制-向量图%绘制函数梯度场 X,Y=meshgrid(-2:.2:2);Z=X.*exp(-X.2-Y.2);DX,DY=gradient(Z,.2,.2);contour(X,Y,Z)hold onquiver(X,Y,DX,DY)colormap 二维、三维图像绘制-帕累托图y=8 9 50 20 3 10;pareto(y)二维、三维图像绘制-
26、火柴杆图%火柴杆图t=linspace(-2*pi,2*pi,10);h=stem(t,cos(t),fill,-);set(get(h,BaseLine),LineStyle,:)set(h,MarkerFaceColor,red%火柴杆图x=0:25;y=exp(-.07*x).*cos(x);exp(.05*x).*cos(x);h=stem(x,y);set(h(1),MarkerFaceColor,blue)set(h(2),MarkerFaceColor,red,Marker,square)二维、三维图像绘制-彗星图t=0:.01:2*pi;x=cos(2*t).*(cos(t).
27、2);y=sin(2*t).*(sin(t).2);comet(x,y);二维、三维图像绘制-罗盘图Z=eig(randn(20,20);compass(Z)二维、三维图像绘制-羽列图theta=(-90:10:90)*pi/80;r=2*ones(size(theta);u,v=pol2cart(theta,r);Feather(u,v);二维、三维图像绘制-阶梯图x=linspace(-2*pi,2*pi,40);stairs(x,sin(x)二维、三维图像绘制-玫瑰花图theta=2*pi*rand(1,50);rose(theta)二维、三维图像绘制-函数的图绘制函数图像:fplot(
28、function,limits),如fplot(tanh,-2 2)%绘制双曲正切线创建一个M文件myfunfunction Y=myfun(x)Y(:,1)=200*sin(x(:)./x(:);创建一个指向myfun的函数句柄fh=myfun;绘图fplot(fh,-20 20)动画创建%以电影方式创建动画for k=1:16 plot(fft(eye(k+16)%eye(n)返回一个对角线为1其余为0的nn矩阵 axis equal M(k)=getframeend动画创建%动画Z=peaks;surf(Z)axis tightset(gca,nextplot,replacechildr
29、en);for j=1:20 surf(sin(2*pi*j/20)*Z,Z)F(j)=getframe;endmovie(F,20)动画创建%以重绘方式创建动画A=-8/3 0 0;0-10 10;0 28-1;y=35-10-7;h=0.01;p=plot3(y(1),y(2),y(3),square,EraseMode,none,MarkerSize,5)axis(0 50-25 25-25 25)hold on for i=1:4000A(1,3)=y(2);A(3,1)=-y(2);ydot=A*y;y=y+h*ydot;set(p,XData,y(1),YData,y(2),ZDa
30、ta,y(3)drawnowi=i+1;endMATLAB图像工具的使用图像读取与显示:Imread、figure、imshow写入图像imwrite实例:I=imread(lena_new.bmp);%读取灰度图像;figure(1);imshow(I);figure(2);imshow(I,100,200);%把所以小于或等于100的值都显示为黑,把所以大于或等于200的值都显示为白。其余按默认的级数显示为中等亮度值。figure(3);imshow(I,2);%显示该图像灰度级为2,对彩色图像无效MATLAB图像工具的使用J=imread(lenna1.jpg);%读取彩色图像;figu
31、re(4);imshow(J,2);figure(5);imshow(2,1,1,3,J);%以向量2,1,1,3建立新的坐标系,并在新坐标系下显示图像MATLAB图像工具的使用实例:I=imread(lena_new.bmp);%读取灰度图像;figure(1);imshow(I);nrows,ncols=size(I);读取图像行列数%裁剪图的中间一小块J=I(50:nrows-49,50:ncols-49);figure(2);imshow(J);条纹状显示图像for x=1:nrows for y=1:ncols MATLAB图像工具的使用if(mod(x,10)=0)K(x,y)=I
32、(x,y);else K(x,y)=2*I(x,y);end endend figure(3);imshow(K);MATLAB图像工具的使用I=imread(Mary.bmp);%读取灰度图像;figure(1);imshow(I);nrows,ncols=size(I);K=I(50:200,50:200);imwrite(K,Mary_2a.jpg,quality,25);%将图像以某种质量写到磁盘figure(2);imshow(K);imwrite(K,Mary_2b.jpg,quality,5);figure(3);imshow(K);XI=imfinfo(Mary.bmp)%将图像信息存在XI中imwrite(K,Mary_2c.tif);实例:使用函数imwrite保存一幅图像