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