1. VTK简介

可视化工具包(VTK: The Visualization Toolkit)是一个开源的、免费的软件系统,用于计算机三维图形、建模、图像处理、体绘制、科学可视化和2D绘图。它支持各种可视化算法和高级建模技术,并分别利用线程和分布式内存并行处理的速度和可伸缩性。

VTK支持多平台运行,可以在Linux、Windows、Mac、Web和移动设备上运行。

2. 动手学VTK

2.1 安装

如果你在使用Anaconda:打开Anaconda Prompt (Anaconda3),激活你要安装的环境后安装vtk

conda install vtk

也可使用pip安装vtk

pip install vtk

2.2 VTK流程简介

绘制几何体的流程:

  • Source/Data:创建内容,需要可视化的几何体等
  • Mapper:映射器,把vtk的数据传给openGL
  • Actor:把前面准备的几何体造出来
  • Render:将图形渲染出来,在窗口中展示出来
  • Window:设置对应窗口的操作,比如旋转
  • Interactor:与窗口的交互设置

绘制图片的流程:

  • Reader:读入图片
  • Filter:对图像进行处理
  • Viewer:展示处理过的图片

vtk的pipeline的实现是通过对前一步的对象拷贝得到的,因此很容易占内存。在执行到Write() 或者 Render()之前,所显示的图像是不会更新的。每个类都会带有一个Update()可以强迫这个类的数据进行更新。由此可见vtk的整个流程并不是像flow一样,而是一层一层拷贝而来的。

2.3 官网示例

A hello world example(来自VTK教科书和源代码的圆柱体实例)

PS: 至于为什么叫hello world,我猜可能是代表入门/你跑的第一个VTK代码的意思,同第一次学习编程语言都是从print("Hello, world! ")开始的

#!/usr/bin/env python

# 这个例子创建了一个最小的可视化程序,演示了 VTK 的基本渲染和管道创建。

# noinspection PyUnresolvedReferences
import vtkmodules.vtkInteractionStyle
# noinspection PyUnresolvedReferences
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkFiltersSources import vtkCylinderSource
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkPolyDataMapper,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
    vtkRenderer
)


def main():

    # ---------------数据准备-----------------
    colors = vtkNamedColors()
    # 设置背景颜色
    bkg = map(lambda x: x / 255.0, [26, 51, 102, 255])
    colors.SetColor("BkgColor", *bkg)
    # 创建一个有八个面的多边形圆柱体模型
    cylinder = vtkCylinderSource()
    cylinder.SetResolution(8)

    # -----------------映射-------------------
    # 映射器(mapper)将几何体放入图形库,也可以做颜色映射
    cylinderMapper = vtkPolyDataMapper()
    cylinderMapper.SetInputConnection(cylinder.GetOutputPort())

    # ------actor是一个分组机制:除了几何(映射器),它还具有属性、变换矩阵和/或纹理映射
    # ----------------这里我们设置它的颜色并旋转-22.5度------------
    # 添加绘制对象
    cylinderActor = vtkActor()
    # 绘制对象添加映射器
    cylinderActor.SetMapper(cylinderMapper)
    cylinderActor.GetProperty().SetColor(colors.GetColor3d("Tomato"))
    cylinderActor.RotateX(30.0)
    cylinderActor.RotateY(-45.0)

    # ----------创建图形结构。渲染器(renderer)呈现到渲染窗口中。---------
    # ----------渲染窗口交互器捕获鼠标的动作,并执行相应操作。------------
    # 添加绘制器
    ren = vtkRenderer()
    # 添加绘制窗口
    renWin = vtkRenderWindow()
    renWin.AddRenderer(ren)
    iren = vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)

    # 绘制器添加对象,设置背景和尺寸大小
    ren.AddActor(cylinderActor)
    ren.SetBackground(colors.GetColor3d("BkgColor"))
    renWin.SetSize(300, 300)
    renWin.SetWindowName('CylinderExample')

    # --------------------交互器初始化--------------------------
    iren.Initialize()
    # 通过访问相机并调用"Zoom"来放大
    ren.ResetCamera()
    ren.GetActiveCamera().Zoom(1.5)
    renWin.Render()

    # 交互器启动
    iren.Start()


if __name__ == '__main__':
    main()

Reference:

[1] VTK - The Visualization Toolkit

[2] vtk学习笔记 - 简书

[3] https://kitware.github.io/vtk-examples/site/Python/

[4] 【Python】VTK: 三维图像处理和可视化利器