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。
显示结果: