VTK 圖形基本操作進階_表面重建技術(等值面提取)


1.等值面提取

等值面(線)提取是一種常用的可視化技術,常應用於醫學、地質、氣象等領域。例如,在醫學圖像處理中,由於CT、MRI等圖像分辨率越來越高,雖然體繪制技術可以清晰地對數據內部結構進行可視化,但是其計算量和效率卻制約了其使用。此時可通過等值面提取技術,僅提取感興趣的一個或者幾個組織輪廓,並生成網格模型以供后續的處理和研究。
根據數據類型的不同,VTK中提供了多個等值面提取類,其類圖如圖所示:
 
VTK中的等值面提取算法多基於MarchingCube算法來實現。MarchingCube是經典的移動立方體等值面提取算法。該算法是由W.E.Lorenson和H.E.Cline在1987年提出的。由於這一方法原理簡單,易於實現,目前已經得到了較為廣泛的應用,稱為三維數據等值面生成的經典算法。等值面提取類根據數據類型的不同而有所側重。
  • vtkImageMarchingCubes:主要處理三維圖像數據
  • vtkMarchingCubes:主要針對規則體數據生成等值面
  • vtkMarchingSquares:則是針對二維規則網格數據生成等值線
  • vtkMarchingContourFilter:可以接受任何類型的數據,其內部根據數據不同生成不同的算法對象實現等值面/線的提取,具有較高的效率
  • vtkContourFilter:則是一個更加通用的等值面提取類,其可以接受任意的數據類型生成等值線或等值面。
vtkDiscreteMarchingCubes繼承自vtkMarchingCubes,主要針對Label圖像,比如利用圖像分割算法對醫學圖像進行分割后得到含有不同Label值得數據,每個Label對應一個組織,吐過想要得到其中一個或者幾個組織的洛括模型,則可以考慮使用該類。

2.vtkMarchingCubes用於等值線提取實驗

上面的幾個類的使用方法基本一致,下面僅以vtkMarchingCubes為例來演示提取圖像數據等值面的效果:
 1 #include <vtkAutoInit.h>
 2 VTK_MODULE_INIT(vtkRenderingOpenGL);  3 VTK_MODULE_INIT(vtkRenderingFreeType);  4 VTK_MODULE_INIT(vtkInteractionStyle);  5  
 6 #include <vtkSmartPointer.h>
 7 #include <vtkMetaImageReader.h>
 8 #include <vtkImageData.h>
 9 #include <vtkMarchingCubes.h>
10 #include <vtkPolyDataMapper.h>
11 #include <vtkActor.h>
12 #include <vtkProperty.h>
13 #include <vtkRenderer.h>
14 #include <vtkRenderWindow.h>
15 #include <vtkRenderWindowInteractor.h>
16 #include <vtkInteractorStyleImage.h>
17 #include <vtkVoxelModeller.h>
18 int main() 19 { 20     vtkSmartPointer<vtkMetaImageReader> reader =
21         vtkSmartPointer<vtkMetaImageReader>::New(); 22     reader->SetFileName("HeadMRVolume.mhd"); 23     reader->Update(); 24  
25     vtkSmartPointer<vtkMarchingCubes> surface =
26         vtkSmartPointer<vtkMarchingCubes>::New(); 27     surface->SetInputData(reader->GetOutput()); 28     surface->ComputeNormalsOn(); 29     surface->SetValue(0, 100);  //第0個等值面 值為:200
30     surface->Update(); 31     //surface->GenerateValues(0, 150, 200);
32     /// 33     vtkSmartPointer<vtkPolyDataMapper> surfMapper =
34         vtkSmartPointer<vtkPolyDataMapper>::New(); 35     surfMapper->SetInputConnection(surface->GetOutputPort()); 36     vtkSmartPointer<vtkActor> surfActor =
37         vtkSmartPointer<vtkActor>::New(); 38     surfActor->SetMapper(surfMapper); 39     surfActor->GetProperty()->SetColor(1, 0, 0); 40     
41     vtkSmartPointer<vtkRenderer> surfRender =
42         vtkSmartPointer<vtkRenderer>::New(); 43     surfRender->AddActor(surfActor); 44     surfRender->SetBackground(0, 0, 0); 45  
46     vtkSmartPointer<vtkRenderWindow> rw =
47         vtkSmartPointer<vtkRenderWindow>::New(); 48     rw->AddRenderer(surfRender); 49     rw->SetSize(640, 480); 50     rw->SetWindowName("PolyData MarchingCubes"); 51     rw->Render(); 52  
53     vtkSmartPointer<vtkRenderWindowInteractor> rwi =
54         vtkSmartPointer<vtkRenderWindowInteractor>::New(); 55     vtkSmartPointer<vtkInteractorStyleImage> style =
56         vtkSmartPointer<vtkInteractorStyleImage>::New(); 57     rwi->SetInteractorStyle(style); 58     rwi->SetRenderWindow(rw); 59     rwi->Initialize(); 60     rwi->Start(); 61  
62     return 0; 63 }
首先通過一個reader對象來讀取一幅圖像,並將輸入到vtkMarchingCubes中,提取等值面時,最重要的是要設置等值面的數值,SetValue()函數用於設置等值面的值,其第一個參數表示等值面的序號,因此可以通過這個函數設置多個等值面值來提取多個等值面。另外我們也可以通過GenerateValues提取多個等值面。
1 void GenerateValues(int numContours,double range[2]); 2 void GenerateValues(int numContours, double rangStart, double rangeEnd);
其中,numContour為生成等值面的個數,range表示獲取等勢面數值的范圍。
其實,這里面還有一個求取法向量的過程,我們可能會感到比較奇怪??!
通過前面分析的內容,我們知道,法向量可以提高渲染質量 。

3. cannot convert parameter 1 from 'vtkImageData *' to 'vtkDataObject *'

在vtkuser里看到有人提問了。
解決方法很簡單:
增加頭文件:
#include "vtkImageData.h"即可

4.一直以來未解決的問題

貌似一直以來除了我,沒有人遇到過啊???其實在32bit平台上也沒有遇到過。。。繼續吧。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM