3D数据绘制唇部图像主要由两部分构成,一个是唇部在X-Y平面的栅格,一个是根据相应Z轴的涂色。主要使用了matlab里meshgrid、surf和shading。
meshgrid(x,y)由向量x和向量y通过复制的方法产生绘制图形时所需的栅格数据点矩阵X、Y。该命令产生栅格数据方法为:将向量X作为矩阵X的一个行向量,并将向量X复制length(y)次,以构成栅格数据点X矩阵;同样,将向量y作为矩阵Y的一个列向量,并将向量y复制length(x)次,以构成栅格数据点Y矩阵。
从图可以看出,在x、y平面生成数据栅格。
但是,通过meshgrid这样生成的都是矩形区域,即根据Z轴涂色的基础就是底层是个矩形,绘制的是规则图像,如果绘制不规则图像,就要使用linspace函数,linspace函数形式为linspace(X1,X2,N),以X1为起始元素,X2为结尾元素,生成等间距的N个元素的列向量,其实整个生成过程都是通过插值完成的,N代表X1和X2之间插多少个数据。本实验中画图使用如下:
[X,Y] = meshgrid(linspace(min(aa),max(a),300),linspace(min(b1),max(b),300));
通过上步绘完x和y的栅格后,就需要根据Z轴涂色以观察3维效果。Surf的格式为surf(x,y,z),其中X和Y就是上步骤中生成的栅格数据,Z则是X和Y对应的Z轴数据,以此为根据涂色。
但是涂什么颜色就要靠colormap和shading
了,本实验只涂了灰色,所以代码如下:
surf(X,Y,Z); shading interp; colormap gray;但是上面有个问题没有提到,怎么将Z和X、Y的数据对应上呢,这个时候就要使用:
F = TriScatteredInterp(a,b,c); Z = F(X,Y);
TriScatteredInterp就是将X、Y和Z的数据对应上。
本实验在坐标轴设置上,主要使用了两个特点,一个是使保存是不保存坐标轴,一个是设置坐标轴范围,分别使用代码如下:
axis off %使坐标轴消失 %以下为设置坐标轴范围 midX = (max(a) + min(aa))/2; midY = (max(bb) + min(b1))/2; midZ = (max(c) + min(c))/2; axis( [midX - 0.03,midX + 0.03,midY - 0.022,midY + 0.022,midZ - 0.015,midZ + 0.015]);
Surf画完图之后显示的并不是唇部的正面图,而是一个视点为方位角-37.5°,仰角30°的图像,通过旋转这个三维图,可以看到这个唇部的各个视角,第一眼呈现给观者的是个默认值,可通过view(az,el)定义呈现的视角,az表示方位角,EL
表示仰角。
view(2) %投影到xy平面
最后画完图就需要保存图像了,使用print保存,其中通过‘-r9’可以设置保存图像的大小,代码如下:
print(gcf,'-djpeg','-r9',strcat(savepath,imageName));
但是这样保存的图片会保存图片周围大量的空白区域,所以使用以下代码可以将空白区域去掉:
set(gcf, 'PaperPositionMode', 'manual'); set(gcf, 'PaperUnits', 'points'); axis image; set(gca,'position',[0,0,1,1]); set(gcf, 'PaperPosition', [0 0 510 510]); set(gcf,'visible','off');
注:小细节使用hold on和hold off
参考资料如下:
http://hi.baidu.com/skyliujk/item/68c10d4785adc5eebcf45148
原文地址:http://blog.csdn.net/yongchunaq/article/details/37829867