摘要-VTK图形图像开发进阶

本章小结
1 本章主要介绍了什么是VTK;VTK能做些什么事情;如何获取VTK的源码,同时列举了除本书以外的其他VTK学习资源。
此外,为安装VTK做了非常充分的准备工作,了解了在编译安装VTK之前需要先安装哪些软件。然后一步一步地演示如何编译VTK,这个过程还是比较简单的。编译完VTK后,通过这个小程序学习了CMakeLists.txt脚本的写法,并掌握了6个CMake命令,分别是CMAKE_MINMUM_REQUIRED,PROJECT,FIND_PACKAGE,INCLUDE,ADD_EXECUTABLE和TARGET_LINK_LIBRARIES。

2 本章在第1章示例程序的基础上做了扩展,引入了VTK的一些基本概念,包括Mapper,Actor,RenderWindow,Renderer和RenderWindowInteractor等。紧接着介绍了计算机图像学三维渲染的几个基本概念——光照,相机和纹理映射等。本章的第3节简单介绍了VTK的坐标系统及其坐标变换。“VTK管线”和“VTK智能指针”两节向读者阐释了学习和使用VTK时需要深入理解的概念,其中VTK可视化管线贯穿所有的VTK应用程序,而理解与掌握VTK智能指针的使用有利于写出更加高效的VTK应用程序。
学习本章时,读者需要一些基本的计算机图形学的知识储备,因为VTK的一个主要应用方向就是计算机图形学领域。同时,建议读者在学习本章内容的同时复习一下C++基础知识。

3 VTK基本数据结构
正如文章开头所说,光是了解每种原料的特点而没有掌握做菜的流程,依然做不出美味可口的菜。就好比学习《数据结构》这门课程,在学习数据结构的同时,都会通过学习某些算法来理解各种数据结构的用法。否则,即使掌握了各种各样的数据结构,也不知道如何使用它们。学习本章所介绍的数据结构的用法时,可以参考第5章和第6章相关的算法加以理解。对于VTK中的某些概念性的东西,还是有必要掌握的。
本章主要介绍了数据对象(vtkDataObject),数据数组(vtkDataArray)和场数据(vtkFieldData)等内容。
(1)vtkDataObject
VTK中的数据一般是以数据对象的形式表现的,vtkDataObject是VTK可视化数据最常用的表达形式,数据对象表现的税局可被可视化管线所处理,当数据对象组织成一种结构以后,这些数据才能被VTK的可视化算法处理。
将数据对象组织成一种结构并且赋予相应的属性值时就形成数据集(vtkDataSet)。类vtkDataSet是从vtkDataObject派生的,vtkDataSet的组织结构由拓扑结构和几何结构两部分组成。
(2)vtkDataArray
数据数组vtkDataArray及其子类是建立VTK数据对象的基础。不同类型的数据对象(如vtkDataArray)都含有几何结构和拓扑结构信息,而这些结构信息的存储就是使用vtkDataArray及其子类,比如vtkPolyData里的vtkCellArray存储拓扑结构信息。
(3)vtkFieldData
数据集里的属性数据是对拓扑结构和几何结构信息的补充,属性数据可以是某个空间点的温度值,也可以是某个单元的质量等。与数据集的点数相关联的属性数据用vtkDataSetAttributes派生自vtkFieldData。换言之,可以使用vtkFieldData来存储像颜色,加速度,标号,名字,温度,质量等等这些属性数据。一般的用法是:
dataset->GetPointData()->AddArray(attributeArray);
除了以上内容,本章还列举了不同类型的线性与非线性单元的结构以及各种属性数据。对于这些内容,本章还列举了不同类型的线性与非线性单元的结构以及各种属性数据。对于这些内容,建议通过查看VTK附带的示例程序或者相关参考资料来加深理解,单纯看某一种数据结构,总是会让人觉得乏味,更不知如何使用,最好能结合某个可视化算法进行理解,具体请参考第5章和第6章等内容。

4 VTK数据的读写
本章主要介绍了处于VTK可视化管线两端的类,即读操作和写操作相关的类。VTK针对不同的数据类型,提供了不同的读写类,对于类的使用者而言,最重要的是根据不同的文件类型选择合适的Reader/Writer进行读写操作。
另外,VTK还可以导入由其他3D模型软件所生成的文件,也可将VTK里生成的数据写成可被其他3D模型软件所处理的模型文件,这样有利于VTK与其他主流的模型软件的结合。

5 VTK图像处理
本章主要介绍了VTK图像处理的相关内容。本章内容较多,主要包括了图像创建,图像显示管线,图像基本操作,边缘检测,图像平滑和频域处理等。图像创建部分介绍了除文件读入方式外的图像创建方法。通过图像源类可以创建一些特定的图像,而通过直接创建方式则可以灵活的创建各种图像,这在图像处理的Filter中用的比较多。图像显示管线部分主要分析了建立图像可视化管线的基本流程,并介绍了三维医学图像显示的相关知识。在许多图像处理应用中,经常会用到图像像素遍历,图像感兴趣区域提取,图像类型转换,颜色空间转换,直方图计算等内容,这也是本章第3节中着重分析的内容。边缘检测部分主要介绍了一阶边缘算子,如梯度算子,还有大名鼎鼎的Canny算子以及二阶的拉普拉斯算子。在图像平滑一节中,除了介绍均值平滑,高斯平滑,中值滤波等基本平滑方法外,还分析了各向异性滤波。各向异性滤波能够在对图像进行平滑的同时保持图像边缘信息。最后介绍了图像的频域处理。图像频域处理是图像处理领域的一类重要的方法,可以应用于图像平滑,边缘提取,数字水印等内容。这里主要介绍了基于VTK的图像快速傅里叶变换,快速傅里叶逆变换,理想低通滤波器,理想高通滤波器和巴特沃斯高通滤波器。掌握这些基本图像处理工具后,读者可以在不同的应用领域,利用VTK进行相关的图像处理开发。

6 VTK图形处理
图形处理是VTK中的一个重要内容。本章主要以多边形数据(vtkPolyData)为例来说明怎样利用VTK来开发图形处理的应用程序。vtkPolyData是一种使用较为广泛的VTK数据结构,而且在实际应用中,用vtkPloyData可以表示很多常用的数据,例如点云数据,面片模型等。因此,掌握vtkPolyData数据及其处理是学习VTK的一个重要内容。本章开始分析了vtkPolyData数据的基本组成,创建方法和显示管线。掌握这些基本内容,便了解了怎样将实际中的数据转换成一个vtkPolyData数据,并根据不同的需求将其显示出来。接着以一些简单的示例来分析一些vtkPolyData数据,并根据不同的需求将其显示出来。接着以一些简单的示例来分析一些vtkPolyData的基本操作,包括距离,面积,包围盒,法向量以及符号化等。这些都是高级图形处理的基本工具。对于高级图形处理,本章选择了一些比较有代表性的实例,着重分析了图形平滑,封闭性检测,连通性分析,多分辨率处理,表面重建,点云配准,纹理映射等内容。掌握了这些内容,便可以解决许多实际的工程问题,此外,还可以将实现自定义的算法用于处理图形数据,当然这也需要继续阅读本书关于如何自定义VTKFilter的相关内容。

7 体绘制
体绘制是VTK中的一个重要内容。本章从一个示例入手讲述了一个标准的VTK体绘制渲染流程。其中两个重要的内容分别是vtkVolumeMapper和vtkVolume。vtkVolumeMapper及其子类实现了各种体绘制算法:光线投射算法如vtkVolumeRayCastMapper,vtkFixedPoinVolumeRayCastMapper,vtkGPUVolumeRayCastMapper,基于纹理映射的体绘制算法如vtkVolumeTextureMapper2D,vtkVolumeTextureMapper3D等。这些算法各有不同,在精度和速度上各有侧重。实际中,经常会应用LOD技术来使用多种方法实现体绘制,在满足精度的要求下提高交互体验。另外,这些Mapper对象所处理数据的类型也有所不同。
vtkVolume负责组合体绘制管线,除了包含一个Mapper对象外,还需用vtkVolumeProperty对象来设置体绘制的颜色映射,如不透明度函数,颜色传输函数,梯度不透明度函数以及设置阴影效果等。vtkLODProp3D则提供了一种LOD技术来集成多种Mapper对象,能够有效提高渲染效率和交互体验。
本章最后还简单介绍了不规则网格的体绘制技术,这部分内容较于规则网格体绘制技术研究较少。
体绘制算法相对比较复杂,需要明白算法的原理后,才能方便的使用。本章仅提供一个简单的介绍,读者如有兴趣,可以查询相关的算法内容作进一步学习。

8 VTK交互与Widget
本章主要介绍了VTK的交互功能。在VTK中要实现与数据的交互,可以基于观察者/命令模式。可以通过两种方式来实现该模式:一种是通过定义回调函数;另一种是通过从vtkCommand派生出子类。两者的实现过程基本类似,都是通过AddObserver监听感兴趣的事件,然后在回调函数或者vtkCommand::Execute()函数里实现所需的功能。
除了基于观察者/命令模式实现VTK交互,还可以通过交互器样式。在“交互器样式”一节里,借助一个非常简单的示例演示了VTK里的消息是如何传递的。在VTK程序中,当实例化对应的子类来响应窗口消息,VTK内部通过vtkObject::InvokeEvent()函数将平台相关的消息翻译成VTK事件,最后再分发给不同的观察者,而观察者则调用回调函数vtkInteractorStyle::ProcessEvents()具体来处理这些VTK事件。因此,也可以从vtkInteractorStyle或其子类中派生出子类,在所派生的子类里定制这些VTK事件的处理过程,实现所需的交互。
无论是观察者/命令模式的交互还是交互器的交互,在用户交互过程中都无法看见交互的样式,而VTK Widget则弥补了这个不足。VTK提供了种类丰富,功能强大的Widget,vtkAbstractWidget实现了“交互/表达实体”分离的设计机制,使得事件处理与Widget的表达实体互不干扰。不同Widget的使用步骤基本相似:首先是实例化Widget:然后给该Widget对象指定渲染窗口交互器,必要时使用观察者/命令模式创建回调函数:接着创建合适的几何表达实例来表示Widget的样式;最后是激活Widget,让其在渲染场景中可见。
选择拾取是交互过程中的一个重要功能。VTK中的拾取类继承自vtkAbstractPicker,8.4节通过具体的示例程序演示了VTK点拾取,单元拾取以及Prop对象拾取的使用方式,从中可以看出,实现拾取时主要调用了Pick()函数。除了本章介绍的拾取类,VTK还提供了vtkAreaPicker,vtkWorldPointPicker等类。

9 基于VTK的GUI程序
本章通过示例分析了VTK与GUI开发工具的整合技术。VTK对Qt提供了非常好的支持,可以通过QVTKWidget很容易的在Qt应用程序中使用VTK。本章以一个图像浏览程序为例进行分析,并介绍了使用CMake管理VTK/Qt工程。第二部分内容则为MFC环境下VTK应用程序开发。MFC也是一种使用非常广泛的GUI开发工具,首先分析了MFC单文档应用程序中进行VTK开发的相关内容,并进行扩展,实现一个图像重采样应用程序,然后以一个四视图医学图像浏览器为例,分析了VTK在MFC对话应用框中的开发技术。掌握了VTK与GUI开发工具的整合技术,有助于将VTK与实际工程应用相结合,提高工程开发效率。此外,建议采用CMake管理相关的工程。

10 自定义VTK类
本章内容主要分为三个部分:第一部分是VTK开发基础内容,该部分内容贯穿整个VTK框架,主要涉及了引用计数,智能指针,观察者/命令模式等重要内容;第二部分分析了VTK的管线机制,首先分析VTK管线模型的基本组成,包括算法对象vtkAlgorithm,执行对象vtkExecutive,端口以及信息对象,并在此基础上分析VTK管线的执行机制,着重分析了一些常用的标准执行对象;最后一部分内容是讲解如何自定义Filter类,并结合一个示例进行分析。
本章内容比较抽象,需要结合VTK的源码进行阅读。通过学习本章,读者能够了解VTK基础知识和管线执行原理,并能够掌握自定义Filter的方法,实现更高级的VTK开发应用技术。

参考文献:VTK图形图像开发进阶 张晓东,罗火灵著

猜你喜欢

转载自blog.csdn.net/qq_34356368/article/details/81635172