1. 程式人生 > 實用技巧 >VTK 影象處理_顯示(vtkImageViewer2 & vtkImageActor)

VTK 影象處理_顯示(vtkImageViewer2 & vtkImageActor)

1.vtkImageViewer2用於影象顯示例項分析

  在VTK早期版本中,提供了vtkImageViewer類來顯示影象。隨著版本的發展,目前vtkImageViewer2代替了vtkImageViewer進行影象顯示。vtkImageViewer2中封裝了VTK影象顯示的管線,包括vtkActor,vtkRender,vtkRenderWindow,vtkInteractorStypeImage等物件,可以方便的完成影象顯示和互動。該類提供的主要互動操作有:影象放縮,窗寬窗位調節,並提供切片選擇,切片方向設定介面,尤其適合三維影象的顯示。

 1 #include <vtkAutoInit.h>        
 2
VTK_MODULE_INIT(vtkRenderingOpenGL); 3 4 #include <vtkSmartPointer.h> 5 #include <vtkMetaImageReader.h> 6 #include <vtkImageViewer2.h> 7 #include <vtkRenderer.h> 8 #include <vtkRenderWindow.h> 9 #include <vtkRenderWindowInteractor.h> 10 11 int main(int
argc, char* argv[]) 12 { 13 vtkSmartPointer<vtkMetaImageReader> reader = 14 vtkSmartPointer<vtkMetaImageReader>::New(); 15 reader->SetFileName("data/brain.mhd"); 16 reader->Update(); 17 18 vtkSmartPointer<vtkImageViewer2> viewer = 19 vtkSmartPointer<vtkImageViewer2>::New();
20 viewer->SetInputConnection(reader->GetOutputPort()); 21 22 //設定基本屬性 23 viewer->SetSize(640,480); 24 viewer->SetColorLevel(500); 25 viewer->SetColorWindow(2000); 26 viewer->SetSlice(40); 27 viewer->SetSliceOrientationToXY(); 28 viewer->Render(); 29 viewer->GetRenderer()->SetBackground(1,1,1); 30 viewer->GetRenderWindow()->SetWindowName("ImageViewer2D"); 31 32 vtkSmartPointer<vtkRenderWindowInteractor> rwi = 33 vtkSmartPointer<vtkRenderWindowInteractor>::New(); 34 //設定互動屬性 35 viewer->SetupInteractor(rwi); 36 37 rwi->Start(); 38 39 return 0; 40 }

  為了更好的說明vtkImageViewer2功能,使用一副三維醫學影象為例進行說明。首先使用vtkMetaImageReader讀入一個mhd影象,然後定義vtkImageViewer2物件顯示影象。最後定義了一個vtkRenderWindowInteractor物件,並傳遞給vtkImageViewer2物件,用於完成滑鼠、鍵盤等訊息響應,便於進行影象的互動操作。

  其中也設定了四個引數,窗位(ColorLevel)、窗寬(ColorWindow)、切片(Slice)和切片方向(Orientation)。按下滑鼠左鍵拖動滑鼠,可以調節影象的窗寬窗位,從而顯示不同灰度範圍內容;按下滑鼠右鍵拖動滑鼠可以放縮影象。當然這些互動操作可以由使用者根據需要自己定義vtkInteractorStyle子類,並響應相應的操作。

  而顯示三維影象時,需要確定當前顯示切片和方向。vtkImageViewer2提供了SetSlice()函式設定切片號,SetSliceOrientationToXY()則將切片的方向設定為垂直XY平面方向。此外還可以設定為垂直YZ或者XZ平面方向,其對應函式分別為SetSliceOrientationToYZ()和SetSliceOrientationToXZ()。預設情況下切片方向為垂直於XY平面即沿著Z軸方向,根據設定的切片號獲取Z軸方向的具體切片進行顯示。

2.vtkImageActor用於影象顯示

  vtkImageActor是一個三維影象渲染Actor,通過紋理對映將影象

 1 #include <vtkAutoInit.h>        
 2 VTK_MODULE_INIT(vtkRenderingOpenGL);   
 3  
 4 #include <vtkSmartPointer.h>
 5 #include <vtkBMPReader.h>
 6 #include <vtkImageActor.h>
 7 #include <vtkRenderer.h>
 8 #include <vtkRenderWindow.h>
 9 #include <vtkRenderWindowInteractor.h>
10 #include <vtkInteractorStyleImage.h>
11  
12 int main()
13 {
14     vtkSmartPointer<vtkBMPReader> reader =
15         vtkSmartPointer<vtkBMPReader>::New();
16     reader->SetFileName("data/lena.bmp");
17     reader->Update();
18  
19     vtkSmartPointer<vtkImageActor> actor =
20         vtkSmartPointer<vtkImageActor>::New();
21     actor->SetInputData(reader->GetOutput());
22  
23     vtkSmartPointer<vtkRenderer> render =
24         vtkSmartPointer<vtkRenderer>::New();
25     render->AddActor(actor);
26     render->ResetCamera();
27     render->SetBackground(1,1,1);
28  
29     vtkSmartPointer<vtkRenderWindow> window =
30         vtkSmartPointer<vtkRenderWindow>::New();
31     window->AddRenderer(render);
32     window->SetSize(640,480);
33     window->SetWindowName("ImageViewer3D");
34     window->Render();
35  
36     vtkSmartPointer<vtkRenderWindowInteractor> rwi =
37         vtkSmartPointer<vtkRenderWindowInteractor>::New();
38     vtkSmartPointer<vtkInteractorStyleImage> style =
39         vtkSmartPointer<vtkInteractorStyleImage>::New();
40     rwi->SetInteractorStyle(style);
41     rwi->SetRenderWindow(window);
42     rwi->Initialize();
43  
44     rwi->Start();
45     return 0;
46 }

  在讀入影象後,依次建立vtkImageActor,vtkRender,vtkRenderWindow,vtkRenderWindowInteractor,並組裝為管線。為了遮蔽旋轉操作,建立vtkInteractorStyleImage物件,並通過rwi->SetInteractorStyle(style)設定互動物件。需要注意的是,vtkImageActor接收的影象vtkImageData資料型別必須為unsigned char型別,因此在顯示之前,必要的時候需要利用vtkImageCast將影象資料型別轉換為unsigned char。

顯示結果: