《MATLAB图像处理375例》——2.2 三维绘图

简介:

本节书摘来自异步社区《MATLAB图像处理375例》一书中的第2章,第2.2节,作者:MATLAB技术联盟著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.2 三维绘图

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所示。
screenshot

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所示。
screenshot

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所示。
screenshot

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所示。
screenshot

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所示。

screenshot

【例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所示。
screenshot

【例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所示。

screenshot

【例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所示。

screenshot

【例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所示。

screenshot

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所示。
screenshot

【例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所示。

screenshot

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所示。

screenshot

【例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所示。

screenshot

【例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所示。

screenshot

【例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所示。

screenshot

【例2-49】利用bar3函数绘制三维垂直直方图。

Y=cool(8);   %Y是由冷色图生成的83矩阵
bar3(Y)

运行结果如图2-50所示。

screenshot

【例2-50】利用meshz函数将曲面加上围裙。

[x,y,z]=peaks;
meshz(x,y,z);
axis([-inf inf -inf inf -inf inf])

运行结果如图2-51所示。

screenshot

【例2-51】利用waterfall函数在x方向或y方向产生水流效果。

[x,y,z]=peaks;
waterfall(x,y,z);
axis([-inf inf -inf inf -inf inf])

运行结果如图2-52所示。

screenshot

【例2-52】利用meshc函数画出网状图与等高线。

[x,y,z]=peaks;
meshc(x,y,z);
axis([-inf inf -inf inf -inf inf])

运行结果如图2-53所示。
screenshot

【例2-53】利用surfc函数画出曲面图与等高线。

[x,y,z]=peaks;
surfc(x,y,z);
axis([-inf inf -inf inf -inf inf])

运行结果如图2-54所示。

screenshot

【例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所示。

screenshot

【例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所示。

screenshot

【例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所示。
screenshot

【例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所示。

screenshot

【例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所示。

screenshot

【例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所示。

screenshot

【例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所示。

screenshot

相关文章
|
2月前
|
计算机视觉
图像处理基础篇-形态学处理-边缘检测(matlab仿真与图像处理系列第4期)
图像处理基础篇-形态学处理-边缘检测(matlab仿真与图像处理系列第4期)
36 1
|
2月前
|
机器学习/深度学习 并行计算 算法
霍夫变换椭圆检测(matlab仿真与图像处理系列第2期)
霍夫变换椭圆检测(matlab仿真与图像处理系列第2期)
57 0
|
2月前
|
算法 计算机视觉
永磁同步电机的矢量控制PMSM仿真+simulink仿真建模(matlab仿真与图像处理)
永磁同步电机的矢量控制PMSM仿真+simulink仿真建模(matlab仿真与图像处理)
102 1
|
2月前
|
移动开发
MATLAB | SCI绘图配色第1期 | 点线图 | 刺客伍六七之暗影宿命第1集
MATLAB | SCI绘图配色第1期 | 点线图 | 刺客伍六七之暗影宿命第1集
65 0
|
1月前
|
算法
基于Harris角点的室内三维全景图拼接算法matlab仿真
本文介绍了使用Harris角点检测算法构建室内三维全景图的过程。在matlab2022a环境下,通过检测、匹配特征点并进行图像拼接,实现全景图的创建。算法涉及图像梯度计算、协方差矩阵、响应函数及非极大值抑制。示例代码展示了读取图像、调整大小并应用角点检测函数进行图像混合的步骤。最后,通过图像子区显示验证了拼接效果。
|
1月前
|
算法 索引
【数学建模竞赛】超详细Matlab二维三维图形绘制
【数学建模竞赛】超详细Matlab二维三维图形绘制
60 1
|
2月前
|
编解码 并行计算 算法
如何在 MATLAB 中进行图像分割(matlab仿真与图像处理系列第7期)
如何在 MATLAB 中进行图像分割(matlab仿真与图像处理系列第7期)
79 1
|
2月前
|
机器学习/深度学习 算法 计算机视觉
霍夫变换车道线识别-车牌字符识别代码(matlab仿真与图像处理系列第5期)
霍夫变换车道线识别-车牌字符识别代码(matlab仿真与图像处理系列第5期)
30 2
|
2月前
|
存储 算法 机器人
基于包围盒算法的三维点云数据压缩和曲面重建matlab仿真
基于包围盒算法的三维点云数据压缩和曲面重建matlab仿真
|
2月前
|
算法 机器人 vr&ar
基于双目RGB图像和图像深度信息的三维室内场景建模matlab仿真
基于双目RGB图像和图像深度信息的三维室内场景建模matlab仿真

热门文章

最新文章