vtk - 如何使平滑的 vtk 网格顶点分布均匀?
问题描述
使用以下代码平滑 MatchingCubes 构建的轮廓后,
contour=vtk.vtkMarchingCubes()
smoother = vtk.vtkWindowedSincPolyDataFilter()
结果如下所示。一些顶点分布不均匀。有什么方法可以让它们更“均匀分割”吗?
解决方案
对于从这篇文章中寻找答案的其他用户:
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()
推荐阅读
- java - 基于 TCP 的 Java/C# 通信 - 有符号/无符号字节专业版
- java - 错误 - Eclipse 中的超类构造函数与 Java 8
- xamarin.forms - Prism Xamarin 如何在运行时访问我的网格
- android - Jetpack compose AppBarIcon 抱怨“调用@Composable 函数的函数必须用@Composable 标记”
- python - 无法在 Python 中使用 mechanize 访问网站
- jquery - 如何在 Ace 编辑器中禁用自动括号关闭?
- python - 我如何网络抓取这个标签?
- vue.js - Vue-router:如何在数据对象中使用命名路由?
- java - 如何将 TabPane 上的特定选项卡放置在右侧,同时将其他选项卡放在左侧?
- oop - 构建器模式是否适用于相同的表示/输出但过程略有不同?