博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VTK 图像处理_显示(vtkImageViewer2 & vtkImageActor)
阅读量:7220 次
发布时间:2019-06-29

本文共 3487 字,大约阅读时间需要 11 分钟。

hot3.png

1. 用vtkImageViewer2显示图像

在VTK早期版本中,提供了vtkImageViewer类来显示图像。随着版本的发展,目前vtkImageViewer2代替了vtkImageViewer进行图像显示。

vtkImageViewer2中封装了VTK图像显示的管线,

包括vtkActor,vtkRender,vtkRenderWindow,vtkInteractorStypeImage等对象,可以方便的完成图像显示和交互。也即vtkImageViewer2类封装了vtk图像的可视化渲染引擎

该类提供的主要交互操作有:

图像的缩放;

窗宽、窗位调节(窗宽是图像的灰度范围,窗位是窗宽的中心位置);

并提供切片选择;

切片方向设置接口。

因此vtkImageViewer2类尤其适合三维图像的显示。

#include 
       VTK_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对象。

#include 
         VTK_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。

显示结果:

 

转载于:https://my.oschina.net/wangsifangyuan/blog/956462

你可能感兴趣的文章
p转c++
查看>>
树(tree)
查看>>
codevs——2645 Spore
查看>>
ssh服务之 远程登录和端口转发
查看>>
java环境配置正确,但是tomcat不能启动的解决办法
查看>>
我就是想找个人聊聊天,说说我这近四年来的经历
查看>>
不同的测试方法使用的场景
查看>>
Hadoop快速入门
查看>>
Problem S
查看>>
SVN上传的时候没法显示文件名,只显示后缀名
查看>>
Python:pygame游戏编程之旅四(游戏界面文字处理)
查看>>
fedroa 编译安装mysql5.5
查看>>
WC2018游记
查看>>
毕设开发日志2017-10-23
查看>>
***微信公众平台开发: 获取用户基本信息+OAuth2.0网页授权
查看>>
第二章 例题2-2 在屏幕上显示两个短句
查看>>
【转】iOS学习之适配iOS10
查看>>
OC语言BLOCK和协议
查看>>
C++创建一个动态链接库工程
查看>>
(六)maven之本地仓库
查看>>