VTK可视化工具包
VTK(The Visualization Toolkits)是一個基于面向對象方法設計的、功能強大的可視化和圖形圖像處理的工具箱。它是在三維函數庫OpenGL的基礎上發展起來的,VTK构造在C++語言之上,它不僅基于C++類庫,還支持腳本語言TCL&Tk,Java,Python,支持Windows,Unix等操作系統。VTK能夠支持和處理多种表示格式的數据,如有規則的或無規則的點陣(pointsets),圖像(image),体元數据(volume)等。此外VTK還將在可視化開發過程中會經常遇到的細節屏蔽起來,并將一些常用的算法進行封裝,同時,用戶還可以在VTK基類的基礎上開發自己的類庫。自從1993年問世以來,VTK憑借其開放靈活的特性受到越來越多人的青睞,不斷地被改進和完善。
VTK绘图模式
VTK的繪圖模式可用于2D,3D等一般圖形的處理,它主要有9种基本對象: 基本对象 角色(Actor) 燈光(Light) 照相机(Camera) 屬性(Property) 映射(Mapper) 说明 VTKActor代表渲染場景中的繪制對象實体,通過調節參數可以設置角色的位置、方向、渲染特性、紋理影射等屬性。 VTKLlight類提供了燈光的位置、燈光的狀態(開關)、亮度、顏色等。同時也可以設置光源的照射角度以及衰減程度。 VTKCamera類用來設置視點的位置以及焦點位置及其他屬性。 Property主要用來說明几何物体的一些特征。比如光照特性、著色模式、物体灰度等。 Mapper指定數据与基本圖元之間的關系,VTKMapper的派生類通過一個向上觀察板(Look-upTable)來映射數据,同時控制与圖形庫相連的圖元的生成。 VTKTrasform是一個放置4×4變換矩陣的堆棧,可以對這個矩陣進行平移、縮放、旋轉等操作。 其基類為VTKRender-Window,用于在顯示設備中生成一個窗口,渲染窗口是用戶圖形界面,可以設置渲染窗口的大小,也可以產生立体顯示效果,支持雙緩存。 基類為VTKRenderer,主要用于控制目標的渲染過程,管理光源、照相机位置等屬性。 變換(Trasform) 渲染窗口(RenderWindow) 渲染器(Render) 窗口交互在VTK中,VtkRenderWindowlnteractor是場景交互方法的一种,它作為(Render Window 一种簡單的工具可以用來操作相机、選取對象、調用用戶定義的函數等。 Interactor)
VTK可视化模式
可視化模式主要用于可視化過程中的數据模式如CT,MRI的數据輸入及處理。VTK使用數据流的方式將源數据轉換為圖像數据。這里包含數据對象和處理對象2類基本對象。數据對象用來表示各种類型的數据,它由几何結构、拓扑結构以及屬性數据(如向量、標量)組成。處理對象一般分為源處理對象(Source)、過濾器(Filter)、映射器(Mapper)三類,它用來操作數据對象并生成新的數据對象。處理對象表示系統中對數据進行處理的算法。將數据對象和處理對象連接在一起就形成VTK中的可視化流水線,如圖1所示。
体绘制系统介绍与实现
這里使用TCI&TK語言,利用VTK函數庫實現一個簡單的体繪制系統。通過這個系統主要介紹如何通過調用VTK函數庫實現圖像重建,并且通過一個切片數据bolt.slc向大家展現不同的繪制方法所表現出的不同的效果。它可大体分為前台交互及后台計算2部分。其中前台交互是通過Tk實現的,后台的計算則以TCL為開發平台,通過對VTK中封裝的對象及方法的調用來實現。在整個系統中,對三維數据的繪制使用4种不同的方法:最大密度投影法;合成法;等值面法;二維紋理映射法。
TK & TCL
TCL代表“Tool Command Language”,是一种簡單的腳本語言,它几乎在所有的平台上都可以解釋運行,功能強大。TCL主要用于發布命令給一些交互程序如文本編輯器、可視化工具軟件、仿真工具等。它語法很簡單,并有很強的擴充性。TK是對TCL的圖形工具箱擴展。TK發行版与TCL的發行版是在一起的。在創建TK小部件時,几乎很少使用命令,一半以上都是按鈕或文本小部件的變体。選用TCL&Tk作為開發語言,是因為它靈活的特性和簡單的語法可以很方便地与VTK進行融合。
常用绘制算法介绍
(1)MC算法:Marching Cubes算法是一种應用很廣泛的由体密度數据重构三維等值面的方法。MC算法也被稱為“等值面提取”(Isosurface Extraction),其本質是將一系列兩維的切片數据看作一個三維的數据場,從中將具有某种域值的物質抽取出來,以某种拓扑形式連接成三角面片。MC算法流程如下:每次讀出2張切片,形成1層,2張切片上下對應的8個點构成1個立方体,然后按從左到右,從前到后的順序處理1層中的立方体,抽取每個立方体中的等值面,然后從下到上直至處理到n-1層,所以稱為移動立方体算法。MC算法屬于面繪制,也可以稱為間接体繪制。
(2)光線投射算法:光線投射算法(Ray Casting)是直接体繪制中最常用的算法,它的基本思想是:從屏幕上的每一像素點發出1條視線,這條視線穿過三維場的体元矩陣,沿這條視線等距設置采樣點,將距离采樣點最近的8個數据點所組成体素的顏色值及不透明度進行三次線形插值,求出該采樣點的不透明度及顏色值。然后可以按從前到后或從后到前的合成公式對所有采樣點的顏色和不透明度進行合成。當對所有像素點都進行以上過程后,就會得到此數据場的体繪制結果圖像
四种绘制方法分析与实现
(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所示。
試驗結果表明,Slice方法由于是切片投影,數据量相對比較小,因此成像速度快,并可以很清楚的觀測到不同的切片面關于不同數軸的繪制效果。但是它重建的圖像表面不光滑,容易出現鋸齒效應,這可能是由于圖像像素間的距离過大造成的,因此可通過插值計算來緩解這個現象。MIP算法不需要太多的參數設置,實現起來比較簡單,但是它對圖像的細節顯示得不清楚,在細節的描繪上不如Composite算法,這是由于投影密度值選擇方法的不同造成的,因此只能用于對細節要求不高的情況下。Isosurface算法是利用表面的信息進行重建,因此它的表面繪制效果很逼真,能夠很清楚直觀的顯示物体表面信息。
通過VTK提供的封裝算法,在一個普通的PC机上實現圖像的三維重建只需几秒鐘的時間,還可以利用鼠標直接拖動三維模型,實現旋轉、縮放、平移等操作,便于用戶根据需要從不同的視角觀察物体,增強了系統的交互能力。与OpenGL和Matlab相比,VTK具有使用靈活簡單、重建速度快,可視化效果好等优點。
结语
在可視化發展過程中,VTK憑借其開源、靈活、可封裝、可移植等特性被越來越多的開發人員所采用,它极大地簡化了程序,為開發人員節省了很多的時間和精力,在圖像的三維重建中得到了廣泛應用。本文所實現的系統就是一個將VTK應用到体繪制系統中的典型例子。VTK將一些常用到的体繪制算法進行封裝,系統通過直接調用這些VTK基類實現切片數据的三維重建可視化,通過4种不同的繪制方法,展現了不同的繪制效果。這對于幫助人們更好更深層次地分析、理解、掌握圖像信息產生了极大的推動作用。隨著今后信息化進程的發展,可視化領域將會有更廣闊的發展空間,体繪制技術也將會日益改進和完善。
vtk说明文档



