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。
顯示結果: