测试模型获取:
lumen.stl
代码:
CMakeLists.txt

cmake_minimum_required(VERSION 3.5)project(VesselCenterline LANGUAGES CXX)set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# VMTK
find_package( VMTK REQUIRED)
include(${VMTK_USE_FILE})
# ITK
find_package( ITK REQUIRED)
include(${ITK_USE_FILE})
# VTK
find_package( VTK 8.1.2 EXACT REQUIRED)
include(${VTK_USE_FILE})add_executable(VesselCenterline main.cpp)target_link_libraries(VesselCenterline ${VTK_LIBRARIES})

main.cpp:

#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>#include <vtkJPEGReader.h>
#include <vtkCamera.h>
#include <vtkProperty.h>
#include <vtkAxesActor.h>
#include <vtkSTLReader.h>#include <vtkDiscreteMarchingCubes.h>
#include <vtkWindowedSincPolyDataFilter.h>
#include <vtkCleanPolyData.h>
#include <vtkTriangleFilter.h>
#include <vtkPolyData.h>
#include <vtkPointData.h>
#include <vtkDataArray.h>
#include <vtkIdList.h>
#include <vtkDecimatePro.h>
#include <vtkDoubleArray.h>
#include <vtkParametricSpline.h>
#include <vtkParametricFunctionSource.h>
#include <vtkLODActor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkRenderWindowInteractor.h>#include <vtkvmtkCapPolyData.h>
#include <vtkvmtkPolyDataCenterlines.h>#include <iostream>using namespace std;vtkSmartPointer<vtkPolyData> ExtractCenterline(vtkSmartPointer<vtkPolyData> inputSurface);int main(int argc,char**argv)
{if(argc<2){cout<<"please input a model\n";return -1;}string stl = argv[1];vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();reader->SetFileName(stl.c_str());reader->Update();// STL 文件vtkSmartPointer<vtkPolyData> data = vtkSmartPointer<vtkPolyData>::New();data->DeepCopy(reader->GetOutput());vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputConnection(reader->GetOutputPort());mapper->Update();vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);vtkSmartPointer<vtkProperty> property = vtkSmartPointer<vtkProperty>::New();property->SetDiffuseColor(1, 0.49, 0.25);property->SetDiffuse(0.7);property->SetSpecular(0.3);property->SetSpecularPower(20);property->SetOpacity(0.3);actor->SetProperty(property); //设置透明度//获取中心线 B样条曲线拟合vtkSmartPointer<vtkPoints> pathpoints = vtkSmartPointer<vtkPoints>::New();//ExtractCenterline(data);pathpoints->DeepCopy(ExtractCenterline(data)->GetPoints());//-------------------------------------cout<<"The number of points:"<<pathpoints->GetNumberOfPoints()<<endl;vtkSmartPointer<vtkParametricSpline> spline = vtkSmartPointer<vtkParametricSpline>::New();spline->SetPoints(pathpoints);spline->ClosedOff();vtkSmartPointer<vtkParametricFunctionSource> splineSource = vtkSmartPointer<vtkParametricFunctionSource>::New();splineSource->SetParametricFunction(spline);vtkSmartPointer<vtkPolyDataMapper> pointMapper = vtkSmartPointer<vtkPolyDataMapper>::New();pointMapper->SetInputConnection(splineSource->GetOutputPort());vtkSmartPointer<vtkLODActor> actorPoints = vtkSmartPointer<vtkLODActor>::New();actorPoints->SetMapper(pointMapper);actorPoints->GetProperty()->SetColor(0,1,0);actorPoints->GetProperty()->SetLineWidth(2);//-------------------------------------//---交互----vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();renderer->AddActor(actor);renderer->AddActor(actorPoints);renderer->SetBackground(0.1,0.2,0.4);; // Background color greenvtkSmartPointer<vtkRenderWindow> renderWindow =vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);renderWindow->SetSize(1920,1080);vtkSmartPointer<vtkCamera> aCamera = vtkSmartPointer<vtkCamera>::New();aCamera->SetPosition ( 0, 0, -300 );aCamera->SetFocalPoint( 0, 0, 0);aCamera->SetViewUp ( 0, -1, 0 );vtkSmartPointer<vtkRenderWindowInteractor> interactor=vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renderWindow);vtkSmartPointer<vtkInteractorStyleTrackballCamera> style=vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();interactor->SetInteractorStyle(style);renderWindow->Render();interactor->Start();return 0;
}vtkSmartPointer<vtkPolyData> ExtractCenterline(vtkSmartPointer<vtkPolyData> inputSurface) {//1.清理 并 三角化vtkSmartPointer<vtkPolyData> cappedSurface = vtkSmartPointer<vtkPolyData>::New();vtkSmartPointer<vtkCleanPolyData>surfaceCleaner = vtkSmartPointer<vtkCleanPolyData>::New();surfaceCleaner->SetInputData(inputSurface);surfaceCleaner->Update();vtkSmartPointer < vtkTriangleFilter> surfaceTriangulator = vtkSmartPointer<vtkTriangleFilter>::New();surfaceTriangulator->SetInputConnection(surfaceCleaner->GetOutputPort());surfaceTriangulator->PassLinesOff();surfaceTriangulator->PassVertsOff();surfaceTriangulator->Update();cappedSurface->DeepCopy(surfaceTriangulator->GetOutput());//2.填补管腔 cappedsurfacevtkSmartPointer<vtkvmtkCapPolyData> capper = vtkSmartPointer<vtkvmtkCapPolyData>::New();capper->SetInputData(cappedSurface);capper->Update();vtkSmartPointer<vtkIdList> CapCenterIds = vtkSmartPointer<vtkIdList>::New();cappedSurface->DeepCopy(capper->GetOutput());CapCenterIds->DeepCopy(capper->GetCapCenterIds());cout<<"The number of the lumen is:" <<capper->GetCapCenterIds()->GetNumberOfIds()<<endl;//3.设置起始位置//起点vtkSmartPointer<vtkIdList> sourceIds = vtkSmartPointer<vtkIdList>::New();sourceIds->SetNumberOfIds(1);sourceIds->SetId(0, CapCenterIds->GetId(0));vtkSmartPointer<vtkIdList> targetIds = vtkSmartPointer<vtkIdList>::New();//多个目标
//        targetIds->SetNumberOfIds(CapCenterIds->GetNumberOfIds() - 1);
//        for (int i = 1; i < CapCenterIds->GetNumberOfIds(); i++)
//        {//            targetIds->SetId(i - 1, CapCenterIds->GetId(i));
//        }//单个目标targetIds->SetNumberOfIds(1);targetIds->SetId(0, CapCenterIds->GetId(2));//4.中心线计算 calculatevtkSmartPointer<vtkvmtkPolyDataCenterlines> centerlinesFilter = vtkSmartPointer<vtkvmtkPolyDataCenterlines>::New();centerlinesFilter->SetInputData(cappedSurface);centerlinesFilter->SetSourceSeedIds(sourceIds);centerlinesFilter->SetTargetSeedIds(targetIds);centerlinesFilter->SetAppendEndPointsToCenterlines(true);centerlinesFilter->SetCenterlineResampling(true);centerlinesFilter->SetResamplingStepLength(1);centerlinesFilter->SetRadiusArrayName("Radius");centerlinesFilter->SetEdgeArrayName("Edge");centerlinesFilter->SetEdgePCoordArrayName("PCoord");centerlinesFilter->Update();//获取结果vtkSmartPointer<vtkPolyData> output = centerlinesFilter->GetOutput();vtkDoubleArray* centerlinesRadiusArray = static_cast<vtkDoubleArray*>(output->GetPointData()->GetArray("Radius"));//半径for (int i = 0; i < output->GetNumberOfPoints(); i++) {double radius = centerlinesRadiusArray->GetValue(i);}return output;
}

运行结果:

最后
起始sourceIds和终点targetIds可以自行设置。

参考代码:
https://github.com/jackyko1991/Vessel-Centerline-Extraction

VTK(四)---VMTK血管中心线提取相关推荐

  1. 阿里AI攻克心血管识别技术,冠脉中心线提取论文入选国际医学影像会议

    阿里在医疗AI领域取得新进展,继创下肺结节检测.肝结节诊断技术的重大突破后,又攻克了难度系数更高的心血管识别技术. 近日,阿里达摩院机器智能实验室有关冠状动脉中心线提取的论文已被国际顶级医学影像会议M ...

  2. Steger算法(Line_Gauss)-光条中心线提取(基于Hessian矩阵)

    Steger算法(Line_Gauss)-光条中心线提取(基于Hessian矩阵) 算法背景介绍 Hessian 矩阵与泰勒多项式 关于求t 导数与中心点.亚像素点 高斯函数作用 文献 算法背景介绍 ...

  3. 【必备知识】:线激光条纹中心线提取算法导读

    线激光条纹特性 线激光器是由点激光器和前置透镜组成的.点激光器可以为He-Ne激光器或半导体激光器.相比较He-Ne激光器,半导体激光器因其输出光源具有发散性,更适合用于制作线激光器.需要说明的是,半 ...

  4. 河道中心线提取、平均宽度计算(Arcgis+CAD)

    在做项目中遇到的河道平均宽度计算问题,稍作总结如下: 首先,提取河道中心线,若已有河道中心线,请直接忽略. 1.单独加载水体数据,设置好纯色符号(建议为纯黑色),去掉轮廓线,这样是为了提升栅格数据质量 ...

  5. 《OpenCv视觉之眼》Python图像处理十四 :Opencv图像轮廓提取之Scharr算法和Canny算法

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  6. VTK笔记——医学图像的切片提取(vtkImageReslice)

    医学图像的浏览和内部分析是很常见也很重要的功能,我们不仅可以从矢状面.冠状面和轴状面这样的切面去看,还可以从任意切面去看.在VTK术语中,切面(切片)就是图像数据. vtkImageReslice v ...

  7. ITK/VTK/MITK/VMTK/CTK区别及联系

    ITK ITK( Insight Segmentation and Registration Toolkit)是由美国国家卫生院下属的国立医学图书馆使用C++开发,用于处理医学图像的跨平台的开源软件库 ...

  8. C# 获取Windows系统ICON图标的四种方式-可提取各种文件夹、文件等等图标

    本文介绍的是提取Windows系统内部Icon图标的方法,就是系统资源管理器里面显示的图标,包括文件夹.文件,如:常规文件夹的图标.特定文件夹图标(磁盘根目录.收藏夹.网络共享目录等).各文件类型图标 ...

  9. 基于灰度质心法和骨架的激光中心线提取

    之前博主一直在做线结构光成像,硬件比较垃圾,相机加镜头和线激光器总共成本在1000以内,精度在0.1mm左右,感觉这种成本做出来还是不错的,其实主要大部分时间花在了分析上来达到最好的效果. 一般对于激 ...

  10. 奇兔recovery卡刷教程_奇兔开发者学院课程教学第四讲: Recovery备份提取制作ROM

    时隔两天,奇兔ROM学院课程教学第四讲之Recovery备份提取制作ROM很快又和大家见面了,随着学习的深入,大家是否觉得自己有变厉害了的感觉呢!本节课主讲FIRE-X神之怒将教大家学会从recove ...

最新文章

  1. Animation 模拟纸盒的爆破
  2. 真正的全栈工程师!B站硬核UP主自己造了一个激光雷达
  3. LeetCode Find Right Interval(二分)
  4. java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 \ ^
  5. python 笔记:if __name__==‘main’
  6. 210314阶段三VS使用Linux 的sqlite3 API
  7. HTTPS的SSL证书配置
  8. C#编程基础(简单概述与理解)
  9. 模型预测控制的缺点_一个模型预测控制(MPC)的简单实现
  10. Android 6.0 运行时权限管理最佳实践
  11. 区块链MMO游戏该如何设计Token经济?
  12. 基于springboot项目中使用docker-compose+es+kibana+logstash+mysql 提高数据查询效率
  13. IDEA SpringBoot 同一个模块启动多个服务(实例)
  14. 美团3.12笔试题解
  15. table 汽车之家 车型对比 简单实现 列变行
  16. 洛谷 p2404 自然数拆分问题
  17. android 图案解锁忘记了,安卓手机忘记图形解锁、锁屏密码的解决方法
  18. 东方mmd巨大化_有什么东方mmd非常值得一看?
  19. 在ubuntu20.04环境下安装opencv教程并测试
  20. apqp过程流程图及编写规则_APQP的三个准备工作及五个阶段之目标和输出(干货)...

热门文章

  1. JavaJDBC异常记录:关于sql上能够正常执行的sql语句,在java中执行了但是返回结果不一致问题
  2. win7 ASP.NET 2.0 部署
  3. 2019全球区块链杭州高峰论坛将于5月17日举办!
  4. 并发相关随笔(持续更新)
  5. Uber花了21亿元入驻上海自贸区 不叫优步叫雾博
  6. cocos2d-x 输入框CCEditBox的使用
  7. windows系统挂载存储阵列的iscsi映射虚拟磁盘
  8. Redis笔记(五)Redis的事务
  9. Servlet各种接口和类
  10. [ACM] hdu 2177 取(2堆)石子游戏(威佐夫博弈)