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

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

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

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

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

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

python医学图像处理之基于vtk的三维点云表面重建_第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()

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

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

     最后附上完整代码~

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

你可能感兴趣的:(医学图像处理,python,图像处理,开发语言,计算机视觉,3d)