1. 用vtkImageViewer2显示图像
在VTK早期版本中,提供了vtkImageViewer类来显示图像。随着版本的发展,目前vtkImageViewer2代替了vtkImageViewer进行图像显示。
vtkImageViewer2中封装了VTK图像显示的管线,
包括vtkActor,vtkRender,vtkRenderWindow,vtkInteractorStypeImage等对象,可以方便的完成图像显示和交互。也即vtkImageViewer2类封装了vtk图像的可视化渲染引擎。
该类提供的主要交互操作有:
图像的缩放;
窗宽、窗位调节(窗宽是图像的灰度范围,窗位是窗宽的中心位置);
并提供切片选择;
切片方向设置接口。
因此vtkImageViewer2类尤其适合三维图像的显示。
#includeVTK_MODULE_INIT(vtkRenderingOpenGL); // 上方的这两句话和我写的代码中加的完全一样!!!连使用的vtkRenderingOpenGL这个参数都一样!!!#include #include #include #include #include #include int main(int argc, char* argv[]){ vtkSmartPointer reader = vtkSmartPointer ::New(); reader->SetFileName("data/brain.mhd"); reader->Update(); vtkSmartPointer viewer = vtkSmartPointer ::New(); viewer->SetInputConnection(reader->GetOutputPort()); // 设置基本属性。 viewer->SetSize(640,480); viewer->SetColorLevel(500); viewer->SetColorWindow(2000); viewer->SetSlice(40); viewer->SetSliceOrientationToXY(); viewer->Render(); viewer->GetRenderer()->SetBackground(1,1,1); viewer->GetRenderWindow()->SetWindowName("ImageViewer2D"); vtkSmartPointer rwi = vtkSmartPointer ::New(); // 设置交互属性。 viewer->SetupInteractor(rwi); rwi->Start(); return 0;}
为了更好地说明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,通过纹理映射将图像映射到一个多边形上进行显示。
使用vtkImageActor较vtkImageViewer2要复杂一些,需要建立完整的渲染管线:
包括vtkImageActor,vtkRender,vtkRenderWindow,vtkRenderWindowInteractor管线。
另外,作为图像二维浏览器,不需要在三维空间中进行旋转操作,因此还需要为vtkRenderWindow定义一个vtkInteractorStyleImage对象。
#includeVTK_MODULE_INIT(vtkRenderingOpenGL); #include #include #include #include #include #include #include int main() { vtkSmartPointer reader = vtkSmartPointer ::New(); reader->SetFileName("data/lena.bmp"); reader->Update(); vtkSmartPointer actor = vtkSmartPointer ::New(); actor->SetInputData(reader->GetOutput()); vtkSmartPointer render = vtkSmartPointer ::New(); render->AddActor(actor); render->ResetCamera(); render->SetBackground(1,1,1); vtkSmartPointer window = vtkSmartPointer ::New(); window->AddRenderer(render); window->SetSize(640,480); window->SetWindowName("ImageViewer3D"); window->Render(); /* rwi是vtk渲染窗口交互器对象。 */ vtkSmartPointer rwi = vtkSmartPointer ::New(); vtkSmartPointer style = vtkSmartPointer ::New(); rwi->SetInteractorStyle(style); rwi->SetRenderWindow(window); rwi->Initialize(); rwi->Start(); return 0; }
在读入图像后,依次建立
vtkImageActor(vtk图像演员),
vtkRender(vtk渲染),
vtkRenderWindow(vtk渲染窗口),
vtkRenderWindowInteractor(vtk渲染窗口交互器)
四个类的对象,并组装为管线。
为了屏蔽旋转操作,建立vtkInteractorStyleImage对象,并通过rwi->SetInteractorStyle(style)设置交互对象。需要注意的是,vtkImageActor接收的图像vtkImageData数据类型必须为unsigned char类型,因此在显示之前,必要的时候需要利用vtkImageCast将图像数据类型转换为unsigned char。
显示结果: