python VTK(二十五) ----图形基本操作 表面重建技术 三角剖分 等值面提取 点云重建

三角剖分

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import vtk
# 生成一个10*10的地面网格点集,每个点生成一个随机数,表示每个点的海拔值
gridSize = 10
points = vtk.vtkPoints()
for x in range(gridSize):
    for y in range(gridSize):
        points.InsertNextPoint((x, y, vtk.vtkMath.Random(0.0, 3.0)))

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)

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")

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

python VTK(二十五) ----图形基本操作 表面重建技术 三角剖分 等值面提取 点云重建_第1张图片

import vtk
# 生成一个10*10的地面网格点集,每个点生成一个随机数,表示每个点的海拔值
gridSize = 10
points = vtk.vtkPoints()
for x in range(gridSize):
    for y in range(gridSize):
        points.InsertNextPoint((x, y, vtk.vtkMath.Random(0.0, 3.0)))

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

poly = vtk.vtkPolygon()
poly.GetPointIds().InsertNextId(32)
poly.GetPointIds().InsertNextId(42)
poly.GetPointIds().InsertNextId(43)
poly.GetPointIds().InsertNextId(44)
poly.GetPointIds().InsertNextId(45)
poly.GetPointIds().InsertNextId(35)
poly.GetPointIds().InsertNextId(25)
poly.GetPointIds().InsertNextId(24)
poly.GetPointIds().InsertNextId(23)
poly.GetPointIds().InsertNextId(22)

cell = vtk.vtkCellArray()
cell.InsertNextCell(poly)

boundary = vtk.vtkPolyData()
boundary.SetPoints(points)
boundary.SetPolys(cell)

delaunay = vtk.vtkDelaunay2D()  # 实现了二维三角剖分 输入为三维空间点集
delaunay.SetInputData(polyData)
delaunay.SetSourceData(boundary)   # 设置边界数据
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)

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")

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

python VTK(二十五) ----图形基本操作 表面重建技术 三角剖分 等值面提取 点云重建_第2张图片
等值面提取

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import vtk
reader = vtk.vtkMetaImageReader()
# 注意mhd和raw需要在同一个路径下,缺少raw会显示不出来
reader.SetFileName(r'E:/HeadMRVolume.mhd')
reader.Update()

surface = vtk.vtkMarchingCubes()   # 等值面提取 针对规则体数据生成等值面
surface.SetInputData(reader.GetOutput())
surface.ComputeNormalsOn()
surface.SetValue(0, 100)  # 第0个等值面,值为100
surface.Update()

mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(surface.GetOutputPort())
mapper.ScalarVisibilityOff()

actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetColor(1.0, 0.0, 0.0)

renderer = vtk.vtkRenderer()
renderer.AddActor(actor)
renderer.SetBackground(1.0, 1.0, 1.0)

renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindow.SetSize(640, 480)
renderWindow.Render()

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

python VTK(二十五) ----图形基本操作 表面重建技术 三角剖分 等值面提取 点云重建_第3张图片
点云重建

import vtk
reader = vtk.vtkPolyDataReader()
reader.SetFileName(r'E:/fran_cut.vtk')
reader.Update()

points = vtk.vtkPolyData()
points.SetPoints(reader.GetOutput().GetPoints())  # 获得网格模型中的几何数据:点集

surf = vtk.vtkSurfaceReconstructionFilter()
'''
隐式曲面重建,将曲面看作一个符号距离函数的等值面,曲面内外的距离值的符号相反,而零等值面即为所求的曲面
该方法需要对点云数据进行网格划分,然后估算每个点的切平面和方向,并以每个点与最近的切平面距离来近似表面距离
这样可以得到一个符号距离的体数据
'''
surf.SetInputData(points)
surf.SetNeighborhoodSize(20)
'''
SetNeighborhoodSize设置邻域点的个数,这些邻域点则用于估计每个点的局部切平面,默认为20
能够处理大多数重建问题,个数设置越大,计算消耗时间越长,当点的分部不均匀时,可以适当增加该值
'''
surf.SetSampleSpacing(0.005) # 用于设置划分网格的网格间距,间距越小网格越密集,一般采用默认值
surf.Update()

contour = vtk.vtkContourFilter()  # 提取零等值面即可得到相应的网格
contour.SetInputConnection(surf.GetOutputPort())
contour.SetValue(0, 0.0)
contour.Update()

leftViewport = [0.0, 0.0, 0.5, 1.0]
rightViewport = [0.5, 0.0, 1.0, 1.0]

vertexGlyphFilter = vtk.vtkVertexGlyphFilter()
vertexGlyphFilter.AddInputData(points)
vertexGlyphFilter.Update()
vertexMapper = vtk.vtkPolyDataMapper()
vertexMapper.SetInputData(vertexGlyphFilter.GetOutput())
vertexMapper.ScalarVisibilityOff()

vertexActor = vtk.vtkActor()
vertexActor.SetMapper(vertexMapper)
vertexActor.GetProperty().SetColor(1.0, 0.0, 0.0)

vertexRenderer = vtk.vtkRenderer()
vertexRenderer.AddActor(vertexActor)
vertexRenderer.SetViewport(leftViewport)
vertexRenderer.SetBackground(1.0, 1.0, 1.0)

surfMapper = vtk.vtkPolyDataMapper()
surfMapper.SetInputData(contour.GetOutput())
surfMapper.ScalarVisibilityOff()

surfActor = vtk.vtkActor()
surfActor.SetMapper(surfMapper)
surfActor.GetProperty().SetColor(1.0, 0.0, 0.0)

surfRenderer = vtk.vtkRenderer()
surfRenderer.AddActor(surfActor)
surfRenderer.SetViewport(rightViewport)
surfRenderer.SetBackground(1.0, 1.0, 1.0)

renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(vertexRenderer)
renderWindow.AddRenderer(surfRenderer)
renderWindow.SetSize(640, 320)
renderWindow.Render()
renderWindow.SetWindowName('PolyDataSurfaceReconstruction')

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

python VTK(二十五) ----图形基本操作 表面重建技术 三角剖分 等值面提取 点云重建_第4张图片

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