1.VTK 概述
VTK(Visualization Toolkit)是美国
Kitware公司开发的一个源代码开放、面向对象的可视化工具包,它封装了许多常用的图像处理和图形生成算法,包含有很多可以直接使用的类和库函数,是在三维函数库OpenGL的基础上利用面向对象技术,设计和实现的可视化开发库[1]。它把可视化开发过程中经常遇到的细节屏蔽起来,并将一些常用的算法封装成类的形式供开发者使用,可方便地对数据集进行各种变换和操作。VTK的核心用C++语言开发源代码,可在Tcl、Java、Pyhon语言环境下使用,并具有多种程序语言之间的代码转换功能.VTK还具有可移植性:既可以工作于Windows系统,又可以在Unix系统中运行。因为VTK是开放源代码的,因此,程序开发人员还可以根据需要在VTK基本类的基础上修改源代码或开发自己的类库。鉴于VTK类库的灵活性和较高的算法执行效率,其生成图像的速度快,图像质量优。很多从事图像可视化应用程序的开发人员开始着手VTK的研究。
2.VTK 的开发环境
2.1 VTK的程序结构
构成VTK的两大对象模型分别是作为所有图形的基础的图形模型和可视化过程的数据流模型[2]。
图形模型主要表现3D图形系统的
VTK可视化类库及其应用进展
王敏 中国海洋大学青岛学院信息工程系 266300
本质特征,完成图像生成和用户交互的功能,它由9个基本对象构成:vtkRenderWindowInteractor用于实现窗口的用户交互,vtkRenderWindow渲染窗口用于管理显示设备窗口,vtkRenderer渲染器进行坐标定位,vtkLight灯光、vtkCamera照相机、vtkActor演员分别用来设置场景的光照度、视角焦点和实体,vtkProperty用于设置vtkActor的表面属性,vtkMapper表示实体的几何形状,vtkTransform定义vtkActor、vtkCamera和vtkLight的位置和方向。
VTK数据流模型由2类基本的对象组成:数据对象和处理对象,数据对象代表了进入可视化网络的数据集类型,包含体数据(vtklmageData)等五种类型,处理对象按功能分为数据源(Source)、过滤器(Filter)和映射器(Mapper)三种。数据源对象用于产生或接收数据集,是可视化流程的起点,它包括从文件中读入及程序内部产生的数据。过滤器用于对数据集进行各种算法的处理,得到数据类型及输出值。映射器指定了基本图元与数据之间的接口,将数据集映射为可展示的基本图元,是可视化网络的终点。
VTK的数据流采用流水线的作业方式,如图1所示。vtkObject是VTK的基类,vtkSource是vtkObject的派生类,是整个可视化流的开始,比如读取数据。vtkFilter为vtkSource的派生类,它对数据进行各种处理,原始数据经过各种filter处理后转换为便于某种三维可视化算法显示的数据。如利用vtkMapper将
处理后的体数据映射为几何数据。vtkActor为三维场景中的对象,而vtkRender负责绘制结果的显示。依据要处理的数据类型和要实现的算法,将相应类型的数据源(Source)、过滤器(Filter)和映射器(Mapper)连接起来就可以实现相应的可视化算法。
2.2 TCL/TK和C/C++
目前应用比较多的语言环境是TCL/TK和C/C++。
TCL(Tool Command Language)是一种简单的脚本语言,它是一种通用语言,几乎在所有的平台上都可以解释运行,功能强大。TCL主要用于发布命令给一些交互程序如文本编辑器、可视化工具软件、仿真工具等。它语法很简单,并有很强的扩充性。TK是一种图形用户界面的工具,比传统方法更能把对桌面应用程序的开发推向更高层次。TK发行版与TCL的发行版是在一起的[1]。在创建TK小部件时,几乎很少使用命令,一半以上都是按钮或文本小部件的变体。它也可以兼容多种平台,如Windows、Linux等操作系统。选用TCL&TK作为开发语言,是因为它灵活的特性和简单的语法可以很方便地与VTK进行融合。
C++是一门现代高级程序设计语言,它兼容C语言,支持数据抽象、面向对象程序设计和泛型程序设计。C++语言中的一大特点是数据封装和隐藏、多态性、强类型、系统性强。其主要用于网络软件、操作系统、设备驱动程序、图像处理软件、视频播放器、嵌入式设备诸多对运
图1 VTK 的对象流程图
DOI :10.3969/j.issn.1001-72.2010.20.044
算时间、运行空间要求比较严格的场合。目前多用于系统的开发。
TCL/TK与C/C++相比,C++比TCL/TK的速度快、代码维护性更好、内存资源占用较少。但是调试复杂,难以掌握;TCL/TK则简单易学、测试简单、具有很好的可移植性,但是速度较慢、内存占用较多[3]。如果同时使用TCL/TK和C/C++,将TCL/TK用于组装组件,将C/C++用于系统的开发,就可以各取两者的优点,更加快速、灵活地实现应用程序的开发。
3.VTK的可视化应用
VTK在早期主要用于医学影像的可视化,目前开始应用于工业缺陷检测、雷达图像或电磁场的三维可视化及图像配准、图像分割等领域。
3.1 医学图像的可视化
医学图像的可视化主要有:二维图像的三维重建,医学图像分割等。
实现医学图像三维重建的主要方法是面绘制和体绘制[4]。其中面绘制主要的算法有:Cuberille算法、MarchingCubes算法和Dividing Cubes算法,最常用的是Marching Cubes(移动立方体法),在VTK里把这个方法封装成类vtkMarchingCubes的形式供用户使用。MC的基本思想为:将三维数据网格分成许多体元,根据物体表面特征的信息,给出物体等值面的相关参数值,再逐个测试体元的八个角点是否在等值面上,通过线性插值得出体元中的哪些点在等值面上,用连接这些点得到的三角形或多边形来代替立方体,由这些全部的三角形或多边形得到三维数据场的三维表面信息。VTK目前支持体绘制方法主要有:光线投射法、纹理映射和基于硬件的VolumeProf。光线投射算法(ray casting)是直接体绘制中最为常用的算法,是像序体绘制方法的代表。它从每个像素发出(至少)一条光线,穿过体数据空间,在光线与体空间的交点之间等距地进行采样,对每个采样点通过三线性或更高次插值计算求出其数据,再计算在给定的光学模型中的光强,并与前面的采样点结果合成。对每一个像素进行如上计算,最终得到整幅图像。
目前利用VTK实现的医学图像分
割方法主要有两种[5]:一种是
Cropping,利用VTKBoxwidget实现;
另一种是CIipping,利用
VtKImplicitPlaneWidget实现。基于
VTKBoxwidget的Cropping切割虽然可
以利用立方体六个面的移动,实现对重
建物体的切割,但是六个面移动的方向
只能平行于坐标轴,所以该方法适用于
多面切割显示。即可以立体性的去除对
诊断不必要的组织器官,排除视线干扰,
使病变器官(如肿瘤)完全出来,有助
于对病变器官进行更好的空间定位,提
高诊断效率。基于
VTKImplicitPlaneWidget的Clipping切
割只有一个切割平面,但是由于其切割
平面的方向可以任意手动操控,故可以
对重建物体进行任意方向的切割,可以
帮助医生更加清楚地认识到研究目标的
周围结构和毗邻,如在诊断肿瘤等占位
性病变时,可以更加直观准确地进行定
位,定性,大小,可否手术及手术范围,
甚至对其手术愈后的一系列评估都具有
一定的指导意义。
3.2 其他数据图像处理应用
VTK中具有可以读入多种格式的图
像文件类,比如vtkBMPReader(位图读
取类)、vtkJpegReader(JPEG图像读取
类)、vtkTIFFReader(TIFF图像读取类)、
vtkPNMReader(读PNM类)等,这些类
是vtklmageReader的继承。而且还可以
扩展基类增加vtkDieomReader、
vtkDieomwriter等DICOM 3.0标准
格式的医学图像等。利用这些类,就可以
方便的读取各式的图像文件,方便下一
步进行图像处理。
利用VTK可以对雷达图像数据进
行三维可视化研究[6],可以显示雷达二
维图像,实现雷达回波数据的空间整体
三维重建显示和z,y,z三维任意切面的
雷达回波强度显示,并且可以任意方向
切割、旋转、放大与平移三维图像。VTK
应用于雷达图像三维可视化更为直观和
全面的展现了空间回波的分布状况。
利用VTK还可以实现电磁场的三
维可视化[7],电磁标量场的可视化采用
面绘制的Marching Cubes(移动立方体
法),而电磁矢量场可视化采用图示
符、流线、粒子轨迹等方法。采用
Hedgehog(刺猬)法,实现起来非常容
易,绘制速度也较快。
VTK与MFC相结合还可以用于实
现红外图像等温线提取和图像配准等图
像处理应用。
4.结束语
VTK是一个可用于图像处理的可视
化工具包,可用于C/C++、TCL/TK
等语言环境,也可与MFC结合,开发
出高性能的可视化程序,更好的实现三
维数据的重建,研究好VTK的应用对
于可视化研究者具有十分重要的意义。
而且VTK能够更好的支持用于网络的工
具比如Java和VRML,随着网络技术
的发展,VTK将会应用到更广阔的领域,
具有更好的发展前景。下载本文