1 引 言
随着社会信息化的发展和网络应用的日益广泛,人们所获得的信息源越来越庞大,对于大型数据甚至海量数据的处理需求日益迫切。科学计算可视化(Visualization inScientific Computing)就是在这种背景下提出并发展起来的一个全新的领域。科学计算可视化的本质是运用计算机图形学和图像处理技术,将科学计算过程中产生的数据及计算结果转换为图像,在屏幕上显示出来并进行交互处理,其核心是三维数据场的可视化。体绘制是可视化最活跃的研究子领域之一,它不借助中间图元,而是直接将三维空间的离散数据转换为二维图像。十多年来,在广大科研人员的努力下,已经发展了一些体绘制技术来分析、理解和绘制数据场中包含的物体,并且已在医学、天文、地理、气象、航天等计算机模拟中得到广泛应用。本文主要简单介绍可视化工具包VTK的功能及应用,并具体实现一个基于VTK的利用TCL&TK语言开发的体绘制系统。
2 可视化工具包VTK
VTK(The Visualization Toolkits)是一个基于面向对象方法设计的、功能强大的可视化和图形图像处理的工具箱。它是在三维函数库OpenGL的基础上发展起来的,VTK构造在C++语言之上,它不仅基于C++类库,还支持脚本语言TCL&Tk,Java,Python,支持Windows,Unix等操作系统。VTK能够支持和处理多种表示格式的数据,如有规则的或无规则的点阵(pointsets),图像(image),体元数据(volume)等。此外VTK还将在可视化开发过程中会经常遇到的细节屏蔽起来,并将一些常用的算法进行封装,同时,用户还可以在VTK基类的基础上开发自己的类库。自从1993年问世以来,VTK凭借其开放灵活的特性受到越来越多人的青睐,不断地被改进和完善。
2.1 VTK的绘图模式
VTK的绘图模式可用于2D,3D等一般图形的处理,它主要有9种基本对象:
角色(Actor):VTKActor代表渲染场景中的绘制对象实体,通过调节参数可以设置角色的位置、方向、渲染特性、纹理影射等属性。
灯光(Light):VTKLlight类提供了灯光的位置、灯光的状态(开关)、亮度、颜色等。同时也可以设置光源的照射角度以及衰减程度。
照相机(Camera):VTKCamera类用来设置视点的位置以及焦点位置及其他属性。
属性(Property):Property主要用来说明几何物体的一些特征。比如光照特性、着色模式、物体灰度等。
映射(Mapper):Mapper指定数据与基本图元之间的关系,VTKMapper的派生类通过一个向上观察板(Look-upTable)来映射数据,同时控制与图形库相连的图元的生成。
变换(Trasform):VTKTrasform是一个放置4×4变换矩阵的堆栈,可以对这个矩阵进行平移、缩放、旋转等操作。
渲染窗口(RenderWindow):其基类为VTKRender-Window,用于在显示设备中生成一个窗口,渲染窗口是用户图形界面,可以设置渲染窗口的大小,也可以产生立体显示效果,支持双缓存。
渲染器(Render):基类为VTKRenderer,主要用于控制目标的渲染过程,管理光源、照相机位置等属性。
窗口交互(Render Window Interactor):在VTK中,VtkRenderWindowlnteractor是场景交互方法的一种,它作为一种简单的工具可以用来操作相机、选取对象、调用用户定义的函数等。
2.2 VTK的可视化模式
可视化模式主要用于可视化过程中的数据模式如CT,MRI的数据输入及处理。VTK使用数据流的方式将源数据转换为图像数据。这里包含数据对象和处理对象2类基本对象。数据对象用来表示各种类型的数据,它由几何结构、拓扑结构以及属性数据(如向量、标量)组成。处理对象一般分为源处理对象(Source)、过滤器(Filter)、映射器(Mapper)三类,它用来操作数据对象并生成新的数据对象。处理对象表示系统中对数据进行处理的算法。将数据对象和处理对象连接在一起就形成VTK中的可视化流水线,如图1所示。
3 体绘制系统介绍与实现
这里使用TCI&TK语言,利用VTK函数库实现一个简单的体绘制系统。通过这个系统主要介绍如何通过调用VTK函数库实现图像重建,并且通过一个切片数据bolt.slc向大家展现不同的绘制方法所表现出的不同的效果。它可大体分为前台交互及后台计算2部分。其中前台交互是通过Tk实现的,后台的计算则以TCL为开发平台,通过对VTK中封装的对象及方法的调用来实现。在整个系统中,对三维数据的绘制使用4种不同的方法:最大密度投影法;合成法;等值面法;二维纹理映射法。
3.1 TCL&TK
TCL代表“Tool Command Language”,是一种简单的脚本语言,它几乎在所有的平台上都可以解释运行,功能强大。TCL主要用于发布命令给一些交互程序如文本编辑器、可视化工具软件、仿真工具等。它语法很简单,并有很强的扩充性。TK是对TCL的图形工具箱扩展。TK发行版与TCL的发行版是在一起的。在创建TK小部件时,几乎很少使用命令,一半以上都是按钮或文本小部件的变体。选用TCL&Tk作为开发语言,是因为它灵活的特性和简单的语法可以很方便地与VTK进行融合。
3.2 常用绘制算法介绍
(1)MC算法:Marching Cubes算法是一种应用很广泛的由体密度数据重构三维等值面的方法。MC算法也被称为“等值面提取”(Isosurface Extraction),其本质是将一系列两维的切片数据看作一个三维的数据场,从中将具有某种域值的物质抽取出来,以某种拓扑形式连接成三角面片。MC算法流程如下:每次读出2张切片,形成1层,2张切片上下对应的8个点构成1个立方体,然后按从左到右,从前到后的顺序处理1层中的立方体,抽取每个立方体中的等值面,然后从下到上直至处理到n-1层,所以称为移动立方体算法。MC算法属于面绘制,也可以称为间接体绘制。
(2)光线投射算法:光线投射算法(Ray Casting)是直接体绘制中最常用的算法,它的基本思想是:从屏幕上的每一像素点发出1条视线,这条视线穿过三维场的体元矩阵,沿这条视线等距设置采样点,将距离采样点最近的8个数据点所组成体素的颜色值及不透明度进行三次线形插值,求出该采样点的不透明度及颜色值。然后可以按从前到后或从后到前的合成公式对所有采样点的颜色和不透明度进行合成。当对所有像素点都进行以上过程后,就会得到此数据场的体绘制结果图像。
3.3 四种绘制方法分析与实现
(1)最大密度投影法:假设每一个体元都是能够发光的立方体,沿着光线方向,选择每条与体元相交的直线上的全部点中的最大的密度值作为图像投影平面密度值,这就是最大密度投影(MIP)算法。在MIP描绘过程中,主要实现光线路径上的点中最大密度点投影的功能。这一过程在VTK的定义中属于光线投射算法的三维数据体绘制。在VTK实现过程中首先通过调用vtkSLCReader函数读取切片数据并设置读取路径,这里与Slice方法不同的是,是通过设计转换函数实现颜色和不透明度设置。在这里通过调用vtkPiecewiseFunction函数和vtkcolor-TransferFunction函数将体数据值转换成不透明度和颜色等光学属性,并使用vtkVolumeProperty函数对其颜色、不透明度等属性进行加载,接着调用vtkVolumeRayCast-MIPFunction函数加载绘制方法,然后使用AddVolume将产生的mip_volume及通过类vtkCubeSource定义的Actor:outline_mapper加入到ren2中。最后调用vtkRen-derer进行投影。在MIP中有2种方法可以用来改变最大值操作的行为:SetMaximizeMethodToScalarValue()方法或SetMaximizeMethodToOpacity()方法。如果采用第一种方法,则沿着射线的每一个采样点的标量值均被考虑,其中具有最大标量值的采样点被选择,然后这个标量值被传递给颜色和不透明度转换函数用来来生成最后的射线值;如果调用第二种方法,则沿着射线的每一个采样点的不透明度都将被计算,其中具有最大不透明度的采样点将被选择。在这里采用第一种方法,即通过调用vtkVolumeRayCastMIPFunction类中的SetMaximizeMethodToScalarValue方法来实现最大密度投影设置。效果图如图3所示。
(2)合成算法:合成算法(Composite)是对每条光线上的每个像素点的密度进行加权求和,将结果作为图像投影像素的密度值。在Composite描绘过程中,主要实现光线路径上所有点的密度加权和的投影功能。这一过程在VTK的定义中同属基于光线投射算法的三维数据体绘制。它的实现过程基本类似于MIP,在这里借助于类vtkVolumeRayCastCompositeFunction对取得“光线路径上所有点的密度之和的投影”这一功能做了定义。在vtkVolumeRayCastCompositeFunction中,有2种方法可以用来改变插值和分类的顺序,分别是:SetCompositeMethodToInterPolateFirst(插值优先)方法和SetCompositeMethodToClassifyFirst(分类优先)方法。这种设置仅在采用三线性插值的时候才会产生影响。在第一种情况中,先执行插值,以此决定采样点的标量值,然后在将这个值用于分类;在第二种情况中,将先执行分类,之后在执行插值。插值优先通常能产生较好的效果,因此在这里采用默认的第一种插值优先法。效果图如图3所示。
(3)等值面法:等值面法(Isosurface)是利用表面的饼息对图像进行绘制。虽然该方法同属基于光线投射算法的三维数据体绘制,但是其本质更接近于面绘制。在实现过程中借助ShadeOn方法及SetInterpolationTypeToLinear方法对阴影功能和插值功能进行定义。并使用类vtkVolumeRayCastIsosurfaceFunction中的方法SetIsoValue设置等值面的初始值。在Isosurface描绘过程中,主要实现光线路径上所有密度相同的点组成的等值面的投影功能。效果图如图4所示。
(4)二维纹理映射法:二维纹理映射二维纹理映射的体绘制是将体数据沿正交方向生成序列二维图像,产生二维纹理切片,然后将这些二维纹理切片依次堆叠完成体绘制过程。纹理映射算法同属于体绘制算法,因此同样需要设置不透明度、颜色、梯度3个传递函数来控制三维体的外观。与光线投射算法不同的是,它调用的映射类型为二维纹理映射。在实现过程中通过vtkPiecewiseFunction函数将体数据值转换成不透明度和颜色等光学属性,使用vtkVolumeProperty函数对其颜色、不透明度、阴影、插值等功能进行加载,调用vtkVolumeTextureMapper2D函数定义二维纹理映射,使用setCamera设置视点位置,并使用[renl GetActiveCamera]Zoom来设置放大系数,最后调用Render进行绘制。效果图如图5所示。
3.4 结果讨论
试验结果表明,Slice方法由于是切片投影,数据量相对比较小,因此成像速度快,并可以很清楚的观测到不同的切片面关于不同数轴的绘制效果。但是它重建的图像表面不光滑,容易出现锯齿效应,这可能是由于图像像素间的距离过大造成的,因此可通过插值计算来缓解这个现象。MIP算法不需要太多的参数设置,实现起来比较简单,但是它对图像的细节显示得不清楚,在细节的描绘上不如Composite算法,这是由于投影密度值选择方法的不同造成的,因此只能用于对细节要求不高的情况下。Isosurface算法是利用表面的信息进行重建,因此它的表面绘制效果很逼真,能够很清楚直观的显示物体表面信息。
通过VTK提供的封装算法,在一个普通的PC机上实现图像的三维重建只需几秒钟的时间,还可以利用鼠标直接拖动三维模型,实现旋转、缩放、平移等操作,便于用户根据需要从不同的视角观察物体,增强了系统的交互能力。与OpenGL和Matlab相比,VTK具有使用灵活简单、重建速度快,可视化效果好等优点。
4 结语
在可视化发展过程中,VTK凭借其开源、灵活、可封装、可移植等特性被越来越多的开发人员所采用,它极大地简化了程序,为开发人员节省了很多的时间和精力,在图像的三维重建中得到了广泛应用。本文所实现的系统就是一个将VTK应用到体绘制系统中的典型例子。VTK将一些常用到的体绘制算法进行封装,系统通过直接调用这些VTK基类实现切片数据的三维重建可视化,通过4种不同的绘制方法,展现了不同的绘制效果。这对于帮助人们更好更深层次地分析、理解、掌握图像信息产生了极大的推动作用。随着今后信息化进程的发展,可视化领域将会有更广阔的发展空间,体绘制技术也将会日益改进和完善。
|