1.提取感兴趣区域
感兴趣区域(Volum of Interest,VOI)是指图像内部的一个子区域。在VTK中vtkExtractVOI类实现由用户指定的区域范围提取图像的子图像。该Filter的输入和输出都是一个vtkImageData,因此其结果可以直接作为图像保存。
其示例代码如下所示:
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
#include <vtkSmartPointer.h>
#include <vtkBMPReader.h>
#include <vtkImageData.h>//提取图像内部信息,如维度等
#include <vtkExtractVOI.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("lena.bmp");
reader->Update();
int dim[3];
reader->GetOutput()->GetDimensions(dim);
//提取图像子模块
vtkSmartPointer<vtkExtractVOI> extractVOI =
vtkSmartPointer<vtkExtractVOI>::New();
extractVOI->SetInputConnection(reader->GetOutputPort());
extractVOI->SetVOI(dim[0] / 4., 3.*dim[0] / 4., dim[1] / 4., 3.*dim[1] / 4, 0, 0);
extractVOI->Update();
//创建演员
vtkSmartPointer<vtkImageActor> origActor =
vtkSmartPointer<vtkImageActor>::New();
origActor->SetInputData(reader->GetOutput());
vtkSmartPointer<vtkImageActor> voiActor =
vtkSmartPointer<vtkImageActor>::New();
voiActor->SetInputData(extractVOI->GetOutput());
//化妆
double origView[4] = { 0, 0, 0.5, 1.0 };
double voiView[4] = { 0.5, 0, 1.0, 1.0 };
vtkSmartPointer<vtkRenderer> origRender =
vtkSmartPointer<vtkRenderer>::New();
origRender->SetViewport(origView);
origRender->AddActor(origActor);
origRender->ResetCamera();
origRender->SetBackground(1.0, 0, 0);
vtkSmartPointer<vtkRenderer> voiRender =
vtkSmartPointer<vtkRenderer>::New();
voiRender->SetViewport(voiView);
voiRender->AddActor(voiActor);
voiRender->ResetCamera();
voiRender->SetBackground(0.0, 0.0, 0.0);
//舞台
vtkSmartPointer<vtkRenderWindow> renderwindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderwindow->AddRenderer(origRender);
renderwindow->AddRenderer(voiRender);
renderwindow->SetSize(640, 320);
renderwindow->SetWindowName("ExtractVolumeOfInterestFromImage");
//设置交互
vtkSmartPointer<vtkRenderWindowInteractor> rwi =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<vtkInteractorStyleImage> style =
vtkSmartPointer<vtkInteractorStyleImage>::New();
rwi->SetInteractorStyle(style);
rwi->SetRenderWindow(renderwindow);
rwi->Initialize();
rwi->Start();
return 0;
}
上例代码实现了提取一副图像的子区域。
首先读取一个图像,并获取图像的维数。然后定义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图像。
执行结果如下: