5.3.5 区域提取

注:此文知识学习笔记,仅记录完整程序和实现结果,具体原理参见:

https://blog.csdn.net/www_doling_net/article/details/8541534

https://blog.csdn.net/shenziheng1/article/category/6114053/4

vtkExtractVOI:感兴趣区域(Volum of Interest,VOI)是指图像内部的一个子区域。在VTK中 vtkExtractVOI类实现由用户指定的区域范围提取图像的子图像。该Filter的输入和输出都是一个vtkImageData,因此其结果可以直接作为图像保存。
//区域提取
#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("test.bmp");
	reader->Update();
	int dims[3];
	reader->GetOutput()->GetDimensions(dims);
	//提取图像子区域
	vtkSmartPointer<vtkExtractVOI>extractVOI = vtkSmartPointer<vtkExtractVOI>::New();
	extractVOI->SetInputConnection(reader->GetOutputPort());
	extractVOI->SetVOI(dims[0] / 4, 3.*dims[0] / 4, dims[1] / 4, 3.*dims[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(0, 0, 0);
	vtkSmartPointer<vtkRenderer>voiRender = vtkSmartPointer<vtkRenderer>::New();
	voiRender->SetViewport(voiView);
	voiRender->AddActor(voiActor);
	voiRender->ResetCamera();
	voiRender->SetBackground(0, 0, 0);
	//舞台
	vtkSmartPointer<vtkRenderWindow> renderwindow = vtkSmartPointer<vtkRenderWindow>::New();
	renderwindow->AddRenderer(origRender);
	renderwindow->AddRenderer(voiRender);
	renderwindow->SetSize(640, 320);
	renderwindow->SetWindowName("etraxtvolumeofinterestfromimage");
	//设置交互
	vtkSmartPointer<vtkRenderWindowInteractor>rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	vtkSmartPointer<vtkInteractorStyleImage>style = vtkSmartPointer<vtkInteractorStyleImage>::New();
	rwi->SetInteractorStyle(style);
	rwi->SetRenderWindow(renderwindow);
	rwi->Initialize();
	rwi->Start();

	return EXIT_SUCCESS;
}
运行结果:


首先读取一个图像,并获取图像的维数。然后定义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图像。

参考资料:

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

所用软件:vtk7.0+visual studio 2013

猜你喜欢

转载自blog.csdn.net/kateyabc/article/details/80642779