首页 > 其他分享 >vtk 对 ct 图像三维重建并保存.stl到相关目录

vtk 对 ct 图像三维重建并保存.stl到相关目录

时间:2024-08-31 17:55:49浏览次数:13  
标签:stl DICOM vtk vtkSmartPointer 设置 normals New include 三维重建

#include <vtkAutoInit.h>  
// 初始化所需的 VTK 渲染模块  
VTK_MODULE_INIT(vtkRenderingOpenGL2);  
VTK_MODULE_INIT(vtkInteractionStyle);  

#include <vtkSmartPointer.h>  
#include <vtkDICOMImageReader.h>  
#include <vtkMarchingCubes.h>  
#include <vtkPolyDataMapper.h>  
#include <vtkActor.h>  
#include <vtkRenderer.h>  
#include <vtkRenderWindow.h>  
#include <vtkRenderWindowInteractor.h>  
#include <vtkDecimatePro.h>  
#include <vtkSmoothPolyDataFilter.h>  
#include <vtkPolyDataNormals.h>  
#include <vtkSTLWriter.h>  
#include <vtkProperty.h>  

int main(int argc, char* argv[])  
{  
    // DICOM 图像的目录路径  
    const char* pathToDicomDirectory = "E:\\Dicom\\001"; // 替换为你实际的 DICOM 目录路径  

    // 用于从DICOM图像中分割骨骼组织的阈值  
    const double boneThreshold = 400; // 根据你的数据替换为合适的阈值  

    // 步骤 1: 读取 DICOM 图像  
    // 创建一个读取器来加载 DICOM 图像  
    vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();  
    reader->SetDirectoryName(pathToDicomDirectory); // 设置 DICOM 图像的目录  
    reader->Update(); // 更新读取器以加载图像  

    // 步骤 2: 用 Marching Cubes 提取骨骼  
    // 创建一个 Marching Cubes 滤波器来提取等值面  
    vtkSmartPointer<vtkMarchingCubes> mcubes = vtkSmartPointer<vtkMarchingCubes>::New();  
    mcubes->SetInputConnection(reader->GetOutputPort()); // 设置输入为读取的图像  
    mcubes->SetValue(0, boneThreshold); // 设置骨骼的等值面值  
    mcubes->Update();  

    // 步骤 3: 平滑网格  
    // 创建一个平滑滤波器来平滑网格  
    vtkSmartPointer<vtkSmoothPolyDataFilter> smoothFilter = vtkSmartPointer<vtkSmoothPolyDataFilter>::New();  
    smoothFilter->SetInputConnection(mcubes->GetOutputPort()); // 设置输入为 Marching Cubes 的输出  
    smoothFilter->SetNumberOfIterations(30); // 设置平滑迭代次数  
    smoothFilter->Update();  

    // 步骤 4: 计算法线以更好地可视化  
    // 计算法线以增强网格的光照效果  
    vtkSmartPointer<vtkPolyDataNormals> normals = vtkSmartPointer<vtkPolyDataNormals>::New();  
    normals->SetInputConnection(smoothFilter->GetOutputPort()); // 输入为平滑后的数据  
    normals->SetFeatureAngle(60.0); // 设置法线计算的特征角  
    normals->Update();  

    // 步骤 5: 将结果保存为 STL 文件  
    // 创建一个 STL 写入器来保存输出网格  
    vtkSmartPointer<vtkSTLWriter> stlWriter = vtkSmartPointer<vtkSTLWriter>::New();  
    stlWriter->SetFileName("D:/output_bone_model.stl"); // 设置输出 STL 文件路径  
    stlWriter->SetInputConnection(normals->GetOutputPort()); // 设置写入网格的数据  
    int nstatus = stlWriter->Write(); // 将网格写入文件  

    // 步骤 6: 可视化结果  
    // 创建一个映射器将多边形数据映射用于可视化  
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();  
    mapper->SetInputConnection(normals->GetOutputPort()); // 映射处理后的数据用于可视化  

    // 创建一个演员来在场景中表示对象  
    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();  
    actor->SetMapper(mapper); // 将映射器设置到演员  
    actor->GetProperty()->SetColor(0.5, 0.5, 0.5); // 设置演员颜色为骨骼白  

    // 创建一个渲染器来渲染场景  
    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();  
    renderer->AddActor(actor); // 将演员添加到渲染器  
    renderer->SetBackground(1, 1, 1); // 设置背景颜色为白色  

    // 创建一个渲染窗口来显示渲染器  
    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();  
    renderWindow->AddRenderer(renderer); // 将渲染器添加到渲染窗口  

    // 创建一个渲染窗口交互器用于用户交互  
    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();  
    renderWindowInteractor->SetRenderWindow(renderWindow); // 将渲染窗口设置给交互器  

    // 渲染场景  
    renderWindow->Render(); // 初始渲染  

    // 开始交互过程  
    renderWindowInteractor->Start(); // 开始交互循环  

    return EXIT_SUCCESS;  
}

标签:stl,DICOM,vtk,vtkSmartPointer,设置,normals,New,include,三维重建
From: https://blog.csdn.net/zhangyihu321/article/details/141720991

相关文章

  • C++STL~~list
    文章目录一、list的概念二、list的使用三、list的练习四、与vector的对比五、总结一、list的概念list是一种容器,实现了双向链表结构它具有以下特点:动态大小,可按需增减元素数量。高效的插入和删除操作,在任意位置插入和删除元素时间复杂度为O(1)。但随机访问元素......
  • list容器---深入探索STL中的双向链表
    目录一、引言二、list容器原理三、list容器的常用操作  1.创建list容器  2.添加元素  3.删除元素  4.访问元素  5.遍历list容器四、list容器的优缺点五、实际应用场景六、总结        本文将详细介绍C++STL中的list容器,包括其原理、常用......
  • C++第十四弹 -- STL之queue和priority_queue深度剖析
    目录前言1.queue的介绍与使用1.1.queue的介绍1.2为什么容器类不选vector?1.3queue的使用1.4OJ用队列实现栈2.queue的模拟实现3.deque的介绍3.1什么是适配器3.2STL标准库中stack和queue的底层结构3.3deque的简单介绍4.priority_queue的介绍与使用4.1介绍4.2......
  • VTK随笔十:VTK图形处理(封闭性检测、联通区域分析、多分辨率处理)
    一、封闭性检测        如果一条边只被一个多边形包含,那么这条边就是边界边。是否存在边界边是检测一个网格模型是否封闭的重要特征。        vtkFeatureEdges是一个非常重要的类,该类能够提取多边形网格模型中四种类型的边。1)边界边。即只被一个多边形或......
  • VTK随笔九:VTK图形处理(vtkPolyData数据生成与显示、基本的图形操作、网络平滑)
            图形数据的应用非常广泛,最贴近日常生活的应该是3D游戏,其中每个角色的模型场景等都是图形数据。当然,游戏仅仅是图形数据的一个应用点,图形在CAD(计算机辅助设计)、影视、医学、地质、气象数据建模等领域中均有着广泛的应用。vtkPolyData是VTK中常用的数据结构......
  • 【Python】将网格数据写入到VTK文件
    1.vtk文件格式根据官网进行总结vtk文件组成:5个部分.第一部分,第一行:表明文件版本.写"#vtkDataFileVersion2.0"就行第二部分,第二行:表明标题(title).随便写.第三部分,第三行:ASCII或者BINARY第四部分,开始定义datasetstructure.这部分用于描述数据集的几何和拓扑......
  • C#医学影像管理系统源码,PACS系统源码带三维重建,实现检查预约、病人信息登记、计算机阅
    C#医学影像管理系统源码医学影像存储与传输系统源码PACS系统源码带三维重建PACS影像存取与传输系统以实现医学影像数字化存储、诊断为核心任务,从医学影像设备(如CT、CR、DR、MR、DSA、RF等)获取影像,集中存储、综合管理医学影像及病人相关信息,建立数字化工作流程。PACS系统可......
  • C++学习随笔——C++STL中binary_search的使用方法
    std::binary_search是C++标准模板库(STL)中的一个算法,用于在有序范围内查找某个值是否存在。它基于二分查找算法,时间复杂度为O(logn)。std::binary_search的基本用法:  boolbinary_search(ForwardIteratorfirst,ForwardIteratorlast,constT&value);first:指......
  • VTK随笔七:VTK图像处理(图像基本操作)
    VTK图像基本操作一、图像信息的访问与修改1、利用vtkImageData的方法 vtkSmartPointer<vtkBMPReader>reader=vtkSmartPointer<vtkBMPReader>::New();reader->SetFileName("D:/data/lena.bmp");reader->Update();intdims[3];reader......
  • STL所有常用算法(全网最详细,一文全掌握,建议收藏)
    目录1.分类和介绍2.遍历算法2.1for_each算法(遍历执行)2.2transform算法(搬运)3.查找算法3.1find算法(具体查找)3.2find_if算法(条件查找)3.3 adjacent_find(查找相邻重复元素)3.4 binary_search(二分查找有序序列中元素是否存在)3.5 count(统计元素出现次数)3.6 coun......