IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ VTK VMTK 提取血管中心线 -> 正文阅读

[C++知识库]C++ VTK VMTK 提取血管中心线

VMTK是一个基于VTK和ITK的工具包,主要用于血管的3D重建、几何分析、网格生成、血管分割。可以直接官网下载下来按照它的PypeS规则,结合Python,命令行直接使用;也可以下载源码自己编译,在代码中使用。

算法

VMTK提供了一个准确的血管或管状物体的中线生成算法。这个算法是由 Luca Antiga 在他的博士论文中提出,算法的输入是血管的表面数据和中线的起止点。主要思路是用Delaunay三角剖分算法算出血管Voronoi图,图上的点是血管最大内接球的球心,再由提供的起止点,在这些球心点中根据半径找到最短路径。查找最短路径的算法是Fast Marching算法。算法的最后输出可以得到中线上点的坐标和半径。

vtkvmtkPolyDataCenterlines

参考

基本使用方法

// include所有需要的class

void getCenterline(vtkSmartPointer<vtkPolyData> data) {
	
	// 1. 得到血管表面的数据
	vtkSmartPointer<vtkDiscreteMarchingCubes> marchingCubes = vtkSmartPointer<vtkDiscreteMarchingCubes>::New();
	marchingCubes->SetInputData(data);
	marchingCubes->GenerateValues(1, 1, 1); // 如果是多标签可以改成多个值
	marchingCubes->Update();
	
	// 根据需要,做一些网格平滑处理
	vtkSmartPointer<vtkWindowedSincPolyDataFilter> smoother = vtkSmartPointer<vtkWindowedSincPolyDataFilter>::New();
	smoother->SetInputConnection(marchingCubes->GetOutputPort());
	smoother->SetNumberOfIterations(8);
	smoother->BoundarySmoothingOn();
	smoother->Update();
	
	// 根据需要,清理一下数据
	vtkSmartPointer<vtkCleanPolyData> cleaner = vtkSmartPointer<vtkCleanPolyData>::New();
	cleaner->SetInputConnection(smoother->GetOutputPort());
	cleaner->Update();
	
	// 2. 生成血管表面的三角形网格数据
	vtkSmartPointer<vtkTriangleFilter> triangleFilter = vtkSmartPointer<vtkTriangleFilter>::New();
    triangleFilter->SetInputConnection(cleaner->GetOutputPort());
    triangleFilter->PassLinesOff();
    triangleFilter->PassVertsOff();
    triangleFilter->Update();
	
	vtkSmartPointer<vtkPolyData> surface = triangleFilter->GetOutput();
	
	// 根据需要,如果数据量过大,可以缩减一些三角形
	// vtkSmartPointer<vtkDecimatePro> decimate = vtkSmartPointer<vtkDecimatePro>::New();
	// decimate->SetInputConnection(triangleFilter->GetOutputPort()); 
	// decimate->SetTargetReduction(0.2); 
	// decimate->PreserveTopologyOn(); 
	// decimate->Update();
	// surface = decimate->GetOutput();
	
	// 根据需要,如果数据量比较小,可以增加一些三角形
	// vtkSmartPointer<vtkLinearSubdivisionFilter> linearSubdivisionFilter = vtkSmartPointer<vtkLinearSubdivisionFilter>::New();
	// linearSubdivisionFilter->SetInputConnection(triangleFilter->GetOutputPort());
	// linearSubdivisionFilter->SetNumberOfSubdivisions(4);
	// linearSubdivisionFilter->Update();
	// surface = linearSubdivisionFilter->GetOutput();
	
	// 根据需要,填补表面网格上的孔洞
	vtkSmartPointer<vtkvmtkCapPolyData> capper = vtkSmartPointer<vtkvmtkCapPolyData>::New();
    capper->SetInputConnection(surface->GetOutputPort());
    capper->SetDisplacement(0);
    capper->SetInPlaneDisplacement(0);
    capper->Update();
	
	// 3. 创建起止点
	vtkSmartPointer<vtkIdList> sourceSeeds, targetSeeds;
	sourceSeeds->InsertNextId(0);
	targetSeeds->InsertNextId(1);
	
	// 4. 计算中心线
	vtkvmtkPolyDataCenterlines* centerlineFilter = vtkvmtkPolyDataCenterlines::New();
    centerlineFilter->SetInputData(capper->GetOutput());
    centerlineFilter->SetSourceSeedIds(sourceSeeds);
    centerlineFilter->SetTargetSeedIds(targetSeeds);
    centerlineFilter->SetRadiusArrayName("MaximumInscribedSphereRadius");
	centerlineFilter->SetCostFunction("1/R");
    centerlineFilter->SetFlipNormals(0);
    centerlineFilter->SetAppendEndPointsToCenterlines(1);
    centerlineFilter->SetSimplifyVoronoi(0);
    centerlineFilter->SetCenterlineResampling(1);
    centerlineFilter->SetResamplingStepLength(1);
    centerlineFilter->Update();
	
	// 5. 得到中线上的点和每个点对应的半径
	vtkSmartPointer<vtkPolyData> output = centerlineFilter->GetOutput();
	vtkDoubleArray* centerlinesRadiusArray = output->GetPointData()->GetArray("MaximumInscribedSphereRadius");
	for (int i = 0; i < output->GetNumberOfPoints(); i++) {
		double* point = new double[3];
		output->GetPoint(i, point);
		double radius = centerlinesRadiusArray->GetValue(i);
	}
	
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-25 12:01:58  更:2021-08-25 12:03:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 6:18:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计