VTK一个面向对象的可视化类库
高隽 黄伟
合肥工业大学计算机与信息学院 合肥230009
摘 要 Visualization Toolkit是一个面向对象的可视化类库它为从事可视化应用程序开发的广大科研工作者提供直接的技术支持VTK具有及其强大的功能不仅提供了强大的可视化功能而且还提供了强大的图像处理以及有线元分析的功能能够对标量场矢量场以及张量场数据进行重建对于广大从事可视化应用研究以及可视化应用程序与系统开发的科研工作者来说VTK具有非常重要的意义本文介绍了VTK 的机制特点和框架并简单介绍了一个VTK 在医学可视化应用中的实现

关键词 科学计算可视化面向对象程序设计Visualization Toolkit 3D重建CT
1. 引言
科学计算可视化 Visualization in Scientific Computing 是1987年由B.H.McCormick等人根据美国国家科学基金会召开的科学计算可视化研讨会的内容撰写的一份报告中正式提出来的[7][8]随后美国西欧日本各著名大学研究所超级计算机中心各大公司纷纷进行科学计算可视化理论和方法的研究科学计算可视化迅速成为计算机科学中一个热门的研究领域可视化是运用计算机图形学和图像处理技术将科学计算过程中及计算结果的数据转换为图形及图像在屏幕上显示出来并进行交互处理的理论方法和技术[11]近些年来随着计算机硬件水平的提高和可视化理论方法的不断完善可视化在许多领域都得到了广泛的应用如有限元分析计算机断层扫描CT及核磁共振MRI数据的可视化等[9]但是随着可视化技术在许多其它领域的广泛应用也暴露出一些急待解决的问题因为对于许多并不是专业从事可视化研究的科研人员来说虽然他们对于可视化也有很强烈的需求但是由于对可视化程序的开发并不熟悉因而在其研究工作中面临着不少现实的困难如果能有一专门的可视化开发工具能够简化可视化程序的开发将会极大的提高我们的工作效率本文介绍了一个基于Windows/Unix环境的面向对象的可视化开发工具VisualizationToolkit它将一些常用的算法和在可视化程序的开发过程中会经常遇到的细节屏蔽起来以类库的形式给我们的开发工作以直接的支持极大的简化了我们的开发工作和提高了我们的工作效率
2. 可视化开发工具 VisualizationToolkit
随着可视化技术在各个学科领域的广泛应用对于广大从事可视化研究领域的科研人员来说迫切需要一种功能强大的可视化开发工具来给我们的研究工作提供强有力的支持我们在本文中采用的是WillSchroeder, Ken Martin, Bill Lorensen 等人用C++语言开发一个基于Windows 和Unix环境的面向对象的可视化工具Visualization ToolkitVisualization Toolkit把可视化开发过程中的一些细节屏蔽起来以类库的形式给从事可视化程序开发的研究者提供支持使我们可以方便快捷的开发出高性能的可视化应用程序
2.1 Visualization Toolkit 的机制
Visualization Toolkit 是一个用于可视化应用程序构造与运行的支撑环境它是在三维函数库OpenGL的基础上采用面向对象的设计方法发展起来的它将我们在可视化开发过程中会经常遇到的细节屏蔽起来并将一些常用的算法封装起来比如VisualizationToolkit将我们在表面重建中比较常见的Marching Cubes算法封装起来以类的形式给我们以支持这样我们在对三维规则点阵数据进行表面重建时就不必再重复编写MarchingCubes算法的代码而直接使用Visualization Toolkit 中已经提供的vtkMarchingCubes类Visualization Toolkit 采用的是Pipeline机制几乎可以对任何类型的数据进行处理并提供了许多相应的类对各种类型的数据进行转换或处理根据所要处理的原始数据类型的不同和所使用的算法以及所要达到的结果我们可以设计和建立起自己的可视化流程并由此选择不同的数据处理和转换的类用数据通道将这些类连接起来将原始数据类型转换为所采用的算法模块可以直接进行处理的数据类型最终得到我们所需要的可视化的
结果而且所有的类和算法模块都是可扩充的用户可以将自己开发的类或模块转换成系统可以接受的形式并可替换或扩充原有的类所以VisualizationToolkit 是一个开放的系统可以扩展到任何应用领域
2.2 Visualization Toolkit 的特点
Visualization Toolkit是给从事可视化应用程序开发工作的研究人员提供直接的技术支持的一个强大的可视化开发工具它以用户使用的方便性和灵活性为主要原则具有如下的特点
1. 具有强大的三维图形功能 Visualization Toolkit 既支持基于体素Voxel-basedrendering的体绘制Volume Rendering [4]又保留了传统的面绘制从而在极大的改善可视化效果的同时又可以充分利用现有的图形库和图形硬件
2. Visualization Toolkit 的体系结构使其具有非常好的流streaming 和高速缓存caching的能力在处理大量的数据时不必考虑内存资源的限制
3. Visualization Toolkit 能够更好的支持基于网络的工具比如Java 和VRML 随着Web 和Internet技术的发展Visualization Toolkit 有着很好的发展前景

4. 能够支持多种着色 如OpenGL 等
5. Visualization Toolkit 具有设备无关性使其代码具有良好的可移植性
6. Visualization Toolkit 中定义了许多宏这些宏极大的简化了编程工作并且加强了
一致的对象行为
7. Visualization Toolkit 具有更丰富的数据类型支持对多种数据类型进行处理
8. 既可以工作于 Windows 操作系统又可以工作于Unix 操作系统极大的方便了用户目前与 VisualizationToolkit 类似的可视化系统还有AVS89 和Haber91 其中AVS89是第一个商业可视化系统AVS89 和Haber91都采用的是抽象的数据模型这虽然使它们有更广泛的数据表达能力和更大的灵活性但这也使得它们更容易导致计算机代码和接口的混乱而且也会使得使用者由于误解而造成误操作VisualizationToolkit 采用的是更具
体的数据模型一方面是为了是用户更容易掌握和使用另一方面是因为VisualizationToolkit数据模型已经足够支持我们的可视化实践
3. Visualization Toolkit 的框架结构
用面向对象技术的对象模型图表示 Visualization Toolkit 的框架结构如图1 所示

VisualizationToolkit 采用的是流水线pipeline的机制根据所获得的原始数据的类型以及所要得到的显示结果我们可以选择适当的算法并构建起自己的可视化流程在用可视化工具VisualizationToolkit对体数据进行可视化的过程中首先应按照所设计的可视化过程对原始数据进行处理将其转换为适当的数据形式并映射为几何数据然后将几
何数据的属性告诉将要在窗口中显示的演员actorVisualization Toolkit一个很特别的地方是对于任何进行可视化的数据它都是通过演员在窗口中表现出来的vtkObject 是VisualizationToolkit 类库的基类它为整个可视化流程提供基本的方法vtkSource 是vtkObject 的派生类和vtkFilter的父类它为整个可视化流程的开始比如读取数据等定义具体的行为和接口vtkFilter 是vtkSource的派生类它对数据进行各种处理将原始数据经过各种filter 的处理后转换为可以直接用某种算法模块对其进行处理的形式vtkMapper也是vtkObject 的派生类它将经过各种filter处理后的应用数据映射为几何数据为原始数据与图像数据之间定义了接口vtkActor类用来表达绘制场景中的一个实体也就是绘制场景中的演员它通过SetMapper()方法将几何数据的属性告诉演员然后通过vtkRender类将结果在窗口中显示出来
4. 利用Visualization Toolkit 对数据进行可视化的实例
使用Visualization Toolkit对数据进行可视化十分方便程序的结构也正如我们所设计的可视化流程一样十分简洁明了下面我们将利用Visualization Toolkit就可视化应用研究中一个十分热门的领域计算机断层扫描CT 简单剖析一下利用VisualizationToolkit进行数据可视化的实现[1]~[3]我们将要进行处理的 CT 数据是一个人体头部的切片数据共有93 个切片切片的间距是1.5mm每个切片由有12 个灰度级的间距为0.8 毫米的256*256 像素构成[6]我们打算由这些切片数据恢复出皮肤和骨骼的表面为此我们首先应选取合适的算法考虑到我们所处理的数据量是非常庞大的超过了12兆比特而且我们只打算对表面进行重建所以我们选择基于表面重建的经典算法Marching Cubes 算法而对于MarchingCubes算法Visualization Toolkit 中已经有封装好的vtkMarchingCubes给予支持这样就进一步简化了我们的工作图2

人体头部CT 数据Marching Cube 算法是Lorensen 等人于1987提出的是三维数据场等值面生成的经典算法是体素单元内等值面抽取技术的代表并一直沿用自今Marching Cube算法的基本思想是在数据体中将位于两个相临切片上的8 个相临的体素构成一个立方体cube逐个处理数据场中的立方体分类出与等值面相交的立方体采用插值计算出等值面与立方体边的交点根据立方体每一顶点与等值面的相对位置将等值面与立方体边的交点按一定方式连接生成等值面作为等值面在该立方体内的一个逼近表示[7][10]
4.1读取数据
首先我们要做的事情是读取切片数据并将其转换为我们的开发工具VisualizationToolkit所支持的一种数据表达形式然后根据其物理结构建立起相应的模型我们给CT数据建立的是比较抽象的等值面模型最后将物理组件与抽象的模型结合在一起来建立对CT数据的可视化以帮助用户正确理解数据我们所要进行处理的是有结构点阵数据其拓扑和几何都是隐含知道的所以我们只需要知道数据的维数数据源和数据空间利用VisualizationToolkit 中的vtkVolume16Reader 我们可以很方便的读取切片数据只需要告诉读取数据对象我们的CT数据的一些参数如切片之间的间距切片上像素之间的间距以及所读取切片的起始段如从第1 个切片到45 个切片读取数据的代码如下所示

vtkVolume16Reader *Reader =vtkVolume16Reader::New(); //建立一个读取对象
Reader->SetDataDimensions(256,256); //设置数据的维数
Reader->SetDataByteOrderToLittleEndian ();
Reader->SetFilePrefix (".. /.. /../vtkdata/headsq/quarter"); //设置所读取切片数据文件的路径
Reader->SetImageRange(1, 93); //设置读取切片的起始段
Reader->SetDataSpacing (0.8, 0.8, 1.5);//设置切片之间的间距和像素之间的间距
4.2 提取等值面
下面我们就可以用 Marching Cubes算法对所读取的数据进行处理了首先利用vtkMarchingCubes 类来提取出某一CT值的等值面但这时的等值面其实仍只是一些三角面片还必须由vtkStripper类将其拼接起来形成连续的等值面这样就把读取的原始数据经过处理转换为应用数据也即由原始的点阵数据转换为多边形数据然后由vtkPolyDataMapper将其映射为几何数据并将其属性赋给窗口中代表它的演员将结果显示出来
// 从切片数据中提取出皮肤
vtkMarchingCubes *skinExtractor = vtkMarchingCubes::New();//建立一个Marching Cubes 算法的对象
skinExtractor->SetInput(Reader->GetOutput());//获得所读取的CT 数据
skinExtractor->SetValue(0, 500); //提取出CT 值为500的皮肤
vtkStripper *skinStripper = vtkStripper::New(); //建立三角带对象
skinStripper->SetInput(skinExtractor->GetOutput());//将生成的三角片连接成三角带
vtkPolyDataMapper *skinMapper = vtkPolyDataMapper::New();//建立一个数据映射对象
skinMapper->SetInput(skinStripper->GetOutput());//将三角带映射为几何数据
vtkActor *skin = vtkActor::New(); //建立一个代表皮肤的演员
skin->SetMapper(skinMapper); //获得皮肤几何数据的属性
skin->GetProperty()->SetDiffuseColor(1,.49, .25); //设置皮肤颜色的属性
skin->GetProperty()->SetSpecular(.3);//设置反射率
skin->GetProperty()->SetSpecularPower(20);//设置反射光强度
利用同样的方法 我们也可以提取出骨骼的等值面只是骨骼的CT 值是1150左右而已所以只要在SetValue()方法中将参数设置为1150 就可以了而且VisualizationToolkit支持多表面重建所以在实际应用中我们可以设置多个参数值提取出多个等值面并同时显示出来在这个应用实例中我们只对皮肤和骨骼地的等值面进行了重建
4.3显示结果
通过前面这些工作我们基本上已经完成了对数据的读取处理映射等步骤下面我们就要对数据进行显示了

             
图3 重建的人体头部骨骼图 4 重建的人体头部骨骼和皮肤
vtkRenderer *ren = vtkRenderer::New(); //建立绘制者
vtkRenderWindow *renWindow = vtkRenderWindow::New(); //建立绘制窗口
renWindow->AddRenderer(ren); //将绘制者加入绘制窗口
vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();//对绘制结果进行交互
操作
iren->SetRenderWindow (renWindow);
// 告诉绘制者将要在绘制窗口中进行显示的演员
ren->AddActor(skin); //皮肤
ren->AddActor(bone); //骨骼
5. 结束语
Visualization Toolkit是采用C++语言设计的一个基于Windows/Unix 环境的面向对象对象的可视化类库具有十分强大的可视化功能与MFC强大的图形界面功能相结合可以方便快捷的开发出高性能的可视化程序并且可以在不同的开发环境下使用如Microsoft Visual C++BorlandC++等对于一般的用户它屏蔽了一些常见算法和复杂的数据处理过程使不具备可视化程序开发经验的用户也可以方便快捷地编制可视化程序
同时对于具有可视化程序开发经验的用户VTK也提供了相应的方法使用户可以对其进行改进以支持对可视化程序的行优化在开发可视化程序的过程中具有十分重要的意义
参考文献
[1] Sabe P. A Rendering Algorithm for Visualization 3D ScalarFields. Computer Graphics, August 1988,22(4):
51~58
[2] W.C.Lin, C.C.Liang, C.T.Chen, Dynamic elastic interpolation for3D medical image reconstruction from
serial cross sections, IEEE Trans. On Medical Imaging, Vol.7, No.3,1988,225~232
[3] G.T.Herman and H.K.Lin, Three-dimensional display of humanorgans from Computed Tomograms, CVGIP
9, 1979, 1-21
[4] Krueger W, Volume rendering and feature enhancement, ComputerGraphics, 1990,24(5): 21~26
[5] Max N. Area and Volume Coherence for Efficient Visualization of3D Scalar Functions. Computer Graphics,
1990, 24(5): 27~33
[6] Will Schroeder, Ken Martin, Bill Lorensen, VisualizationToolkit 2nd Edition - An Object-Oriented
Approach to 3D Graphics, Prentice Hall, 1988
[7] 管伟光体视化技术及其应用北京电子工业出版社1998
[8] 管伟光体数据可视化及其在医学中的应用中国科学院自动化所博士论文1995
[9] 吕维雪医学图像处理北京高等教育出版社1989
[10] 唐泽圣三维数据场可视化北京清华大学出版社1999
[11] 石教英蔡立文科学计算可视化算法与系统北京科学出版社1996

VTK一个面向对象的可视化类库相关推荐

  1. VTK:一个面向对象的可视化类库(zz)

    VTK:一个面向对象的可视化类库(zz) (高隽 黄伟 合肥工业大学计算机与信息学院 合肥 230009)         摘要 Visualization Toolkit 是一个面向对象的可视化类库 ...

  2. VTK:点定位器可视化用法实战

    VTK:点定位器可视化用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkCallbackComman ...

  3. VTK:二次可视化用法实战

    VTK:二次可视化用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkAppendFilter.h&g ...

  4. VTK:细胞定位器可视化用法实战

    VTK:细胞定位器可视化用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkCallbackComma ...

  5. 企业如何选择一个合适的可视化工具

    高质量的可视化工具对数据分析是必不可少的.数据可视化工具是一种应用软件,它帮助用户以可视化和图形化的格式显示数据,并提供数据的完整轮廓.饼图.曲线.热图.直方图.雷达/蜘蛛图只是可视化的一小部分,这些 ...

  6. R语言ggplot2可视化:patchwork包将一个ggplot2可视化结果和一个plot函数可视化结果横向组合起来形成最终结果图、两个可视化的组合结果对齐、并为组合图像的每个子图添加标题

    R语言ggplot2可视化:使用patchwork包(直接使用加号+)将一个ggplot2可视化结果和一个plot函数可视化结果横向组合起来形成最终结果图.将两个可视化的组合结果对齐.并为组合图像的每 ...

  7. Python VTK numpy数据3D可视化

    在Python的3D图像处理中,通常用numpy array来进行非常方便的计算或者转化,这里记录一下numpy数据的VTK可视化基本流程,包括面绘制(Surfase Rendering)和体绘制(V ...

  8. 【VTK+有限元后处理】可视化结果云图

    构建vtkUnstructuredGrid对象 为了读取不同格式的有限元计算结果文件,我们先写一个FEDataModel类来管理有限元的几何拓扑和属性信息. class FEDataModel:&qu ...

  9. 爱了!安利一个相见恨晚的可视化学习网站

    来源:Python数据科学 原创 作者:东哥起飞 最近日常逛逛技术平台,偶然间发现了一个非常牛逼的可视化学习网站.东哥之前在公众号和技术群里也推荐过一些,但和这个相比我觉得真是太逊色了. 好了,话不多 ...

最新文章

  1. Java和.NET使用DES对称加密的区别
  2. jQuery UI vs Kendo UI jQuery Mobile vs Kendo UI Mobile
  3. JS event使用方法详解
  4. TLD(Tracking-Learning-Detection)学习与源码理解之(六)
  5. LINUX静态网络配置
  6. python嵩天第二版第五章_如何避免从入门到放弃——python小组学习复盘
  7. 初始化linux-nginx的安装和使用
  8. 小程序开发(13)-location定位
  9. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化dp
  10. Spring Boot: 加密应用配置文件敏感信息
  11. linux 计时程序,Linux下使用clock_gettime给程序计时
  12. Spring提供的iBatis的SqlMap配置
  13. 《老罗Android开发视频教程》更新
  14. 如何在Word中输入英语音标?非常简单好用
  15. 李克平教授讲座——《城市道路交叉口规划规范》解读与绿灯间隔(整理文本)...
  16. 史上最详细嵌入式系统设计师修炼手册
  17. Gson解析遇到的异常分析与记录
  18. HTML5滑动(swipe)事件,移动端触摸(touch)事件
  19. AE插件哪款好?这5款堪称动效设计必备
  20. H5 集成微信自定义分享(兼容 ios android)

热门文章

  1. 在清理卫生的时候面对奖状和过去的日记本应该怎么处理
  2. 最佳的七十五个网络分析和安全工具
  3. QT. 学习之路 一
  4. AWS_EC2_Oracle安装教程
  5. Hadoop 安装详解--新手必备
  6. oracle数据库从入门到精通之三
  7. Safari 10默认禁用Flash插件
  8. C语言指针和链表的体会
  9. 【资源】C++学习资料 - 逆天整理 - 精华无密版【最新】
  10. Font Awesome 完美的图标字体