本节书摘来自异步社区《MATLAB图像处理375例》一书中的第2章,第2.2节,作者:MATLAB技术联盟著,更多章节内容可以访问云栖社区“异步社区”公众号查看
MATLAB图像处理375例在MATLAB中,三维绘图的基本流程包括以下9个步骤。
(1)数据准备。
(2)图形窗口和绘图区选择。
(3)绘图。
(4)设置视角。
(5)设置颜色表。
(6)设置光照效果。
(7)设置坐标轴刻度和比例。
(8)标注图形。
(9)保存、打印或导出。
下面我们将根据绘制三维图形的基本流程,分别介绍创建图形的各种函数。
2.2.1 三维折线及曲线的绘制在MATLAB中,plot3命令的功能及使用方法与plot命令的功能及使用方法类似,区别在于前者绘制出的是三维图形。该函数的调用方法如下。
plot3(x,y,z) plot3(x,y,z,option)其中,选项参数option指明了所绘图中线条的线性、颜色以及各个数据点的表示记号。plot3命令使用的是以逐点连线的方法来绘制三维折线的,当各个数据点的间距较小时,我们也可利用它来绘制三维曲线。
【例2-34】利用plot3函数绘制一条三维螺旋线。
t=0:pi/50:8*pi; x=sin(t); y=cos(t); z=t; plot3(x,y,z)运行结果如图2-35所示。
2.2.2 三维图形坐标标记的函数MATLAB也提供了3条用于三维图形坐标标记的函数,并提供了用于图形标题说明的语句。这些函数的调用方法如下。
(1)xlabel(str):将字符串str水平放置于x轴。
(2)ylabel(str):将字符串str水平放置于y轴。
(3)zlabel(str):将字符串str水平放置于z轴。
(4)title(str):将字符串str水平放置于图形的顶部。
【例2-35】利用函数为x=_sin(_t)、y=cos(t)的三维螺旋线图形添加标题说明。
t=0:pi/50:8*pi; x=sin(t); y=cos(t); z=t; plot3(x,y,z); xlabel('sin(t) '); ylabel('cos(t) '); zlabel('t');title('三维螺旋线');运行结果如图2-36所示。
2.2.3 三维网格曲面的绘制三维网格曲面是由一些四边形相互连接在一起所构成的一种曲面,这些四边形的4条边所围成的颜色与图形窗口的背景色相同,并且无色调的变化,呈现的是一种线架图的形式。在MATLAB中,mesh函数用于绘制三维网格曲面图;hidden函数用于隐藏线的显示和关闭。这些函数的调用方法如下。
mesh(X,Y,Z,C) mesh(X,Y,Z) mesh(x,y,Z,C) mesh(x,y,Z) mesh(Z,C) mesh(Z)其中,在命令格式mesh(X,Y,Z,C )和mesh(X,Y,Z )中,参数X,Y,Z 都为矩阵值,并且X 矩阵的每一个行向量都是相同的,Y 矩阵的每一个列向量也都是相同的。参数C 表示网格曲面的颜色分布情况,若省略该参数则表示网格曲面的颜色分布与Z 方向上的高度值成正比;在命令格式(x,y,Z,C )和mesh(x,y,Z )中,参数x 和y 为长度分别是n 和m 的向量值,而参数Z 是维数为m×n 的矩阵;在命令格式[Z,C]和mesh(Z)中,若参数Z是维数为m×n的矩阵,则绘图时的栅格数据点的取法是x=1﹕n和y=1﹕m。
hidden on表示去掉网格曲面的隐藏线;
【例2-36】在笛卡儿坐标系中绘制函数的网格曲面图。
x=-7:0.5:7; y=x; [X,Y]=meshgrid(x,y); Q=sqrt(X.^2+Y.^2)+eps; Z=cos(Q)./Q; mesh(X,Y,Z) grid on axis([-10 10 -10 10 -1 1 ])运行结果如图2-37所示。
MATLAB中还有两个mesh的派生函数:meshc函数用于在绘图的同时,在x-y平面上绘制函数的等值线;meshz函数则用于在网格图基础上在图形的底部外侧绘制平行z轴的边框线。
【例2-37】利用meshc和meshz绘制三维网格图。
close all clear [X,Y] = meshgrid(-2:.4:2); Z = 2*X.^2-3*Y.^2; subplot(2,2,1) plot3(X,Y,Z) subplot(2,2,2) mesh(X,Y,Z) subplot(2,2,3) meshc(X,Y,Z) subplot(2,2,4) meshz(X,Y,Z)运行结果如图2-38所示。
2.2.4 三维阴影曲面的绘制三维阴影曲面也是由很多个较小的四边形构成的,但是各个四条边是无色的(即为绘图窗口的底色),其内部却分布着不同的颜色,也可认为是各个四边形带有阴影效果。
MATLAB提供了3条用于绘制这种三类阴影曲面的命令:surf函数用于基本的三维阴影曲面的绘制;surfc函数用于基本的三维阴影曲面的绘制;surfl函数用于绘制具有光照效果的阴影曲面绘制。这些函数的调用方法如下。
surf(X,Y,Z,C) surf(X,Y,Z) surf(x,y,Z,C) surf(x,y,Z) surf(Z,C) surf(Z)其中,surf命令与mesh命令的使用方法及参数含义相同。surf命令与mesh命令的区别是前者绘制的是三维阴影曲面,而后者绘制的是三维网格曲面。在surf命令中,各个四边形表面的颜色分布方式可由shading命令来指明。
(1)shading faceted:表示截面式颜色分布方式。
(2)shading interp:表示插补式颜色分布方式。
(3)shading flat:表示平面式颜色分布方式。
surfc(X,Y,Z,C) surfc(X,Y,Z) surfc(x,y,Z,C) surfc(x,y,Z) surfc(Z,C) surfc(Z)其中,surfc命令与surf命令的使用方法及参数含义相同;surfc命令与surf命令的区别是前者除了绘制出三维阴影曲面外,在xy坐标平面上还绘制有曲面在z轴方向上的等高线,而后者仅绘制出三维阴影曲面。
surfl(X,Y,Z,s) surfl(X,Y,Z) surfl(Z,s) surfl(Z)其中,这4种surfl命令与前面介绍的surf命令的使用方法及参数含义相类似;surfl命令与surf命令的区别是前者绘制出的三维阴影曲面具有光照效果,而后者绘制出的三维阴影曲面无光照效果;向量参数s 表示光源的坐标位置,s =[sx,xy,xz]。注意,若省略s,则表示光源位置设在观测角的反时针45°处,它是默认的光源位置。
【例2-38】采用shading faceted函数来设置函数的三维阴影曲面效果。
x=-7:0.5:7; y=x; [X,Y]=meshgrid(x,y); Q=sqrt(X.^2+Y.^2)+eps; Z=2*sin(Q)./Q; surf(X,Y,Z) grid on axis([-10 10 -10 10 -0.5 1.5]) shading faceted运行结果如图2-39所示。
【例2-39】利用shading interp函数来设置。
x=-7:0.5:7; y=x; [X,Y]=meshgrid(x,y); R=sqrt(X.^2+Y.^2)+eps; Z=2*sin(Q)./Q; surf(X,Y,Z) grid on axis([-10 10 -10 10 -0.5 1.5]) shading interp运行结果如图2-40所示。
【例2-40】利用shading flat来设置起到相应的效果。
x=-7:0.5:7; y=x; [X,Y]=meshgrid(x,y); R=sqrt(X.^2+Y.^2)+eps; Z=2*log(Q)./Q; surf(X,Y,Z) grid on axis([-10 10 -10 10 -0.5 1.5]) shading flat运行结果如图2-41所示。
【例2-41】利用函数surfc为三维曲面添加等高线。
x=-7:0.5:7; y=x; [X,Y]=meshgrid(x,y); R=sqrt(X.^2+Y.^2)+eps; Z=2*log(Q)./Q; surfc(X,Y,Z) grid on axis([-10 10 -10 10 -0.5 1.5])运行结果如图2-42所示。
【例2-42】利用surfl函数为阴影曲面添加光照效果。
x=-7:0.5:7; y=x; [X,Y]=meshgrid(x,y); R=sqrt(X.^2+Y.^2)+eps; Z=2*log(Q)./Q; s=[0 -1 0]; surfl(X,Y,Z) grid on axis([-10 10 -10 10 -0.5 1.5])运行结果如图2-43所示。
2.2.5 三维图形的修饰与标注与二维图形一样,我们也可以对三维图形的显示参数进行更改,以控制其显示效果。在MATLAB中view函数用于改变图形的视角;三维图形下坐标轴的设置和二维图形下类似,都是通过带参数的axis命令设置坐标轴显示范围和显示比例。这些函数的调用方法如下。
view():改变图形的视角。
view(az,el):az和el分别表示方位角和俯视角。
axis([xmin xmax ymin ymax zmin zmax]):表示设置三维图形的显示范围,数组元素分别确定了每一坐标轴显示的最大、最小值。
axis auto:表示根据x,y,z的范围自动确定坐标轴的显示范围。
axis manual:表示锁定当前坐标轴的显示范围,除非手动进行修改。
axis tight:表示设置坐标轴显示范围为数据所在范围。
axis equal:表示设置各坐标轴的单位刻度长度等长显示。
axis square:表示将当前坐标范围显示在正方形(或正方体)内。
axis vis3d:表示锁定坐标轴比例不随对三维图形的旋转而改变。
【例2-43】设置三维图形的视角效果。
clear all; x=-5:0.5:5; [x,y]=meshgrid(x); z=sin(x)-cos(y); subplot(2,2,1); surf(x,y,z); view(38,32); title ('视角为(38,32)') subplot(2,2,2); surf(x,y,z); view(38+90,32); title('视角为(38+90,32)') subplot(2,2,3); surf(x,y,z); view(38,32+30); title ('视角为(38,32+30)') subplot(2,2,4); surf(x,y,z); view(180,0) title('视角为(180,0)')运行结果如图2-44所示。
【例2-44】使用函数axis设置坐标轴。
close all subplot(131) ezsurf(@(t,s)(log(t).*log(s)),@(t,s)(log(t).*log(s)),@(t,s)log(t),[0,1.5*pi,0,1.5*pi]) axis auto; title('auto') subplot(132) ezsurf(@(t,s)(log(t).*log(s)),@(t,s)(log(t).*log(s)),@(t,s)log(t),[0,1.5*pi,0,1.5*pi]) axis equal; title('equal') subplot(133) ezsurf(@(t,s)(log(t).*log(s)),@(t,s)(log(t).*log(s)),@(t,s)log(t),[0,1.5*pi,0,1.5*pi]) axis square; title('square')运行结果如图2-45所示。
2.2.6 特殊三维图形的绘制实例与二维图形一样,特殊三维图形的绘制也是十分重要的,下面举例介绍三维图像绘制的方法。
【例2-45】利用指令contour、coutour3来绘制等值线图。
[X,Y,Z]=peaks; % x,y及z轴的数据由peaks函数定义 subplot(221), contour(X,30) subplot(222),contour(X,Y,Z,20); % 画出peaks的z轴二维等值线图,等值线的数目为20 subplot(223), % 画出peaks的二维等值线图,等值线的数目为20 contour3(X,30); subplot(224), % 画出peaks的z轴三维等值线图 contour3(X,Y,Z,20); % 画出peaks的三维等值线图运行结果如图2-46所示。
【例2-46】利用slice函数来绘制立体空间的正交切片图。
[x,y,z]=meshgrid(-3:.3:3,-3:.3:3,-3:.3:3); v=x.*exp(-x-y-z); slice(v,[4 14 31],31,[1 10]); axis([0 31 0 31 0 31]) colormap(jet)运行结果如图2-47所示。
【例2-47】利用quiver3函数绘制三维向量场图。
[X,Y]=meshgrid(-1.5:0.25:1.5,-1:0.2:1); Z=X.*exp(-X-Y); [U,V,W]=surfnorm(X,Y,Z); %空间表面的法线 quiver3(X,Y,Z,U,V,W,0.5); hold on; surf(X,Y,Z); colormap hsv; view(-45,60); axis([-3 3 -1 1 -0.6 0.6]); hold off运行结果如图2-48所示。
【例2-48】利用cylinder函数绘制柱面图。
t=0:pi/10:2*pi; [X,Y,Z]=cylinder(1.5+log(t)); surf(X,Y,Z); axis square运行结果如图2-49所示。
【例2-49】利用bar3函数绘制三维垂直直方图。
Y=cool(8); %Y是由冷色图生成的83矩阵 bar3(Y)运行结果如图2-50所示。
【例2-50】利用meshz函数将曲面加上围裙。
[x,y,z]=peaks; meshz(x,y,z); axis([-inf inf -inf inf -inf inf])运行结果如图2-51所示。
【例2-51】利用waterfall函数在x方向或y方向产生水流效果。
[x,y,z]=peaks; waterfall(x,y,z); axis([-inf inf -inf inf -inf inf])运行结果如图2-52所示。
【例2-52】利用meshc函数画出网状图与等高线。
[x,y,z]=peaks; meshc(x,y,z); axis([-inf inf -inf inf -inf inf])运行结果如图2-53所示。
【例2-53】利用surfc函数画出曲面图与等高线。
[x,y,z]=peaks; surfc(x,y,z); axis([-inf inf -inf inf -inf inf])运行结果如图2-54所示。
【例2-54】将生成的图形进行透视。
[X0,Y0,Z0]=sphere(45); %产生单位球面的三维坐标 x=2*X0; %产生半径为2的球面的三维坐标 y=2*Y0; z=2*Z0; clf,surf(X0,Y0,Z0); %画单位球面 shading interp; %采用插补明暗处理 hold on mesh(x,y,z); colormap(hot);运行结果如图2-55所示。
【例2-55】利用“非数”NaN对图形进行裁切处理。
clf; t=linspace(0,2*pi,90); r=1-exp(-t/2).*tan(4*t); %旋转母线 [X,Y,Z]=cylinder(r,60); %产生旋转柱面数据 ii=find(X<0&Y<0); %确定x-y平面第四象限上的数据下标 Z(ii)=NaN; %剪切 surf(X,Y,Z); colormap(spring); shading interp; light('position',[-3,-1,3],'style','local'); %设置光源 material([0.5,0.4,0.3,10,0.3]); %设置表面反射运行结果如图2-56所示。
【例2-56】利用“非数”NaN对图形进行裁切处理。
Q=peaks(20); Q(18:20,9:15)=NaN; %镂空 surfc(Q); colormap(summer); light('position',[50,-10,5]),lighting flat; material([0.9,0.9,0.6,15,0.4]);运行结果如图2-57所示。
【例2-57】对创建的图形进行裁切。
clf,x=[-7:0.3:7]; y=x; [X,Y]=meshgrid(x,y); ZZ=X-Y; ii=find(abs(X)>5|abs(Y)>5); %确定超出[-5,5]范围的格点下标 ZZ(ii)=zeros(size(ii)); %强制为0 surf(X,Y,ZZ); shading interp; colormap(copper); light('position',[0,15,1]); lighting phong; material([0.3 0.3 0.5 11 0.5])运行结果如图2-58所示。
【例2-58】绘制彗星状轨迹图。
shg;n=16; t=n*pi*(0:0.0004:1); x=sin(t);y=cos(t); plot(x,y,'g'); axis square; hold on comet(x,y,0.01); hold off运行结果如图2-59所示。
【例2-59】利用卫星返回地球的运动轨迹。
shg;R0=1; %地球半径为一个单位 a=12*R0; b=9*R0; T0=2*pi; %T0是轨道周期 T=5*T0; dt=pi/100; t=[0:dt:T]'; f=sqrt(a^2-b^2); %地球与另一焦点的距离 th=12.5*pi/180; %卫星轨道与x-y平面的倾角 E=exp(-t/20); %轨道收缩率 x=E.*(a*sin(t)-f); y=E.*(b*sin(th)*cos(t)); z=E.*(b*cos(th)*cos(t)); plot3(x,y,z,'g'); %画全程轨迹 [X,Y,Z]=sphere(30); X=R0*X;Y=R0*Y;Z=R0*Z; %获得单位球坐标 grid on,hold on; surf(X,Y,Z),shading interp; %画地球 x1=-18*R0;X2=6*R0; %确定坐标范围 y1=-12*R0;y2=12*R0; z1=-6*R0;z2=6*R0; view ([45 85]), %设视角、画运动线 comet3(x,y,z,0.02), hold off运行结果如图2-60所示。
【例2-60】利用rotate函数使图形旋转。
shg;clf; [X,Y]=meshgrid([-2:.2:2]); Z=3* exp(-X.^2-Y.^2); G=gradient(Z); subplot(121), surf(X,Y,Z,G); subplot(122), h=surf(X,Y,Z,G); rotate(h,[-2,-2,0],20,[2,2,0]), %使图形旋转 colormap(jet)运行结果如图2-61所示。
相关资源:MATLAB图像处理实例详解百度网盘