使用vtk三维重建dcm序列化数据集 – 三郎君的日常

C++ / VTK / 医疗 / 图像处理 · 2024年4月29日 0

使用vtk三维重建dcm序列化数据集

三维重建是从二维图像或数据集中创建三维模型或体积的过程。它通常用于医学成像、计算机视觉、地质勘探等领域。

实现三维重建的逻辑通常包括以下步骤:

  1. 数据获取:获取二维图像或数据集,例如医学成像中的 MRI、CT 或超声图像。
  2. 预处理:根据需要对数据进行预处理,包括去噪、增强、几何校正等。
  3. 特征提取:从二维图像中提取特征,例如边缘、纹理、角点等,以便在后续步骤中进行匹配和重建。
  4. 匹配:在不同视角或切片之间进行特征匹配,以确定它们之间的空间关系。这可以通过各种方法实现,如特征匹配、图像配准等。
  5. 三维重建算法:基于匹配的结果,使用合适的三维重建算法生成三维模型或体积。常用的算法包括体绘制、Marching Cubes、Marching Tetrahedra 等。
  6. 后处理:对生成的三维模型进行后处理,包括光照、纹理映射、表面平滑等,以提高可视化效果。
  7. 可视化:将重建的三维模型或体积可视化,以便用户进行观察、分析或进一步处理。

在医学图像处理中,常见的三维重建应用包括从 CT 或 MRI 数据集中重建器官、组织或病变的三维模型,用于医学诊断、手术规划等。

#include "vtkSmartPointer.h"
#include "vtkDICOMImageReader.h"
#include "vtkMarchingCubes.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"

VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);

void Reconstruct3D()
{
    vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();
    reader->SetDirectoryName("C:/Users/DeepA/Desktop/CTA_Cardio");
    reader->Update();

    vtkSmartPointer<vtkMarchingCubes> marchingCubes = vtkSmartPointer<vtkMarchingCubes>::New();
    marchingCubes->SetInputConnection(reader->GetOutputPort());
    marchingCubes->SetValue(0, 500); // 设置 iso-surface 的阈值

    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputConnection(marchingCubes->GetOutputPort());

    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);

    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->SetBackground(0.1, 0.2, 0.4);

    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    renderWindowInteractor->SetRenderWindow(renderWindow);

    renderWindow->Render();
    renderWindowInteractor->Start();
}

int main() {
    Reconstruct3D();
    return EXIT_SUCCESS;
}

代码实现了一个基于 VTK(Visualization Toolkit)的三维重建程序。以下是其代码逻辑

  1. 引入必要的 VTK 头文件和模块初始化:
    • 引入 VTK 相关头文件,包括 vtkSmartPointer.hvtkDICOMImageReader.hvtkMarchingCubes.hvtkPolyDataMapper.hvtkActor.hvtkRenderer.hvtkRenderWindow.hvtkRenderWindowInteractor.h
    • 使用 VTK_MODULE_INIT 宏初始化 VTK 模块,包括 OpenGL 渲染器、交互样式、FreeType 字体渲染器和 OpenGL 体积渲染器。
  2. 定义 Reconstruct3D 函数:
    • 创建 vtkDICOMImageReader 对象,用于读取 DICOM 影像数据集。
    • 使用 vtkMarchingCubes 进行三维重建,将读取的 DICOM 数据作为输入。
    • 设置 iso-surface 的阈值为 500,这是为了从 DICOM 数据中提取特定密度的组织结构,生成三维模型。
    • 创建 vtkPolyDataMapper 对象,用于将重建后的数据映射到可视化对象。
    • 创建 vtkActor 对象,将 Mapper 映射的数据设置到 Actor 中。
    • 创建 vtkRenderer 对象,添加 Actor 并设置背景色。
    • 创建 vtkRenderWindow 对象,添加 Renderer。
    • 创建 vtkRenderWindowInteractor 对象,将 RenderWindow 设置为其交互窗口。
    • 调用 Render() 方法渲染场景,并调用 Start() 方法启动交互。
  3. 定义 main 函数:
    • main 函数中调用 Reconstruct3D 函数,实现三维重建的可视化。

实现了一个基于 VTK 的三维重建程序,并提供了交互式渲染功能。以下是其交互和渲染逻辑

  1. 交互逻辑
    • Reconstruct3D 函数中创建了 vtkRenderWindowInteractor 对象 renderWindowInteractor,并将 vtkRenderWindow 对象 renderWindow 设置为其交互窗口。
    • 调用 Start() 方法启动交互,该方法将等待用户与渲染窗口进行交互,如旋转、缩放或平移。
  2. 渲染逻辑
    • Reconstruct3D 函数中,首先创建了 vtkDICOMImageReader 对象 reader 并设置其读取 DICOM 数据的目录。
    • 使用 vtkMarchingCubes 进行三维重建,将 reader 读取的 DICOM 数据作为输入。
    • 设置 iso-surface 的阈值为 500,以从 DICOM 数据中提取特定密度的组织结构,生成三维模型。
    • 创建 vtkPolyDataMapper 对象 mapper,用于将重建后的数据映射到可视化对象。
    • 创建 vtkActor 对象 actor,将 mapper 映射的数据设置到 actor 中。
    • 创建 vtkRenderer 对象 renderer,将 actor 添加到 renderer 中,并设置渲染器的背景色。
    • 创建 vtkRenderWindow 对象 renderWindow,并将 renderer 添加到 renderWindow 中。
    • 最后,调用 renderWindowRender() 方法对场景进行渲染,将渲染结果显示在窗口中。