VTK曲面重建技术(CPR)

2023-11-03 13:40
文章标签 技术 重建 曲面 vtk cpr

本文主要是介绍VTK曲面重建技术(CPR),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

目录

 

代码

运行:

结果:

参考:


 

代码


#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkCellArray.h>
#include <vtkDataSetMapper.h>
#include <vtkImageData.h>
#include <vtkImageReader2.h>
#include <vtkImageReader2Factory.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataReader.h>
#include <vtkProbeFilter.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkSplineFilter.h>
#include <vtkWindowLevelLookupTable.h>#include <sstream>namespace {vtkSmartPointer<vtkPolyData> SweepLine(vtkPolyData* line, double direction[3],double distance, unsigned int cols);
}int main(int argc, char* argv[])
{vtkNew<vtkNamedColors> colors;// Verify argumentsif (argc < 4){std::cout << "Usage: " << argv[0] << " InputVolume PolyDataInput"<< " Resolution" << std::endl;std::cout << "e.g. HeadMRVolume.mhd polyline.vtk 200" << std::endl;return EXIT_FAILURE;}// Parse argumentsstd::string volumeFileName = argv[1];std::string polyDataFileName = argv[2];std::stringstream ssResolution;ssResolution << argv[3];unsigned int resolution;ssResolution >> resolution;// Output argumentsstd::cout << "InputVolume: " << volumeFileName << std::endl<< "PolyDataInput: " << polyDataFileName << std::endl<< "Resolution: " << resolution << std::endl;// Read the volume datavtkNew<vtkImageReader2Factory> imageFactory;vtkSmartPointer<vtkImageReader2> imageReader;imageReader.TakeReference(imageFactory->CreateImageReader2(volumeFileName.c_str()));imageReader->SetFileName(volumeFileName.c_str());imageReader->Update();// Read the PolylinevtkNew<vtkPolyDataReader> polyLineReader;polyLineReader->SetFileName(polyDataFileName.c_str());polyLineReader->Update();vtkNew<vtkSplineFilter> spline;spline->SetInputConnection(polyLineReader->GetOutputPort());spline->SetSubdivideToSpecified();spline->SetNumberOfSubdivisions(resolution);// Sweep the line to form a surfacedouble direction[3];direction[0] = 0.0;direction[1] = 0.0;direction[2] = 1.0;double distance = 164;spline->Update();auto surface =SweepLine(spline->GetOutput(), direction, distance, atoi(argv[3]));// Probe the volume with the extruded surfacevtkNew<vtkProbeFilter> sampleVolume;sampleVolume->SetInputConnection(1, imageReader->GetOutputPort());sampleVolume->SetInputData(0, surface);// Compute a simple window/level based on scalar rangevtkNew<vtkWindowLevelLookupTable> wlLut;double range = imageReader->GetOutput()->GetScalarRange()[1] -imageReader->GetOutput()->GetScalarRange()[0];double level = (imageReader->GetOutput()->GetScalarRange()[1] +imageReader->GetOutput()->GetScalarRange()[0]) /2.0;wlLut->SetWindow(range);wlLut->SetLevel(level);// Create a mapper and actor.vtkNew<vtkDataSetMapper> mapper;mapper->SetInputConnection(sampleVolume->GetOutputPort());mapper->SetLookupTable(wlLut);mapper->SetScalarRange(0, 255);vtkNew<vtkActor> actor;actor->SetMapper(mapper);// Create a renderer, render window, and interactorvtkNew<vtkRenderer> renderer;vtkNew<vtkRenderWindow> renderWindow;renderWindow->AddRenderer(renderer);renderWindow->SetWindowName("CurvedReformation");vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;renderWindowInteractor->SetRenderWindow(renderWindow);// Add the actors to the scenerenderer->AddActor(actor);renderer->SetBackground(colors->GetColor3d("DarkSlateGray").GetData());// Set the camera for viewing medical imagesrenderer->GetActiveCamera()->SetViewUp(0, 0, 1);renderer->GetActiveCamera()->SetPosition(0, 0, 0);renderer->GetActiveCamera()->SetFocalPoint(0, 1, 0);renderer->ResetCamera();// Render and interactrenderWindow->Render();renderWindowInteractor->Start();return EXIT_SUCCESS;
}namespace {vtkSmartPointer<vtkPolyData> SweepLine(vtkPolyData* line, double direction[3],double distance, unsigned int cols){unsigned int rows = line->GetNumberOfPoints();double spacing = distance / cols;vtkNew<vtkPolyData> surface;// Generate the pointscols++;unsigned int numberOfPoints = rows * cols;unsigned int numberOfPolys = (rows - 1) * (cols - 1);vtkNew<vtkPoints> points;points->Allocate(numberOfPoints);vtkNew<vtkCellArray> polys;polys->Allocate(numberOfPolys * 4);double x[3];unsigned int cnt = 0;for (unsigned int row = 0; row < rows; row++){for (unsigned int col = 0; col < cols; col++){double p[3];line->GetPoint(row, p);x[0] = p[0] + direction[0] * col * spacing;x[1] = p[1] + direction[1] * col * spacing;x[2] = p[2] + direction[2] * col * spacing;points->InsertPoint(cnt++, x);}}// Generate the quadsvtkIdType pts[4];for (unsigned int row = 0; row < rows - 1; row++){for (unsigned int col = 0; col < cols - 1; col++){pts[0] = col + row * (cols);pts[1] = pts[0] + 1;pts[2] = pts[0] + cols + 1;pts[3] = pts[0] + cols;polys->InsertNextCell(4, pts);}}surface->SetPoints(points);surface->SetPolys(polys);return surface;}
} // namespace

运行:

demo.exe HeadMRVolume.mhd polyline.vtk 200

The image was generated with this volume data: src/Testing/Data/HeadMRVolume.mhd and src/Testing/Data/HeadMRVolume.raw and this polyLine data: src/Testing/Data/polyline.vtk.

https://github.com/Kitware/vtk-examples/blob/master/src/Testing/Data/HeadMRVolume.mhd

https://github.com/Kitware/vtk-examples/blob/master/src/Testing/Data/polyline.vtk

结果:

 

参考:

https://kitware.github.io/vtk-examples/site/Cxx/Visualization/CurvedReformation/

 CT 三维重建

http://radiol.dxy.cn/article/510899

这篇关于VTK曲面重建技术(CPR)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/338555

相关文章

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

前端技术(七)——less 教程

一、less简介 1. less是什么? less是一种动态样式语言,属于css预处理器的范畴,它扩展了CSS语言,增加了变量、Mixin、函数等特性,使CSS 更易维护和扩展LESS 既可以在 客户端 上运行 ,也可以借助Node.js在服务端运行。 less的中文官网:https://lesscss.cn/ 2. less编译工具 koala 官网 http://koala-app.

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi

java线程深度解析(二)——线程互斥技术与线程间通信

http://blog.csdn.net/daybreak1209/article/details/51307679      在java多线程——线程同步问题中,对于多线程下程序启动时出现的线程安全问题的背景和初步解决方案已经有了详细的介绍。本文将再度深入解析对线程代码块和方法的同步控制和多线程间通信的实例。 一、再现多线程下安全问题 先看开启两条线程,分别按序打印字符串的

SSM项目使用AOP技术进行日志记录

本步骤只记录完成切面所需的必要代码 本人开发中遇到的问题: 切面一直切不进去,最后发现需要在springMVC的核心配置文件中中开启注解驱动才可以,只在spring的核心配置文件中开启是不会在web项目中生效的。 之后按照下面的代码进行配置,然后前端在访问controller层中的路径时即可观察到日志已经被正常记录到数据库,代码中有部分注释,看不懂的可以参照注释。接下来进入正题 1、导入m

嵌入式技术的核心技术有哪些?请详细列举并解释每项技术的主要功能和应用场景。

嵌入式技术的核心技术包括处理器技术、IC技术和设计/验证技术。 1. 处理器技术    通用处理器:这类处理器适用于不同类型的应用,其主要特征是存储程序和通用的数据路径,使其能够处理各种计算任务。例如,在智能家居中,通用处理器可以用于控制和管理家庭设备,如灯光、空调和安全系统。    单用途处理器:这些处理器执行特定程序,如JPEG编解码器,专门用于视频信息的压缩或解压。在数字相机中,单用途