摘要-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圖形圖像開發進階 張曉東,羅火靈著

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章