3D可视化库Mayavi安装和使用

1 安装

安装1(成功)

Mayavi的pip安装支持不好,所以用编译好的whl文件来安装。安装方法如下,Mayavi及其测试环境为:

# win10系统
# conda 新建的干净环境
# python版本为3.8
# Mayavi版本为4.7.3

安装命令如下:

conda create -n env_name python=3.8

需要按照如下步骤安装以下文件(含版本):

  1. VTK==8.2
  2. Mayavi==4.7.3
  3. PyQt5==5.15.4

其中,由于pip3只有VTK9.0以上的版本,所以先下载whl文件再安装。whl下载自Unofficial Windows Binaries for Python Extension Packages,文件名称为:VTK‑8.2.0‑cp38‑cp38‑win_amd64.whl。其中cp38表示python版本为3.8;amd64代表系统为64位系统。安装命令如下:

# 激活环境
conda activate env_name
# 先安装VTK
pip3 install xxxx路径\VTK‑8.2.0‑cp38‑cp38‑win_amd64.whl
# 通过pip安装mayavi
pip3 install mayavi==4.7.3
# 通过pip安装PyQt5,默认安装了5.15.4的版本,发现是可用的
pip3 install PyQt5

查询到还有一个可视化数据的包叫做menpo,但是没有做过详细查询,先mark在这里。

安装2(失败未解决)

Mayavi的pip安装支持不好,用编译好的whl文件来安装也失败了。所以用以下方法安装Mayavi。测试环境为:

# win10系统
# conda 新建的干净环境
# python版本为3.7(截至20210721,conda下的Mayavi还不支持python3.7医以上的版本)

新建环境命令如下:

# conda 新建的干净环境,python版本为3.8
conda create -n env_name python=3.7

安装Mayavi命令如下:

# 已经查询到当前最高版本为mayavi==4.7.1
conda install mayavi

实际运行中出现报错:

********************************************************************************
WARNING: Imported VTK version (9.0) does not match the one used
         to build the TVTK classes (8.2). This may cause problems.
         Please rebuild TVTK.
********************************************************************************

未解决!

2 Mayavi的PythonAPI

根据Mayavi的文档,Mayavi的基础PythonAPI有以下这些:

from mayavi import mlab

# 0D and 1D data
mlab.points3d()
mlab.plot3d()

# 2D data
mlab.imshow()
mlab.surf()
mlab.contour_surf()
mlab.mesh()
mlab.barchart()
mlab.triangular()

# 3D data
mlab.contour3d()
mlab.quiver3d()
mlab.flow()
volume_slice()

本文只介绍我实际使用到的几种API函数。

实用API记录

from mayavi import mlab

# 添加坐标轴
mlab.axes(xlabel='x', ylabel='y', zlabel='z')

# 添加外框
p1 = mlab.points3d(x, y, z)  # 可以替换成其他图像
mlab.outline(p1)
or
mlab.outline()  # 或者直接这样写也行

# 添加颜色标注
mlab.colorbar()

常用属性值如下:

opacity=1.0  # 不透明度,取值范围0-1。0.0表示完全透明,1.0表示完全不透明
color=(1, 1, 1)  # RGB数值,每个数的取值范围均为0-1。例:(1, 1, 1)表示白色。
colormap='hot'  #  不同的配色方案,可取的值如下:
'''
	accent       flag          hot      pubu     set2
	autumn       gist_earth    hsv      pubugn   set3
	black-white  gist_gray     jet      puor     spectral
	blue-red     gist_heat     oranges  purd     spring
	blues        gist_ncar     orrd     purples  summer
	bone         gist_rainbow  paired   rdbu     winter
	brbg         gist_stern    pastel1  rdgy     ylgnbu
	bugn         gist_yarg     pastel2  rdpu     ylgn
	bupu         gnbu          pink     rdylbu   ylorbr
	cool         gray          piyg     rdylgn   ylorrd
	copper       greens        prgn     reds
	dark2        greys         prism    set1
'''

mayavi.mlab.imshow()

  • 函数功能:

将一个二维数组以图片的形式展示出来。

  • 使用方式:
from mayavi import mlab
img = xxxx  # img is a 2D nunmpy array
mlab.imshow(img)
mlab.show(
  • 效果展示:

imshow

mayavi.mlab.mesh()

  • 函数功能:

将物体表面以网格(mesh)的形式展示出来。

  • mesh说明:

下图来自千千Sama的文章,直观展示了什么是mesh,原文中有下图gif动画。其中,每个交叉点都是网格点,描述这些网格点的坐标的矩阵,就是坐标矩阵。每个网格点需要x、y、z共3个坐标表示。
在这里插入图片描述
但是x、y、z一般都用二维矩阵的形式表示。举个例子:

x = [[0, 1, 2],
	 [0, 1, 2],
	]
y = [[0, 0, 0],
	 [1, 1, 1],
	]
z = [[1, 2, 3],
	 [4, 5, 6],
	]
表示一共有6个点,是一个3 x 2的网格。其中:
	x方向有3列:[0, 1, 2]
	y方向有2行:[0, 1]
z的数值表示对应位置上的z轴数值。

Mayavi文档中解释了如何划分连接方式。

  • 使用方式:
from mayavi import mlab

# Using numpy array may be better
x = [[0, 1, 2],
	 [0, 1, 2],
	]
y = [[0, 0, 0],
	 [1, 1, 1],
	]
z = [[1, 2, 1],
	 [-1, -2, -1],
	]
mlab.mesh(x, y, z)
mlab.show(
  • 效果展示:
    在这里插入图片描述
  • 备注
# 参数:representation = 'wireframe' 可以仅绘制线框。
# 参数:representation = 'surface' 为default值,绘制完整曲面。
mlab.mesh(x, y, z, representation='wireframe', line_width=1.0 )

mayavi.mlab.triangular_mesh()

  • 函数功能:

mlab.mesh函数默认surface是像网格一样连接的,但是面对不规则的surface就没法这样表示了。mlab.triangular_mesh就是通过三角形来表示surface,从而普适其他情况。

  • 使用方式:
from mayavi import mlab

x = [-1, 0, 0, 0, 1]
y = [0, -1, 0, 1, 0]
z = [0, 0, 3, 0, 0]
triangular = [(2, 0, 1), (2, 1, 3), (2, 3, 4), (2, 4, 0)]

mlab.triangular_mesh(x, y, z, triangular)
mlab.axes()
mlab.outline()
mlab.show()

代码解读:
其中,x, y, z定义了5个点:(-1, 0, 0), (0, -1, 0), (0, 0, 3), (0, 1, 0), (1, 0, 0)(竖着看xyz的定义那里)。triangular定义了这些点的连接方式:例如(2, 0, 1)表示序号(index)为2, 0, 1的三个点构成一个三角形。
n多个三角形就构成了一整个surface。

  • 效果展示:
    triangle_mesh
    这篇博客写该函数写的很全面,来自mayavii。

mayavi.mlab.points3d()

  • 函数功能:

将三维离散点以球的形式表示出来。

  • 使用方式:

参考了大蓝鲸-博客园的文章

from mayavi import mlab

# Using numpy array may be better
x = [1, 2, 3, 4, 5]
y = [1, 2, 3, 4, 5]
z = [1, 2, 3, 4, 5]

s = [1.5, 4.7, -0.112, -3]
def f(x, y, z):
	return x + y - z

mlab.points3d(x, y, z)
or
mlab.points3d(x, y, z, s)
or
mlab.points3d(x, y, z, f)

mlab.show()
  • 效果展示:

mayavi.mlab.contour3d()

  • 函数功能:

将三维Volumtric数据展示出来。

  • 使用方式:
from mayavi import mlab
import numpy as np

img = xxxx  # Read in a 3D array

# Usage 1
mlab.contour3d(img)
mlab.show()

# Usage 2
shape_x, shape_y, shape_z = img.shape
x = np.linespace(0, 512, num=shape_x)
y = np.linespace(0, 512, num=shape_y)
z = np.linespace(0, 512, num=shape_z)
x, y, z = np.meshgrid(x, y, z, index='ij')

mlab.contour3d(x, y, z, img)
mlab.show()

版权声明:本文为surtol原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。