欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Pyvista---(2)pyvista中的mesh定义

程序员文章站 2022-07-14 16:29:23
...

  • 为了简化数据表示的复杂度,在pyvista中,mesh可以表示面,也可以表示体素。
  • pyvista里面的所有数据都有节点(node),节点是网格的顶点,由XYZ坐标表示,即使是二维数据也是要有XYZ坐标。
  • 数据也可以是只包含顶点,比如点云(point cloud),点云是一群点。

0 mesh 三要素

  • 顶点(node)
  • 格子(cell)
  • 值(attributes):可以是顶点的值也可以是格子的值,如果设置顶点的值那么颜色就是渐变的,设置格子的值颜色就是不渐变的。

1 mesh中的顶点

下面以三个例子说明

1.1 点云

  • 可以用pyvista.PolyData来创建点云,也就是创建一个包含点的数据结构,可以是二维的也可以是三维的,然后这个数据是可以用来被可视化的。
  • 用numpy生成一堆点云的坐标,然后转为用vista可视化出来。
import numpy as np
import pyvista as pv

nodes = np.random.rand(100, 3)
mesh = pv.PolyData(nodes)
mesh.plot(point_size=10, screenshot='random_nodes.png')

结果:

Pyvista---(2)pyvista中的mesh定义

1.2 网格(gridded mesh),三维数组

import pyvista as pv
from pyvista import examples
mesh = examples.load_hexbeam()

p = pv.Plotter() ## 建一个画板
# 然后在画板上画图
p.add_mesh(mesh, show_edges=True, color='white')
p.add_mesh(pv.PolyData(mesh.points), color='red', point_size=10, render_points_as_spheres=True)
## 相机位置
p.camera_position = [(6.20, 3.00, 7.50),
                 (0.16, 0.13, 2.65),
                 (-0.28, 0.94, -0.21)]
p.show(screenshot='beam_nodes.png')

结果:

Pyvista---(2)pyvista中的mesh定义

1.3 三角表面,兔子

mesh = examples.download_bunny_coarse()

p = pv.Plotter()
p.add_mesh(mesh, show_edges=True, color='white')
p.add_mesh(pv.PolyData(mesh.points), color='red',
       point_size=10, render_points_as_spheres=True)
p.camera_position = [(0.02, 0.30, 0.73),
                 (0.02, 0.03, -0.022),
                 (-0.03, 0.94, -0.34)]
p.show(screenshot='bunny_nodes.png')

结果:

Pyvista---(2)pyvista中的mesh定义

2 mesh中的 cell(单元),小格子

  • 如果了解医学图像处理的话,ct中的一个体素就是一个cell。
  • 当然,单元不仅限于体素,它们可以是三个节点之间的三角形,两个节点之间的线,甚至单个节点也可以是其自己的单元(但这是特例)。

如图所示:

Pyvista---(2)pyvista中的mesh定义
在前面的代码上加上这句话即可画出上图:

p.add_mesh(mesh.extract_cells(mesh.n_cells-1),
           color='pink', edge_color='blue',
           line_width=5, show_edges=True)

3 mesh中的属性(attributes),颜色

  • 给每个顶点赋值,所以他的颜色是渐变的,如果给cell赋值,那么每个格子的颜色就是一样的。
  • 之前说的顶点是坐标点,那这个属性就是这个坐标点的值。简单来说顶点是矩阵的坐标,属性就是矩阵里面的值。那么值被可视化出来就是灰度了。毕竟在图像中矩阵的值就表示灰度值
  • 可以通过.point_arrays.cell_arrays方法来给mesh赋值。值可以是point的或是cell的,通过这个两个方法。这两个方法是一个字典。
  • point数据是指存在于网格的每个节点上的值的数组(标量,向量等)。该数组的顺序至关重要!属性数组中的每个元素必须对应于网格中的节点或单元。
import pyvista as pv
from pyvista import examples
mesh = examples.load_hexbeam()
camera_position = [(6.20, 3.00, 7.50),
                 (0.16, 0.13, 2.65),
                 (-0.28, 0.94, -0.21)]
# 这里是给每个顶点赋值,所以他的颜色是渐变的,如果给cell赋值,那么每个格子的颜色就是一样的。
mesh.point_arrays['my point values'] = np.arange(mesh.n_points)

mesh.plot(scalars='my point values', cpos=camera_position,
          show_edges=True, screenshot='beam_point_data.png')
  • 这里是给每个顶点赋值,所以他的颜色是渐变的,如果给cell赋值,那么每个格子的颜色就是一样的。

Pyvista---(2)pyvista中的mesh定义

给格子(cell)赋值

mesh.cell_arrays['my cell values'] = np.arange(mesh.n_cells)
mesh.plot(scalars='my cell values', cpos=bcpos,
          show_edges=True, screenshot='beam_cell_data.png')

Pyvista---(2)pyvista中的mesh定义

链接

  • https://docs.pyvista.org/getting-started/what-is-a-mesh.html
相关标签: 图像可视化