1.vtkImageViewer2用于图像显示实例分析

在VTK早期版本中,提供了vtkImageViewer类来显示图像。随着版本的发展,目前vtkImageViewer2代替了vtkImageViewer进行图像显示。vtkImageViewer2中封装了VTK图像显示的管线,包括vtkActor,vtkRender,vtkRenderWindow,vtkInteractorStypeImage等对象,可以方便的完成图像显示和交互。该类提供的主要交互操作有:图像放缩,窗宽窗位调节,并提供切片选择,切片方向设置接口,尤其适合三维图像的显示。

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);  #include <vtkSmartPointer.h>
#include <vtkMetaImageReader.h>
#include <vtkImageViewer2.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>int main(int argc, char* argv[])
{vtkSmartPointer<vtkMetaImageReader> reader =vtkSmartPointer<vtkMetaImageReader>::New();reader->SetFileName("data/brain.mhd");reader->Update();vtkSmartPointer<vtkImageViewer2> viewer =vtkSmartPointer<vtkImageViewer2>::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<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::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 <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);   #include <vtkSmartPointer.h>
#include <vtkBMPReader.h>
#include <vtkImageActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>int main()
{vtkSmartPointer<vtkBMPReader> reader =vtkSmartPointer<vtkBMPReader>::New();reader->SetFileName("data/lena.bmp");reader->Update();vtkSmartPointer<vtkImageActor> actor =vtkSmartPointer<vtkImageActor>::New();actor->SetInputData(reader->GetOutput());vtkSmartPointer<vtkRenderer> render =vtkSmartPointer<vtkRenderer>::New();render->AddActor(actor);render->ResetCamera();render->SetBackground(1,1,1);vtkSmartPointer<vtkRenderWindow> window =vtkSmartPointer<vtkRenderWindow>::New();window->AddRenderer(render);window->SetSize(640,480);window->SetWindowName("ImageViewer3D");window->Render();vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkSmartPointer<vtkInteractorStyleImage> style =vtkSmartPointer<vtkInteractorStyleImage>::New();rwi->SetInteractorStyle(style);rwi->SetRenderWindow(window);rwi->Initialize();rwi->Start();return 0;
}

在读入图像后,依次建立vtkImageActor,vtkRender,vtkRenderWindow,vtkRenderWindowInteractor,并组装为管线。为了屏蔽旋转操作,建立vtkInteractorStyleImage对象,并通过rwi->SetInteractorStyle(style)设置交互对象。需要注意的是,vtkImageActor接收的图像vtkImageData数据类型必须为unsigned char类型,因此在显示之前,必要的时候需要利用vtkImageCast将图像数据类型转换为unsigned char。

显示结果:

3.参考资料

1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》
4.  张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.

VTK修炼之道15:图像处理_显示(vtkImageViewer2 vtkImageActor)相关推荐

  1. VTK修炼之道28:图像统计_灰度直方图计算

    1.灰度图像直方图 直方图统计是图像处理中的一个非常重要的操作.VTK中实现直方图统计功能的filter是vtkImageAccumulate.其将每个组分的数值范围划分为离散的间隔,然后统计每个灰度 ...

  2. VTK修炼之道16:图像处理_窗口分割和图像融合(ViewportvtkImageBlend)

    1.前言 前面演示的例子都是在一个窗口中显示一个图像.但是在常见的图像处理软件中,经常会遇到在一个窗口中显示多个图像,这就会用到图像融合技术.图像融合利用图像的alpha通道和不透明度来实现.VTK中 ...

  3. VTK修炼之道57:图形基本操作进阶_点云配准技术(LandMark标记点算法和坐标系显示方法)

    1.点云配准 在计算机逆向工程中,通过三维扫描等实物数字化技术可以获取各种点云数据.但是受到测量环境和设备的影响,再一次测量的情况下,难以获取实物整体的点云数据,因此需要多次从不同角度进行测量.但不同 ...

  4. VTK修炼之道14:图像处理_创建

    1.引言:图像数据结构 数字图像文件内容由两个部分组成:图像头信息和数据.图像头信息定义了图像的基本信息,主要包括起点位置(Origin),像素间隔(space)和维数(dimension).通过这三 ...

  5. VTK修炼之道82:VTK管线机制_信息对象类VTKInformation

    1.VTK管线机制 VTK中通过管线机制来实现组合各种算法处理数据.每一种算法是一个Filter,多个Filter连接在一起形成VTK管线.每个Filter可以分为两个组成部分:一个是算法对象,继承自 ...

  6. VTK修炼之道77:交互部件_分割/配准类Widget与其他Widget

    1.分割/配准交互部件 图像分割与配准是数字图像处理技术两大主要的应用领域,特别是在医学图像处理中. 著名的医学图像分割与配准工具包ITK(Insight Segmentation & Reg ...

  7. VTK修炼之道40:频域处理_快速傅里叶变换及其反变换1

    1.图像频域处理的意义 在图像处理和分析中,经常会将图像从图像空间转换到其他空间中,并利用这些空间的特点进行对转换后图像进行分析处理,然后再将处理后的图像转换到图像空间中,这称之为图像变换. 在一些图 ...

  8. VTK修炼之道80:VTK开发基础_智能指针与引用计数

    1.引用计数 VTK经过多年的开发与维护,已经形成了一套稳定的框架和开发规则.因此,了解这些规则和框架是定制VTK类的基础,这其中用到了大量面向对象的设计模式,例如对象工程模式.观察者/命令模式:还有 ...

  9. VTK修炼之道79:交互与拾取_单位拾取

    1.单位拾取 示例代码: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL) VTK_MODULE_INIT(vtkI ...

最新文章

  1. js实现的时间轴效果
  2. sql获取一张表所有的字段_SQL语句19问
  3. cmd打开java文件夹_Java用CMD打开指定文件和文件夹
  4. array remove java_how to remove array from another array in javascript
  5. MyBatis中ThreadLocal
  6. jq倒计时html源码,jQuery实现倒计时功能
  7. conda添加清华镜像源在cmd环境下执行下列命令
  8. 如何解决“指定的服务已被标记为删除”错误
  9. unity3dk帧_Unity3D制作序列帧动画的方法
  10. 【190111】VC+Access工程信息管理系统源代码
  11. 兄弟9020cdn提示更换粉盒_兄弟打印机提示更换墨粉盒怎么办
  12. win10 软路由_软路由和硬路由的区别分析
  13. 眼睛干涩胀痛:得了干眼症该怎么办?
  14. 附加SQL Server MDF文件的不同方法
  15. 解决苹果电脑OS X 10.8.5 安装双系统,遇到的各种坑
  16. 26_ue4进阶末日生存游戏开发[僵尸添加动画和扣血效果]
  17. 如何在idea中使用Mysql
  18. QQ用户的帐号和密码安全
  19. 当彗星划过天空,那好像梦幻一般的景色,真是无与伦比,美到极致,只能让人一味眺望着那无法言喻的美。
  20. 电脑屏幕亮度怎么调?四种自由调节亮度方式

热门文章

  1. vnc连接linux时出现黑屏
  2. Oracle 用拼接字符串更新表 测试
  3. 不用注册的麦咖啡永久使用
  4. CodeForce 463C Gargari and Bishops(贪心+暴力)
  5. sizeof计算类的大小
  6. SQL的四种连接-左外连接、右外连接、内连接、全连接
  7. 关于IOS开发知识的总结
  8. 短板效应C++代码实现
  9. Deep Learning学习 之 CNN代码解析(MATLAB)
  10. 详解CUDA核函数及运行时参数