2007 年第 3 期 Journal of Shenzhen Polytechnic No.3, 2007
深 圳 职 业 技 术 学 院 学 报
基于 VTK 三维可视化编程
周振环,王安明, 王京阳, 赵 明
(深圳职业技术学院 电子与信息工程学院,广东 深圳 518055)
摘 要: 介绍了 VTK 特点、体系结构、对象模型等, 着重描述图形对象、可视化对象、流水线和图像处理。
针对医学图像需要,使用 VTK 开发了一个小型医学三维可视化软件。实验结果表明,与使用 OpenGL 相比,
使用 VTK 可以节约大量时间,开发出的软件更加标准和规范。
关键词: 可视化工具箱;向对象;医学图像;图像处理
中图分类号:R319; TP391.41 文献标识码:A 文章编号:1672-0318(2007)03-0010-05
持多种着色如 OpenGL 等;⑤具有设备无关性使其
代码具有良好的可移植性;⑥VTK 中定义了许多
宏,这些宏极大的简化了编程工作并且加强了一致
的对象行为;⑦具有更丰富的数据类型,支持对多
种数据类型进行处理;⑧既可以工作于 Windows 操
作系统又可以工作于 Unix 操作系统,极大的方便
了用户[4-5]。
2 VTK 体系结构
VTK 由 2 个基本子系统构成:一个是编译过的
C++类库;一个是“解释型”的封装层,允许你使
用 Tcl,Java 和 Python 等解释型语言操作编译过的
类库。这样设计的优点能使你创建高效率的 C++编
译算法,保留解释型语言快速开发特点,当然对于
C++高手来说,也有这样的工具,整个应用程序可
以由 C++来创建。
2.1 对象模型
VTK 是一个面向对象的系统,高效使用 VTK
的关键,是要较好地理解底层的对象模型,这样做
是为了去掉数百个对象的神秘外衣。理解力达到一
定程度后,你很容易建立应用程序。构成 VTK 的 2
个对象模型:图形对象模型和可视化对象模型。
2.1.1 图形对象
图形对象包含以下几个核心对象:
收稿日期:2006-04-10
项目来源:2005 年粤港关键领域重点突破项目(2005A11304003);深圳市科技计划项目(05KJcd004);深圳职业技术学院科技发展基金
作者简介:周振环(1963-),男,河南人,高工/博士后,主要研究方向为医学图像处理。
1 VTK 的特点
VTK(Visualization ToolKit)是一个开放源
码、自由获取的软件系统,全世界的数以千计的
研究人员和开发人员用它来进行 3D 计算机图形,
图像处理和可视化[1-2],它将在可视化开发过程中
经常遇到的细节屏蔽起来,并将一些常用的算法
封装起来。比如 VTK 将在表面重建中比较常见
的 Marching Cubes 算法封装起来,以类的形式给
以支持,这样在对三维规则点阵数据进行表面重
建时就不必再重复编写 MarchingCubes 算法的代
码,而直接使用 VTK 中提供的 vtkMarchingCubes
类[3]。
VTK 以用户使用的方便性和灵活性为主要
原则,具有如下特点:①具有强大的三维图形功
能。既支持基于体素 Voxel-basedrendering 的体绘
制 Volume Rendering,又保留了传统的面绘制,
从而在极大的改善可视化效果的同时又可以充分
利用现有的图形库和图形硬件;②VTK 的体系结
构使其具有非常好的流 streaming 和高速缓存
caching 的能力,在处理大量的数据时不必考虑内
存资源的限制;③能够更好的支持基于网络的工
具比如 Java 和 VRML 随着 Web 和 Internet 技术
的发展 VTK 有着很好的发展前景;④能够支
项目(07KJcd005)。
第 3 期 周振环,等:基于 VTK 三维可视化编程 11
vtkActor,vtkActor2D,vtkVolume__vtkProp 和/
或 vtkProp3D 的子类
vtkLight
vtkCamera
vtkProperty, vtkProperty2D
vtkMapper,vtkMapper2D__vtkAbstractMapper
的子类
vtkTransform
vtkLookupTable,vtkColorTransferFunction
__vtkScalarsToColors 的子类
vtkRenderer
vtkRenderWindow
vtkRenderWindowInteractor
我们把这些对象组合起来产生一个场景,
Props 代表我们在场景中“看见”的东西,Props 用
来 定 位 和 表 示 2D 数 据 ( 即 图 像 ) 的 类 是
vtkActor2D,在 3D 中被定位和操作的 Props 就是
vtkProp3D。Props 不直接表示几何形状,它借助
Mappers 对象,Mapper 负责表达数据。Props 也
借助于一个属性对象(vtkProperty),属性对象控
制着 Props 的外观(颜色、漫射光、反射光效果;
绘制外观:线框或面片等)。Actors 和 Volumes 还
有一个内部变换对象(vtkTransform),这个对象
封装了一个 4*4 矩阵,它依次控制着 Prop 的位置、
朝向和尺度。光照(vtkLight)用来表示和操作场景
的光线,光照仅用于 3D,2D 不需要光照。相机
对象(vtkCamera)在绘制过程中控制如何将 3D
投影到 2D,相机具有定位、定标和定向的几种方
法 。 映 射 对 象 ( vtkMapper ) 与 查 找 表 相 连
(vtkLookupTable),用来变换和绘制几何图形,
映射提供可视化流水线与图形对象模型之间的接
口。vtkLookupTable 是一个 vtkScalarsToColors 类
的子类。vtkScalarsToColors 的子类将映射数据转
变成颜色,是最重要的可视化技术之一。绘制器
(vtkRenderer)和绘制窗口(vtkRenderWindow)
用来管理图形引擎和计算机窗口系统。交互器
vtkRenderWindowInteractor 是窗口与数据进行交
互的一个工具。
2.1.2 可视化对象
图形流水线角色是将图形数据变换成图片,
可视化流水线角色是将信息变换成图形数据。换
句话说,可视化流水线负责构成几何表达,然后由
图形流水线来绘制。VTK 使用数据流方法将信息变
换成图形数据,在这个方法中涉及两个基本对象类
型:
vtkDataObject 数据对象
vtkProcessObject 处理对象
数据对象表示各种类型的数据,vtkDataObject
可以看成是通用的“blob”数据(blob 数据类型的
列可以存储大型二进制对象,如图形、视频和声音
等)。具有正式结构的数据称为数据集(DataSet 类)。
图 1 表明 VTK 支持的数据集对象,图中数据集对象
由几何和拓扑结构构成,以及与些相关的属性数据
如尺度或向量。属性数据是与数据集相关的点和单
元格。单元格是一种点的拓扑组织,格是数据集的
原子,用来在点之间进行插值。
图 1 VTK 数据类型
处理对象,也即常指的滤波器,作用于数据对
象产生新的数据对象。处理对象表示系统的算法。
处理对象和数据对象通过可视化流水线相连(数据
流网),图 2 为可视流水线的描述。源处理对象靠读
取(reader 对象)或构造一个或更多数据对象(程
序化源对象)。滤波器吸入数据对象,产生一个或更
多 数 据 对 象 输 出 。 我 们 前 面 见 过 的 图 形 对 象
Mappers,将数据对象转换成图形对象,然后由图形
对象来绘制。Writers 是一种类型的映射器,将数据
写入一个文件或流中。
关于构建可视化流水线有一些重要的问题,简
要在这里介绍一下。首先,流水线拓扑结构由方法
变化而构成
aFilter->SetInput (anotherFilter->GetOutput())。
12 深圳职业技术学院学报 第 6 卷
这些方法首先将一个过滤器的输出作为另一
个过滤器的输入(具有多输入和输出的过滤器类
似)。其次,必须建立一个机制来控制流水线的执
线相连。在这种情况下,当演员收到一个需要绘制
自己的请求时,它会朝着它的映射方法,Update()
方法会自动被送到流水线。流水线的执行从高处开
行,仅执行那些流水线的必要部分,产生输出的
始,绘制方法经常会初始化所需数据,这些数据通
更新。可视化工具箱使用一个懒评估方案(当数
据被请求时才执行),依据每个对象内部修改时
间。第三,流水线组装仅需要那些兼容的对象,
使用 SetInput() 和 GetOutput()方法能与其它
对象很好地结合在一起。在 VTK 中,C++编译时
类型检查强迫做到这一点。最后,我们必须决定
一旦流水线执行,数据对象是否需要缓存或保留。
由于可视化数据集相当大,如何成功应用 VTK 工
具相当重要。VTK 提供了将数据缓存开或关的方
法,使用计数参数来避免拷贝数据,以及当整个
数据不能装入内存时将数据流分块的方法。
图 2 数据对象和处理对象相连的可视化流水线
2.2 流水线执行
如前所示,当需要计算时流水线才执行,例
如你初始化一个读对象,想得到点的数目
vtkPLOT3DReader reader reader SetXYZFileName
“$VTK_DATA_ROOT/
Data/combxyz.bin
[reader GetOutput] GetNumberOfPoints
读对象将从调用的 GetNumberOfPoints()方法返
回“0”,尽管数据文件包含了上千个点。然而,
如果你加入 Update()方法
reader-﹥Update
[reader GetOutput] GetNumberOfPoints
读对象就会返回正确的点数。因为第 1 个例子
GetNumberOfPoints()方法,没有要求计算,因此
返回点数为“0”。第 2 个例子中,Update()方法迫
使读入器执行,从文件中读入数据。通常不必须
手工调用 Update(),因为过滤器与可视化流水
过流水线向下传送,由于流水线部分过时,流水线
过滤器重新执行,导致流水线末端数据更新,然后
由演员来进行绘制。
2.3 图像处理
VTK 支持广泛的图像处理和体素绘制功能,2D
(图像)和 3D(体素)数据均看成是 vtkImageData,
VTK 的图像数据集是一个规则的、轴向排列的数
组。图像、像素映射、位图都是 2D 图像数据集例
子,体素(2D 图像堆积)就是 3D 图像数据集。
在图像流水线中的处理对象的输入和输出均是
图像处理对象,由于数据特性相对规则和简单,图
像流水线有一些其它的重要特性。体绘制用来可视
化 3D vtkImageData,特殊的图像浏览品观察 2D 图
像。图像流水线中几乎所有的处理对象都是多线程,
具有数据流分片能力(以满足用户特殊的内存局
限)。滤波器自动感知系统处理器的数目,在运行过
程中产生多线程数,自动将通过流水线的数据分片。
3 示例程序
使用 VTK 进行三维可视化编程一般分为以下
几个步骤:包含头文件、数据输入、抽取皮肤和骨
骼、得到轮廓和色彩、构建 3 个正交面、添加演员
开始绘制。
1)包含头文件
#include "vtkRenderer.h"
#include "vtkWin32OpenGLRenderWindow.h"
#include "vtkWin32RenderWindowInteractor.h"
#include "vtkVolume16Reader.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkOutlineFilter.h"
#include "vtkStripper.h"
#include "vtkLookupTable.h"
#include "vtkImageDataGeometryFilter.h"
#include "vtkProperty.h"
#include "vtkMarchingCubes.h"
#include "vtkmyCamera.h"
#include "Dopacity.h"
第 3 期 周振环,等:基于 VTK 三维可视化编程 13
2)数据输入
v16->SetDataDimensions(64,64);
v16->SetDataByteOrderToLittleEndian();
v16->SetFilePrefix("headsq/quarter");
v16->SetImageRange(1,93);
v16->SetDataSpacing(3.2,3.2,1.5)。
3)抽取皮肤和骨骼
skinExtractor->SetInput(v16->GetOutput());
skinExtractor->SetValue(0,500);
skinStripper->SetInput(skinExtractor->GetOutput())
;
skinMapper->SetInput(skinStripper->GetOutput());
skinMapper->ScalarVisibilityOff();
skin->SetMapper(skinMapper);
skin->GetProperty()->SetDiffuseColor(1,.49,.25);
skin->GetProperty()->SetSpecular(.3);
skin->GetProperty()->SetSpecularPower(20);
boneExtractor->SetInput(v16->GetOutput());
boneExtractor->SetValue(0,1150.0);
boneStripper->SetInput(boneExtractor->GetOutput(
));
boneMapper->SetInput(boneStripper->GetOutput())
;
boneMapper->ScalarVisibilityOff();
bone->SetMapper(boneMapper);
bone->GetProperty()->SetDiffuseColor(1,1,.9412)。
4)得到轮廓和色彩
outlineData->SetInput((class vtkDataSet *)v16->
GetOutput());
mapOutline->SetInput(outlineData->GetOutput());
outline->SetMapper(mapOutline);
outline->GetProperty()->SetColor(1,0,0);
bwLut->SetTableRange(0,2000);
bwLut->SetSaturationRange(0,0);
bwLut->SetHueRange(0,0);
bwLut->SetValueRange(0,1);
hueLut->SetTableRange(0,2000);
hueLut->SetHueRange(0,1);
hueLut->SetSaturationRange(1,1);
hueLut->SetValueRange(1,1);
satLut->SetTableRange(0,2000);
satLut->SetHueRange(.6,.6);
satLut->SetSaturationRange(0,1);
satLut->SetValueRange(1,1)。
5)构建三个正交面
axialSection->SetExtent(0,63,0,63,46,46);
axialSection->SetInput(v16->GetOutput());
axialMapper->SetInput(axialSection->GetOutput());
axialMapper->ScalarVisibilityOn();
axialMapper->SetScalarRange(0,2000);
axialMapper->SetLookupTable(hueLut);
axial->SetMapper(axialMapper);
saggitalSection->SetExtent(32,32,0,63,0,93);
saggitalSection->SetInput(v16->GetOutput());
saggitalMapper->SetInput(saggitalSection->GetOutput
());
saggitalMapper->ScalarVisibilityOn();
saggitalMapper->SetScalarRange(0,2000);
saggitalMapper->SetLookupTable(bwLut);
sagittal->SetMapper(saggitalMapper);
coronalSection->SetExtent(0,63,32,32,0,92);
coronalSection->SetInput(v16->GetOutput());
coronalMapper->SetInput(coronalSection->GetOutput(
));
coronalMapper->ScalarVisibilityOn();
coronalMapper->SetScalarRange(0,2000);
coronalMapper->SetLookupTable(satLut);
coronal->SetMapper(coronalMapper)。
6)添加演员开始绘制
ren->AddActor(outline);
ren->AddActor(sagittal);
ren->AddActor(axial);
ren->AddActor(coronal);
ren->AddActor(skin);
ren->AddActor(bone);
skin->GetProperty()->SetOpacity(mskinopacity);
bone->GetProperty()->SetOpacity(mboneopacity);
renWin->Render()。
4 实验结果
用 DELL PRECISION380 图 形 工 作 站 ,
WindowsXP 操作系统,开发环境是 VC++6.0,安装
VTK4.2 并进行必要设置,使用 MFC 开发一个三维
可视化系统,具有以下功能:①皮肤和骨骼表面三
维重建,透明和半透明显示,轴向显示;②三维实
时平移,旋转,放大,背景变换等;③各种类型特
14 深圳职业技术学院学报 第 6 卷
色按钮。图 3 是皮肤和骨骼三维表面重建,图 4
是 3 个正交面(矢状面、横断面、冠状面)显示。
图像数据取自 VTK 网站,数据格式是 VTK 模式,
是一个真实病人 CT 图像,规格 256×256×93,层
间 隔 3.2×3.2×1.5 。 现 在 医 学 图 像 通 用 的 是
DICOM 格式,VTK4.2 以后版本,增加了读写
DICOM 格式的函数,并可以将 DICOM 转换成
VTK 数据格式。
图 3 皮肤和骨骼三维表面重建
另外,三维重建同一个病人头皮和骨骼使用 VTK 只
需 90 行代码,使用 OpenGL 至少要 500 行代码。三
维旋转操作 VTK 只需 1 行代码,而 OpenGL 要 30-40
行代码才能完成。并且 VTK 人机交互是标准的、规
范的、统一的,与常用医用软件是一致的,用户使
用起来很习惯,很容易学会。
三维可视化系统使用了 VTK 的三维图形绘制
器、人机交互器、16 位图像读入器、几何变换器、
带通滤波器和著名的 MarchingCubes(行进立方体图
像分割)算法等,并设置了演员、相机、光照和透
明度。
参考文献:
[1] 张诗雷,张志愿,沈国芳.基于 CT 的三维正颌手术仿
真模拟平台的建立[J].中国口腔颌面外科杂志,2004,
2(2):95-98.
[2] 吴松峻,彭复员.基于 VTK 的二维轮廓线的三维可视
化重建[J].计算机与现代化,2004,11(10):111-113.
[3] 王延华,洪 飞,吴恩华.基于 VTK 库的医学图像处理
子系统设计和实现[J].计算机工程与应用, 2003,
18(8): 205-207.
[4] 彭天强,王聪丽.可视化工具包应用研究[J].信息工
程大学学报,2003,4(1): 69-72.
[5] 李 嘉, 胡怀 中, 胡 军, 等. 可 视 化三 维 图 形库
Visualization ToolKit3. 2 的原理及应用[J].计算
图 4 3 个正交面显示
机应用与软件, 2004, 21(2): 5-7.
3D Visualization Programming Based on VTK
ZHOU Zhenhuan, WANG Anming, WANG Jingyang, ZHAO Ming
(School of Electronics and Information Engineering,Shenzhen Polytechnic,Shenzhen ,Guangdong 518055, China)
Abstract: Visualization Toolkits(VTK) is an objected-oriented and powerful class library for 3D computer
graphics, image processing, and visualization. In this paper, the features, system structure and object model of
VTK are described, with emphasis on graphic model, visualization model, pipeline and image processing. To
meet the requirements of medical imaging, a small-sized 3D medical visualization software is developed.
Experiments show that software developed by VTK is more time-saving and standardized compared with which
developed by OpenGL.
Key words: VTK; object-oriented; medical image; image processing
(责任编辑:王璐)