• 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,通过纹理映射将图像映射到一个多边形上进行显示。使用vtkImageActor较vtkImageViewer2要复杂一些,需要建立完整的渲染管线:包括vtkImageActor,vtkRender,vtkRenderWindow,vtkRenderWindowInteractor管线。另外,作为图像二维浏览器,不需要在三维空间中进行旋转操作,因此还需要为vtkRenderWindow定义一个vtkInteractorStyleImage对象。

     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。

    显示结果:

  • 相关阅读:
    go语言之行--简介与环境搭建
    Django Rest Framework源码剖析(八)-----视图与路由
    基于TLS证书手动部署kubernetes集群(下)
    多线程编程
    Java IO流
    java异常处理
    字符串处理(二)
    字符串处理(一)
    正则表达式(应用)
    集合相关知识
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14241075.html
Copyright © 2020-2023  润新知