基于VTK与Qt的体绘制程序
基于VTK與Qt的體繪制程序
分類: VTK Qt Volume Rendering C&C++ 2013-06-10 09:17 3434人閱讀 評論(13) 收藏 舉報目錄(?)[+]
1???????基于VTK與Qt的體繪制程序
1.1?????體繪制介紹
體繪制(Volume Rendering)是一種從離散三維數據場獲得二維投影圖像的技術。體繪制在醫學成像和科學可視化當中有著廣泛應用。用于體繪制的數據集也稱為體數據(Volume Data)。典型的三維體數據是通過 CT、MRI等成像技術采集的一組二維切片圖像。通常這些圖像都是按照某種規則(如每毫米一個切面)采集并重建而成,并有著相同數量的像素。這種體數據是規則的立體晶格,每個體數據的元素(又稱為體素,Voxel)由一個通過采樣周圍相鄰區域的體素獲得的采樣值來表示。
體繪制技術可以根據是否提取曲面分為直接體繪制和間接體繪制(又稱為面繪制)兩大類。間接體繪制是先從體數據中提取等值面,然后繪制等值面組成的多邊形網格;直接體繪制則是將體數據直接作為一個離散三維數據場來繪制。而直接體繪制則直接從體數據中通過顏色與不透明度映射來生成三維數據集的二維投影圖像。相對于間接體繪制來說,直接體繪制具有更大的優勢,也就是不需要生成中間圖元,直接對體數據進行成像,顯示出全部的數據信息并且不會造成數據的丟失,而且成像的效果好于面繪制的結果,對人體內部的組織信息能夠呈現出體數據更精細的顯示結果,具有高度的保真性。由于直接體繪制是目前體繪制技術的主流,以下提到的體繪制都是指直接體繪制。
體繪制的更多信息,可參考:
體繪制(Volume Rendering)概述之1:什么是體繪制
http://blog.csdn.net/liu_lin_xm/article/details/4850575
體繪制(Volume Rendering)概述之2:體數據詳解
http://blog.csdn.net/liu_lin_xm/article/details/4850593
1.2?????傳遞函數
為了繪制三維體數據的二維投影,需要為每個體素定義不透明度與顏色。這通常由稱為傳遞函數(Transfer Function)的映射來實現。傳遞函數為每個可能的體素定義相應的不透明度與顏色值。在體繪制過程中,體數據首先要經過傳遞函數,將測量得到的灰度值映射為用于顯示的不透明度值和顏色值,然后通過光線投射法或者其它體繪制算法繪制出一種根據體數據中所有體素的顏色與不透明度疊加而成的具有立體感的投影圖像。
體繪制時,每個采樣值都必須映射為不透明度與顏色。這種從體素到不透明度與顏色的映射是通過傳遞函數來實現的。傳遞函數可以是簡單的線性函數、分段線性函數或者任意的表。
在VTK中,傳遞函數由顏色傳遞函數(vtkColorTransferFunction)與不透明度傳遞函數(vtkPiecewiseFunction)兩個類來處理。
1.3?????光線投射算法
光線投射法(Volume Ray Casting)可以直接從渲染方程(RenderingEquation)得到。這種技術可以提供非常高的成像質量,通常認為這是圖像質量最高的方法。但由于此算法需要需要遍歷每個體素,計算復雜度較高。為了提高算法的繪制速度,研究者先后提出了很多改進技術,如采用可以減少投射光線數量的自適應圖形采樣技術,以及可以減少不必要采樣點的空間跳躍技術。
典型的光線投射法包含四個步驟,如下圖:
·???????投射光線。對最終圖像中的每個像素,投射一束沿著視線的光線穿過體數據。在這一階段,通過將體數據看作被一個基本幾何原素(通常是立方體)包圍著,并利用這個幾何原素的邊界來截斷投射的光線。
·???????采樣。沿著體數據內的一段視線,等距離地采樣一組點。通常體數據沒有與視線對齊在一直線上,因此要對所視線經過的采樣點按其周圍的體素值采樣。這通常需要對采樣點周圍的體素進行三線性插值(Trilinearly Interpolate)。?
·???????著色。先對每個采樣點分別計算梯度。這些梯度代表了體數據中局部表面的方向。然后根據其方向與場景中的光源對采樣點著色,即加上顏色與光照。
·???????混合。在所有采樣點都著色之后,沿著視線混合在一起,就得到當前正在處理的像素的最終顏色值。計算混合的方法是從繪制方程推導得到的,這類似于在投影儀上將幻燈片疊加在一起的效果。混合方法包括從后向前混合與從前向后混合兩種。從后向前混合是從離觀察者最遠的采樣點開始沿著視線向前混合,這樣可以保證體數據中被遮蔽的部分不會影響最終得到的像素。
?
光線投射算法的更多細節,可參考:
體繪制(Volume Rendering)概述之3:光線投射算法(Ray Casting)原理和注意要點
http://blog.csdn.net/liu_lin_xm/article/details/4850609
體繪制(Volume Rendering)概述之4:光線投射算法(Ray Casting)實現流程和代碼
http://blog.csdn.net/liu_lin_xm/article/details/4850630
GPU raycasting tutorial
http://www.daimi.au.dk/~trier/?page_id=98
1.4?????基于VTK與Qt的體繪制程序
以下是本文作者最近寫的一個基于VTK與Qt的體繪制程序:
https://bitbucket.org/lsz/volume-renderer/
源代碼在VolumeRenderer目錄下。數據文件在data目錄下。更多信息見readme.txt。
這個程序使用了VTK的vtkMetaImageReader和vtkSmartVolumeMapper來分別讀取和繪制體數據。程序中還是用了部分來自CTK (The Common Toolkit, http://www.commontk.org/)的控件。開源的體繪制軟件3D Slicer (http://www.slicer.org/)中也用到了這些CTK控件。
以下是程序中用于讀取體數據的代碼。
// read Meta Image (.mhd or .mha) files
auto reader =vtkSmartPointer<vtkMetaImageReader>::New();
reader->SetFileName(filename_str);
這里采用了vtkMetaImageReader類來讀取UNC Meta Image格式的體數據頭文件。UNC Meta Image格式的說明,可參考vtkMetaImageReader的類描述:
http://www.vtk.org/doc/release/6.1/html/classvtkMetaImageReader.html
上面的auto關鍵字是C++11標準的類型推導,編譯器自動根據賦值表達式的類型來確定需要聲明的變量類型。
vtkSmartPointer是VTK的智能指針,會自動維護所管理指針的引用計數。當智能指針析構時如果其所管理的指針的引用計數為零,則釋放其管理的指針指向的內存。C++11標準的std::shared_ptr以及Qt中的QSharedPointer也是類似的智能指針。不同的是,vtkSmartPointer專門用于VTK類(繼承自vtkObjectBase的類),而std::shared_ptr與QSharedPointer則是通用的智能指針。
以下是程序中選擇體繪制算法的代碼。
// The mapper that renders the volume data.
auto volumeMapper =vtkSmartPointer<vtkSmartVolumeMapper>::New();
volumeMapper->SetRequestedRenderMode(vtkSmartVolumeMapper::GPURenderMode);
volumeMapper->SetInputConnection(shiftScale->GetOutputPort());
?
這里采用了vtkSmartVolumeMapper類,并將其繪制模式設置為vtkSmartVolumeMapper::GPURenderMode。在此GPU繪制模式下,vtkSmartVolumeMapper實際上使用vtkGPUVolumeRayCastMapper類來進行基于GPU的體繪制。
窗口右邊的控件是CTK(www.commontk.org)庫中的ctkVTKVolumePropertyWidget體數據屬性控件。這個控件可用于設置VTK的vtkPiecewiseFunction(對應窗口右上方的控件)與vtkColorTransferFunction(對應窗口右下方的控件)。vtkPiecewiseFunction與vtkColorTransferFunction這兩個類是VTK中用于指定傳遞函數的類。通過ctkVTKVolumePropertyWidget控件,我們就可以手動調節傳遞函數,從而探究體數據中我們感興趣的信息。
此程序在VisualStudio 2012中編寫,使用了VTK 6.0與Qt 4庫,項目通過CMake來配置。編譯方法,首先通過CMake生成Visual Studio項目文件,然后以Visual Studio打開生成的項目文件,編譯并運行其中的VolumeRenderer項目。
VTK與Qt開發的更多信息,可參考
基于VTK的Qt應用程序開發
http://blog.csdn.net/www_doling_net/article/details/8668870
總結
以上是生活随笔為你收集整理的基于VTK与Qt的体绘制程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LaTeX学习教程
- 下一篇: Windows10/11安装Linux子