VTK修炼之道61:体绘制_光线投影+最大密度投影+等值面法
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道61:体绘制_光线投影+最大密度投影+等值面法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.vtkVolumeMapper
vtkVolumeMapper是所有體繪制Mapper類的虛基類,提供接口函數,并由其子類實現具體功能。該類的繼承關系如下圖所示:應該掌握一些常用的體繪制類。
2.光線投射:vtkVolumeRayCastMapper
光線投射法是最常用的體繪制方法。它是一種基于圖像序列的直接體繪制方法。 光線投影法的基本原理是從投影圖像平面(通常為平面)的每個像素沿著視線方向發射一條穿過體數據的射線,然后在射線上按照一定的步長進行等距采樣,對每個采樣點采用插值技術來計算其體素值,根據顏色傳輸函數和不透明度傳輸函數來獲取相應的顏色值和不透明度,最后利用光線吸收模型將顏色值進行累加直至管線穿過體數據。這樣,就可以得到當前平面像素的渲染顏色,最終生成顯示圖像。 光線投影法的優點是能夠比較精確地模擬原始體數據,但計算量較大,實時體繪制對計算機硬件的要求比較高。 在VTK中,VTKVolumeRayCastMapper類可用于實現光線投影體算法,并生成渲染圖元數據傳遞給vtkVolume對象進行渲染。 vtkVolumeRayCastMapper采用軟件方法來實現光線投影算法,精度高但是計算量比較大,因此渲染速度相對比較慢。 該類內部實現了兩個非常重要的函數:- vtkVolumeRayCastMapper::SetInput(vtkImageData*):該函數用于設置輸入圖像數據;
- vtkVolumeRayCastMapper::SetVolumeRayCastFunction(vtkVolumeRayCastFunction*):該類用于設置光線投射函數。
2.1?vtkVolumeRauCastCompositeFunction
該方式通過Alpha合成技術生成每個像素的顏色值。對于每條光線在穿過體數據時,先根據設置的采樣步長進行采樣,通過插值技術來計算每個采樣點的像素值;然后根據vtkVolumeProperty中設置顏色傳輸函數和不透明度傳輸函數來計算采樣點的顏色和不透明度。最后,對所有采樣點采用Alpha合成方法計算最終的顏色。 另外,該方式還可以設置插值優先還是分類優先。插值優先是指對投射光線進行采樣,計算采樣點的顏色值時,先通過插值方式計算該采樣點的標量值(灰度值),然后再根據顏色傳輸函數和不透明度傳輸函數計算該點的顏色值和不透明度。分類優先是指在計算采樣點時,先根據顏色傳輸函數和不透明度傳輸函數計算包含該采樣點的立方體的8個頂點顏色值和不透明度,然后通過插值方法獲取當前采樣點的顏色值與不透明度。選擇插值優先還是分類優先要通過一下兩個函數:- SetCompositeMethodToInterpolateFirst()
- SetCompositeMethodToClassifyFirst()
2.2?vtkVolumeRayCastMIPFunction
最大密度投影函數主要用于對體數據中高灰度值得結構進行可視化。當光線穿過體數據時,在光線上進行等距采樣。取采樣點中屬性最大值為該條光線的輸出。光線對應的屏幕像素顏色值就可以通過該值進行顏色映射獲得。默認情況下,這個屬性是指體數據的像素值或者體數據的不透明度,其設置函數為:- SetMaximizeMethodToScalarValue()
- SetMaximizedMethodToOpacity()
2.3 vtkVolumeRayCastIsosurfaceFunction
對等值面繪制函數能夠渲染體數據中特定等值面,其中,SetIsoValue(double)函數用于設置等值面的值。在進行體繪制,所有小于該值的像素不透明度都設置為0.通過設定等值面的值,可以重建出某一特定的組織,如皮膚、骨骼等,渲染結果類似與面繪制。同樣地,使用該函數進行體繪制時,代碼如下: vtkSmartPointer<vtkVolumeRayCastIsosurfaceFunction> rayCastFun = vtkSmartPointer<vtkVolumeRayCastIsosurfaceFunction>::New(); rayCastFun->SetIsoValue(100);三種體繪制輸出結果如下: 1.光線投影法輸出圖像:效果最好; 2.最大密度投影法輸出圖像:缺乏深度信息(更像X光輸出); 3.等值面法體繪制輸出結果:與面繪制結果類似。3.光線投影體繪制討論
3.1 討論一:投影光線上的采樣點的步長
光線投影體繪制中,投影光線上的采樣點的步長是一個重要參數,決定了體繪制的精度和速度。步長越小,采樣點就越多,但是體繪制效果提高的同時計算量也會增加。vtkVolumeRayCastMapper中設置步長的函數為: Void SetSampleDistance(float);這里需要注意的是,等值面繪制函數不需要進行采樣,而其他另個繪制函數都需要進行采樣。在實際應用中,調整采樣步長主要考慮的因素有樣本間距、標量數據以及標量數據映射的顏色和不同明度變化率。vtkVolumeRayCastMapper中默認的采樣步長為1;單位為世界坐標系。下面顯示了步長為1和步長為4的兩種情況對比:
左側為步長等于1的情況;非常精細。 右側為步長等于4的卿狂,比較粗糙。 實際應用過程中,如果體數據變化比較劇烈,應該適當減小采樣步長以獲得比較精細的渲染結果,代價就是速度的降低。
3.2 討論二:圖像采樣間距(投影光線間隔)
默認情況下,圖像采樣間距為1,即每個像素對應一條投影光線;如果設為0.5,那么每個像素對應4條投射光線;如果設置為2,則每四個像素對應一條投影光線。設置圖像采樣距離的函數: void SetImageSampleDistance(float);需要格外注意的是,當使用這個函數的時候,必須先關閉自動調節采樣距離功能,代碼如下:SetAutoAdjustSampleDistance(0); //關閉自動調整采樣默認的情況下,該函數的功能是開啟的,以保證在圖像旋轉等交互時,能夠自動調整采樣距離保證實時性。如果關閉此功能,在旋轉圖像等交互過程中,體繪制渲染過程會變得很慢。
當然,即使我們采用自動調整圖像采樣距離,也可以設定它的范圍,控制函數為: void SetMaximunImageSampleDistance(float); void SetMinimumImageSampleDistance(float);下圖顯示的是不同圖像采樣距離的渲染結果: 左圖的圖像采樣距離為1;右圖的圖像采樣間距為4.同樣,步長越小,渲染越精細,渲染時間越長。
4.參看資料
1.《C++ primer》2.《The VTK User’s Guide – 11thEdition》
3. ?張曉東, 羅火靈. VTK圖形圖像開發進階[M]. 機械工業出版社, 2015.
總結
以上是生活随笔為你收集整理的VTK修炼之道61:体绘制_光线投影+最大密度投影+等值面法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 飞鸽传书该如何去优化?
- 下一篇: 转载Silverlight AutoCo