本文是由Markdown语法编辑器编辑完成。
1. 问题提出:
今天要解决的问题是,希望能够用一个类似于BoxWidget的模型来切割一个原始体数据,最后希望从原始体数据中抽取出BoxWidget范围内的体数据。即从一个大的体数据中抽取出一块小的体数据。
说到这里,大家可能也猜出在VTK中有一个现成的类就是来完成这个需求的,它就是vtkExtractVOI。关于该类的详细解释可以查看链接:
http://www.vtk.org/doc/nightly/html/classvtkExtractVOI.html
这个类主要有三个接口,分别是:
vtkExtractVOI->SetInputData();
vtkExtractVOI->SetVOI(int,int,int,int,int,int);
vtkExtractVOI->SetSampleRate(int,int,int);
顾名思义,这三个接口分别是设置要抽取VOI的原始体数据,抽取VOI的范围,以及抽取数据后的采样率。
而今天在编码时,主要就是对于第二个接口没有理解对,导致没有正确地抽取出子体数据。
这里的SetVOI()的6个参数值都是Int型的数字。而这个int型的数字是指抽取的范围在图像的Extent上的,而不是在图像的Bounds上的值。
2. 问题解决
明确了产生问题的根源后,便可以解决问题了。
当读入一组Dicom序列的图像时便形成了体数据,读取出该体数据的相关参数(origin, spacing, extent等),在vtkBoxWidget的六个顶点bounds(XMin,XMax, YMin, YMax, ZMin, ZMax)形成的盒子区域,利用vtkExtractVOI抽取出这个盒子包围的区域。
vtkSmartPointer<vtkExtractVOI> extractVOI =
vtkSmartPointer<vtkExtractVOI>::New();
int extractXMin = (XMin-origin[0])/spacing[0];
int extractXMax = (XMax-origin[0])/spacing[0];
int extractYMin = (YMin-origin[1])/spacing[1];
int extractYMax = (YMax-origin[1])/spacing[1];
int extractZMin = (ZMin-origin[2])/spacing[2];
int extractZMax = (ZMax-origin[2])/spacing[2];
extractVOI ->SetInputData();
extractVOI->SetVOI(extractXMin ,extractXMax ,extractYMin ,extractYMax ,extractZMin ,extractZMax );
extractVOI->SetSampleRate(1,1,1);
extractVOI->Update();
未完待续……