VTK教程之十 可视化基础算法-三维轮廓面(等值面)提取

来源:互联网 发布:linux zip 解压命令 编辑:程序博客网 时间:2024/05/18 19:44

                                                                               VTK教程之十 可视化基础算法-三维轮廓面(等值面)提取

在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类进行表面提取,该类对移动立方体法进行了封装,程序运行结果如下:


原创粉丝点击