在VTK中,轮廓面提取功能主要面对的是三维规则网格数据集,三维规则网格数据集的单元一般为立方体单元,轮廓面的提取主要采用移动立方体算法(Marching Cubes),VTK提供的类对该算法进行了封装,下面给出三维轮廓面提取的示例程序。
#include "stdafx.h"
#include <vtkSmartPointer.h>
#include <vtkVolume16Reader.h>
#include <vtkMarchingCubes.h>
#include <vtkVectorNorm.h>
#include <vtkPolyDataMapper.h>
#include "vtkActor.h"
#include "vtkCamera.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include <vtkMergePoints.h>
int _tmain(int argc, _TCHAR* argv[])
{
//读取bit的图像数据
vtkSmartPointer<vtkVolume16Reader>pVol16Read=vtkVolume16Reader::New();
//设置每幅图像的像数尺寸
pVol16Read->SetDataDimensions(64,64);
//标识所读取文件的字节序,对于PC机,进行该设置
pVol16Read->SetDataByteOrderToLittleEndian();
//设置读取的图像文件名前缀
pVol16Read->SetFilePrefix(".\\headsq\\quarter");
//设定读取的图像数量
pVol16Read->SetImageRange(1,93);
pVol16Read->SetDataOrigin(0,0,0);
pVol16Read->SetDataSpacing(3.2,3.2,1.5);
//定义移动立方体过滤器对象
vtkSmartPointer<vtkMarchingCubes>pMarchCube=vtkMarchingCubes::New();
//归并重合的点
vtkSmartPointer<vtkMergePoints>pMeragePoint=vtkMergePoints::New();
pMeragePoint->SetDivisions(32,32,46);
pMeragePoint->SetNumberOfPointsPerBucket(100);
//处理体数据
pMarchCube->SetInput((vtkDataObject *)pVol16Read->GetOutput());
//设置提取的等值面的值
pMarchCube->SetValue(0,1150);
//计算梯度
pMarchCube->ComputeGradientsOn();
pMarchCube->ComputeScalarsOff();
pMarchCube->SetLocator(pMeragePoint);
//生成等值面单元、顶点的标量值
vtkSmartPointer<vtkVectorNorm>pVectorNormal=vtkVectorNorm::New();
pVectorNormal->SetInput(pMarchCube->GetOutput());
//得到生成的标量值范围
double Rang[2];
pVectorNormal->GetOutput()->GetScalarRange(Rang);
//定义映射器
vtkSmartPointer<vtkPolyDataMapper>pMapper=vtkPolyDataMapper::New();
pMapper->SetInput((vtkPolyData *)pVectorNormal->GetOutput());
pMapper->ScalarVisibilityOn();
pMapper->SetScalarRange(0,1250);//Rang[0],Rang[1]);
vtkSmartPointer<vtkActor>pActor = vtkActor::New();
pActor->SetMapper(pMapper);
//绘制
vtkSmartPointer<vtkRenderer>renderer = vtkRenderer::New();
vtkSmartPointer<vtkRenderWindow>renWin = vtkRenderWindow::New();
renWin->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor>iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
renderer->AddActor(pActor);
renderer->ResetCamera();
renderer->SetBackground(1,1,1);
renWin->SetSize(300,300);
renWin->Render();
iren->Start();
return 0;
}
该示例程序读取一系列的头骨切片图像数据,构建体数据,然后利用移动立方体算法提取属性值为1150的表面,程序中利用vtkMarchingCubes类进行表面提取,该类对移动立方体法进行了封装,程序运行结果如下: