python医学图像处理之基于vtk的三维点云表面重建

本文介绍如何使用Python和VTK库进行三维点云数据的表面重建,通过读取坐标数据,创建vtkPoints和PolyData对象,执行二维三角剖分,实现模型可视化和保存为PLY文件。重点应用在医学图像模型重建上。

       hello,小伙伴们,好久不见~马上就要到中秋了,不知道大家现在有没有进入学习状态呢?

       今天呢,要教大家做一个基于vtk的三维点云表面重建。我们通过每个点的坐标值,重建出这个模型。这个不仅可以用于医学图像相关的模型重建,也同样适用于其他三维表面重建哦~ 那么。话不多说,让我们来实操一下吧!

       首先,我们需要下载以下三个库。如果缺少某个库的小伙伴请通过“pip install XXX”进行下载哦~

import numpy
import vtk
from vtkmodules.util.numpy_support import numpy_to_vtk

      其次,我们要读入数据。这里呢,我是事先用一个txt文件将我的坐标都保存了下来(如图1)。大家也可以用其他方式读入这个坐标。

图1 坐标txt文件

     通过下面的代码即可读入坐标数据。

# 读取 txt 文档
source_data = numpy.loadtxt(r"D:\cartilage\region_Growing_area_point.txt")

     接下来,就是根据我们的数据创建对象及mapper、actor等。

# 新建 vtkPoints 实例
points = vtk.vtkPoints()
# 导入点数据
points.SetData(numpy_to_vtk(source_data))

polyData = vtk.vtkPolyData()
polyData.SetPoints(points)

delaunay = vtk.vtkDelaunay2D()  # 实现了二维三角剖分 输入为三维空间点集
delaunay.SetInputData(polyData)
delaunay.Update()

glyphFilter = vtk.vtkVertexGlyphFilter()
glyphFilter.SetInputData(polyData)
glyphFilter.Update()

pointsMapper = vtk.vtkPolyDataMapper()
pointsMapper.SetInputData(glyphFilter.GetOutput())

pointsActor = vtk.vtkActor()
pointsActor.SetMapper(pointsMapper)
pointsActor.GetProperty().SetPointSize(3)
pointsActor.GetProperty().SetColor(1, 0, 0)#设置点的颜色

triangulatedMapper = vtk.vtkPolyDataMapper()
triangulatedMapper.SetInputData(delaunay.GetOutput())

triangulatedActor = vtk.vtkActor()
triangulatedActor.SetMapper(triangulatedMapper)
triangulatedActor.GetProperty().SetColor(1, 0, 1)#设置面的颜色

     如果大家有需要可以通过下述代码将模型保存点云文件,这里我就以我最常用的ply为例。

#保存为ply文件
vtkWriter = vtk.vtkPLYWriter()
vtkWriter.SetInputData(delaunay.GetOutput())
vtkWriter.SetFileName('./testgudao.ply')
vtkWriter.Write()

     给大家看一下最后重建出来的结果吧~

     最后附上完整代码~

# -*- coding:utf-8 -*-
import numpy
import vtk
from vtkmodules.util.numpy_support import numpy_to_vtk

# 读取 txt 文档
source_data = numpy.loadtxt(r"D:\cartilage\region_Growing_area_point.txt")

# 新建 vtkPoints 实例
points = vtk.vtkPoints()
# 导入点数据
points.SetData(numpy_to_vtk(source_data))

polyData = vtk.vtkPolyData()
polyData.SetPoints(points)

delaunay = vtk.vtkDelaunay2D()  # 实现了二维三角剖分 输入为三维空间点集
delaunay.SetInputData(polyData)
delaunay.Update()

glyphFilter = vtk.vtkVertexGlyphFilter()
glyphFilter.SetInputData(polyData)
glyphFilter.Update()

pointsMapper = vtk.vtkPolyDataMapper()
pointsMapper.SetInputData(glyphFilter.GetOutput())

pointsActor = vtk.vtkActor()
pointsActor.SetMapper(pointsMapper)
pointsActor.GetProperty().SetPointSize(3)
pointsActor.GetProperty().SetColor(1, 0, 0)#设置点的颜色

triangulatedMapper = vtk.vtkPolyDataMapper()
triangulatedMapper.SetInputData(delaunay.GetOutput())

triangulatedActor = vtk.vtkActor()
triangulatedActor.SetMapper(triangulatedMapper)
triangulatedActor.GetProperty().SetColor(1, 0, 1)#设置面的颜色

renderer = vtk.vtkRenderer()
renderer.AddActor(triangulatedActor)
renderer.AddActor(pointsActor)
renderer.SetBackground(1.0, 1.0, 1.0)

renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindow.SetSize(640, 320)
renderWindow.Render()
renderWindow.SetWindowName("PolyDataDelaunay2D")

#保存为ply文件
vtkWriter = vtk.vtkPLYWriter()
vtkWriter.SetInputData(delaunay.GetOutput())
vtkWriter.SetFileName('./testgudao2.ply')
vtkWriter.Write()

renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)
renderWindowInteractor.Initialize()
renderWindowInteractor.Start()

       希望对各位小伙伴有所帮助哦~大家如果有哪些关于医学图像处理的小想法、小问题都可以在评论区进行讨论哦~

       如果大家对医学图像处理感兴趣,也欢迎各位小伙伴看一看我其他的博客和下载资源哦~

 python基于有序切片的医学图像三维重建资源-CSDN文库

针对医学图像分割的semi-supervisedlearning(半监督学习)2020-2023顶会/期刊的论文合集_医学分割竞赛资源-CSDN文库

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cherry330

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值