VTK三维重建方法总结

0 前言

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

    实验环境:Win8.1 + VTK-6.2.0 + Qt5.2.1

1 面绘制

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

1.1 vtkMarchingCubes

    具体实现见参考资料[1][5]。由于参考资料[1]是Python版本,而参资料[5]是C++版本,后者在使用指针变量时没有很好的处理内存释放的问题,并且版本过旧。鉴于此,这里对参考资料[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年

  • 9
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
CTK(Computed Tomography Kit)和VTK(Visual Toolkit)是两个常用于医学图像处理和三维重建的工具。 CTK是一个开源的医学图像处理软件包,它基于C++编写,提供了一系列用于处理计算机断层扫描(CT)图像的功能。CTK可以读取和处理CT图像数据,包括图像预处理、分割、配准、重建和可视化等功能。使用CTK,研究人员和医学专业人员可以对CT图像进行精确的测量、分析和重建,从而更好地了解病情和对疾病进行诊断和治疗。 VTK是一个开源的可视化工具包,它可以用于生成、处理和呈现三维图形和图像。VTK提供了多种算法和工具,用于三维数据的可视化、建模和分析。使用VTK,研究人员和工程师可以将数据转换成可视化的三维模型,并对模型进行编辑、操作和分析。VTK支持多种数据格式,包括CT扫描数据,因此可以与CTK配合使用进行三维重建。 CTK和VTK三维重建中通常会结合使用。首先,使用CTK读取和预处理CT图像数据,例如去除噪声、平滑和增强图像等。然后,使用CTK中的分割算法将图像中的目标结构分离出来,并提取数据的表面信息。最后,将提取的数据导入VTK中进行三维重建和可视化。VTK提供了多种算法和方法,如体素化、曲面重建和纹理映射等,可以将CT数据转换为逼真的三维模型,并进行交互式的浏览和操作。 总之,CTK和VTK是两个非常强大的工具,可以实现CT图像的三维重建和可视化。它们的结合使用可以为研究人员和医学专业人员提供更准确、更直观的图像分析和诊断结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneSea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值