首页 > 解决方案 > 如何使平滑的 vtk 网格顶点分布均匀?

问题描述

使用以下代码平滑 MatchingCubes 构建的轮廓后,

contour=vtk.vtkMarchingCubes()
smoother = vtk.vtkWindowedSincPolyDataFilter()

结果如下所示。一些顶点分布不均匀。有什么方法可以让它们更“均匀分割”吗?

在此处输入图像描述

标签: vtk

解决方案


对于从这篇文章中寻找答案的其他用户:

C++ 使用 VTK https://github.com/valette/ACVD

python 使用 pyvista/VTK https://github.com/pyvista/pyacvd ($ pip install pyacvd)

使用来自将 simpleITK 二进制图像转换为 VTK 多数据的函数的 pyacvd 的示例:

import numpy as np

import SimpleITK as sitk

import vtk
 
from vtk.util import numpy_support

import pyvista as pv

import pyacvd

def sitk2vtk(self, sitk_pointer, nb_points=None):

    
    numpy_array = sitk.GetArrayFromImage(sitk_pointer)

    size = list(sitk_pointer.GetSize())
    origin = list(sitk_pointer.GetOrigin())
    spacing = list(sitk_pointer.GetSpacing())
    label = numpy_support.numpy_to_vtk(num_array=numpy_array.ravel(), deep=True, array_type=vtk.VTK_FLOAT)

    
    
    # Convert the VTK array to vtkImageData

    img_vtk = vtk.vtkImageData()

    img_vtk.SetDimensions(size)

    img_vtk.SetSpacing(spacing)

    img_vtk.SetOrigin(origin)

    img_vtk.GetPointData().SetScalars(label)



    MarchingCubeFilter = vtk.vtkDiscreteMarchingCubes()
    
    MarchingCubeFilter.SetInputData(img_vtk)
    
    MarchingCubeFilter.GenerateValues(1, 1, 1)
    
    MarchingCubeFilter.Update()

    

    if nb_points:
        
        # wrapper vtk polydata to pyvista polydata
        
        pv_temp = pv.PolyData(MarchingCubeFilter.GetOutput())
        
        cluster = pyacvd.Clustering(pv_temp)
        
        cluster.cluster(int(nb_points))
        
        remesh = cluster.create_mesh()
        
        remesh_vtk = vtk.vtkPolyData()
        
        remesh_vtk.SetPoints(remesh.GetPoints())
        
        remesh_vtk.SetVerts(remesh.GetVerts())
        
        remesh_vtk.SetPolys(remesh.GetPolys())
        
        return remesh_vtk
    
    else:
        
        return MarchingCubeFilter.GetOutput()

推荐阅读