VTK三维重建方法总结

    系统:Win8.1

    VTK版本:6.2.0

    Qt版本:5.2.1

    三维重建,主要有面绘制体绘制两种方法。其中,在面绘制法中,又包含轮廓连接法,移动立方体法等;而绘制的主要方法为光线投射法。本文简要对这些方法的具体实现做一个总结。

1 面绘制

    根据参考资料[12]的说明,面绘制分为两大类:(1)体素级重建;(2)切片级重建。由于切片级重建效果不理想,现在主要使用的是体素级重建,例如Marching Cubes方法。

1.1 vtkMarchingCubes

    具体实现见参考资料[1][5]。由于参考资料[1]是python语言版本的,而参资料[5]虽然是C++语言版本的,但是在使用指针变量时没有很好的处理内存释放的问题,而且基于5.10.1以前VTK版本。鉴于此,这里对参考资料[5]进行修改,除了解决内存管理的问题外,主要使其适应6.2.0版本的VTK。

#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)
#include "vtkVolume16Reader.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkMarchingCubes.h"
#include "vtkStripper.h"
#include "vtkActor.h"
#include "vtkPolyDataMapper.h"
#include "vtkProperty.h"
#include "vtkCamera.h"
#include "vtkBoxWidget.h"
#include "vtkSmartPointer.h"
#include "vtkTriangleFilter.h"
#include "vtkMassProperties.h"

int main( int argc, char *argv[] )
{
    //读取二维切片数据序列
    vtkSmartPointer< vtkVolume16Reader >reader =
            vtkSmartPointer< vtkVolume16Reader >::New();
    reader->SetDataDimensions(64, 64); //设置像素
    reader->SetDataByteOrderToLittleEndian();
    reader->SetFilePrefix("E:\\VTK\\vtkdata-5.10.1\\Data\\headsq\\quarter");//设置读取路径
    reader->SetImageRange(1, 93);
    reader->SetDataSpacing(3.2, 3.2, 1.5);
    reader->Update();


    //抽取等值面为骨头的信息
    vtkSmartPointer< vtkMarchingCubes > boneExtractor =
            vtkSmartPointer< vtkMarchingCubes >::New();
    boneExtractor->SetInputConnection( reader->GetOutputPort() );
    boneExtractor->SetValue(0, 500); //设置提取的等值信息
    boneExtractor->Update();

    //剔除旧的或废除的数据单元,提高绘制速度(可略去这一步)
    vtkSmartPointer< vtkStripper > boneStripper =
            vtkSmartPointer< vtkStripper >::New(); //三角带连接
    boneStripper->SetInputConnection( boneExtractor->GetOutputPort());
    boneStripper->Update();

    //建立映射
    vtkSmartPointer< vtkPolyDataMapper > boneMapper =
            vtkSmartPointer< vtkPolyDataMapper >::New();
    boneMapper->SetInputData(boneStripper->GetOutput());

    //建立角色
    vtkSmartPointer< vtkActor > bone =
            vtkSmartPointer< vtkActor >::New();
    bone->SetMapper(boneMapper);

    bone->GetProperty()->SetDiffuseColor(.1, .94, .52);
    bone->GetProperty()->SetSpecular( .3 );
    bone->GetProperty()->SetSpecularPower( 20 );

    //定义绘制器
    vtkSmartPointer< vtkRenderer > aRenderer =
            vtkSmartPointer< vtkRenderer >::New();
    //定义绘制窗口
    vtkSmartPointer< vtkRenderWindow > renWin =
            vtkSmartPointer< vtkRenderWindow >::New();
    renWin->AddRenderer( aRenderer );
    //定义窗口交互器
    vtkSmartPointer< vtkRenderWindowInteractor > iren =
            vtkSmartPointer< vtkRenderWindowInteractor >::New();
    iren->SetRenderWindow( renWin );

    //创建一个camera
    vtkSmartPointer< vtkCamera > aCamera =
            vtkSmartPointer< vtkCamera >::New();
    aCamera->SetViewUp(0,0,-1);
    aCamera->SetPosition(0,1,0);
    aCamera->SetFocalPoint(0,0,0);

    aRenderer->AddActor( bone );
    aRenderer->SetActiveCamera( aCamera );
    aRenderer->ResetCamera();
    aCamera->Dolly(1.5);
    aRenderer->SetBackground(0,0,0);
    aRenderer->ResetCameraClippingRange();

    iren->Initialize();
    iren->Start();

    return 0;
}

1.2 vtkContourFilter

    具体见参考资料[6]。

2 体绘制

    根据参考资料[8][9]的说明,VTK中的三维体绘制方法包括三种:a)光线投射法;b)三维纹理映射法;c)基于硬件的VolumePro体绘制方法。

    其中,光线投射法又包含3种实现方法:

vtkVolumeRayCastIsosurfaceFunction % 使用等值面进行体绘制
vtkVolumeRayCastMIPFunction        % 使用最大密度投射法进行体绘制
vtkVolumeRayCastCompositeFunction  % 使用alpha合成法进行体绘制

参考资料

[1]VTK学习笔记之使用vtkMarchingCubes

[2]空间相关 MC 算法的 VTK 实现

[3]基于图像序列的植物维管束的三维绘制技术研究

[4]基于MC算法的CT图像三维重建

[5]VTK 面绘制

[6]使用vtk面绘制dicom医学断层图像

[7]VTK中的体绘制方法

[8]【VTK】三维体绘制方法

[9]VTK体绘制方法介绍

[10]基于VTK与Qt的体绘制程序

[11]VTK—体绘制初步理解

[12]吴建帅.  基于统计学的三维重建体积计算方法研究. 内蒙古科技大学, 2014年

你可能感兴趣的:(VTK)