zoukankan      html  css  js  c++  java
  • VTK 图像基本操作_图像子块提取(特征区域提取)

    1.提取感兴趣区域

    感兴趣区域(Volum of Interest,VOI)是指图像内部的一个子区域。在VTK中vtkExtractVOI类实现由用户指定的区域范围提取图像的子图像。该Filter的输入和输出都是一个vtkImageData,因此其结果可以直接作为图像保存。
    其示例代码如下所示:
     1 #include <vtkAutoInit.h>
     2 VTK_MODULE_INIT(vtkRenderingOpenGL);
     3  
     4 #include <vtkSmartPointer.h>
     5 #include <vtkBMPReader.h>
     6 #include <vtkImageData.h>//提取图像内部信息,如维度等
     7 #include <vtkExtractVOI.h>
     8 #include <vtkImageActor.h>
     9 #include <vtkRenderer.h>
    10 #include <vtkRenderWindow.h>
    11 #include <vtkRenderWindowInteractor.h>
    12 #include <vtkInteractorStyleImage.h>
    13  
    14 int main()
    15 {
    16     vtkSmartPointer<vtkBMPReader> reader =
    17         vtkSmartPointer<vtkBMPReader>::New();
    18     reader->SetFileName("lena.bmp");
    19     reader->Update();
    20  
    21     int dim[3];
    22     reader->GetOutput()->GetDimensions(dim);
    23     //提取图像子模块
    24     vtkSmartPointer<vtkExtractVOI> extractVOI =
    25         vtkSmartPointer<vtkExtractVOI>::New();
    26     extractVOI->SetInputConnection(reader->GetOutputPort());
    27     extractVOI->SetVOI(dim[0] / 4., 3.*dim[0] / 4., dim[1] / 4., 3.*dim[1] / 4, 0, 0);
    28     extractVOI->Update();
    29     //创建演员
    30     vtkSmartPointer<vtkImageActor> origActor =
    31         vtkSmartPointer<vtkImageActor>::New();
    32     origActor->SetInputData(reader->GetOutput());
    33  
    34     vtkSmartPointer<vtkImageActor>  voiActor =
    35         vtkSmartPointer<vtkImageActor>::New();
    36     voiActor->SetInputData(extractVOI->GetOutput());
    37     //化妆
    38     double origView[4] = { 0, 0, 0.5, 1.0 };
    39     double voiView[4] = { 0.5, 0, 1.0, 1.0 };
    40     vtkSmartPointer<vtkRenderer> origRender =
    41         vtkSmartPointer<vtkRenderer>::New();
    42     origRender->SetViewport(origView);
    43     origRender->AddActor(origActor);
    44     origRender->ResetCamera();
    45     origRender->SetBackground(1.0, 0, 0);
    46  
    47     vtkSmartPointer<vtkRenderer> voiRender =
    48         vtkSmartPointer<vtkRenderer>::New();
    49     voiRender->SetViewport(voiView);
    50     voiRender->AddActor(voiActor);
    51     voiRender->ResetCamera();
    52     voiRender->SetBackground(0.0, 0.0, 0.0);
    53     //舞台
    54     vtkSmartPointer<vtkRenderWindow> renderwindow =
    55         vtkSmartPointer<vtkRenderWindow>::New();
    56     renderwindow->AddRenderer(origRender);
    57     renderwindow->AddRenderer(voiRender);
    58     renderwindow->SetSize(640, 320);
    59     renderwindow->SetWindowName("ExtractVolumeOfInterestFromImage");
    60     //设置交互
    61     vtkSmartPointer<vtkRenderWindowInteractor> rwi =
    62         vtkSmartPointer<vtkRenderWindowInteractor>::New();
    63     vtkSmartPointer<vtkInteractorStyleImage> style =
    64         vtkSmartPointer<vtkInteractorStyleImage>::New();
    65     rwi->SetInteractorStyle(style);
    66     rwi->SetRenderWindow(renderwindow);
    67     rwi->Initialize();
    68  
    69     rwi->Start();
    70     return 0;
    71 }
    上例代码实现了提取一副图像的子区域。
    首先读取一个图像,并获取图像的维数。然后定义vtkExtractVOI对象,该对象接收两个输入一个是图像数据,第二个是区域大小。设置区域大小的函数原型:
    void SetVOI(int _arg1, int _arg2, int _arg3, int _arg4, int _arg5, int _arg6)
    void SetVOI(int _arg[])
    其参数是提取的区域各个方向的大小,共6个参数,依次表示x方向最小值,x方向最大值,y方向最小值,y方向最大值,z方向最小值和z方向最大值。上例中由于读取的是二维图像,因此z方向的区域为[0,0],而在x方向范围为[ dims[0]/4 , 3*dims[0]/4 ],y方向范围为[ dims[1]/4 , 3*dims[1]/4 ],即提取图像原图中间1/4图像。
    执行结果如下:
  • 相关阅读:
    Linux Shell中的延时函数
    调试core文件(转)
    C++类构造函数初始化列表(转)
    seq简介(转)
    查看内存使用情况(转)
    awk 数组实例(转)
    伪终端(转)
    C++类成员变量的初始化方法(转)
    几个shell命令(转)
    子进程自父进程继承什么或未继承什么(转)
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14241329.html
Copyright © 2011-2022 走看看