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文库