Meshlab Laplacian Smooth 引入了尖峰

问题描述

我正在使用 MeshLab 平滑通过 marching_cubes 和 pymesh 从 3d numpy 数组获得的网格。我正在处理一些类似的网格,其中只有一个给我带来了这个问题。使用的过滤器是带参数的拉普拉斯平滑:

  • 平滑步骤 = 1
  • 一维边界平滑 = True
  • 余切权重 = True

附上拉普拉斯平滑前后的网格图像。不幸的是,由于隐私问题,必须在感兴趣的区域裁剪图像。
任何跟踪问题的帮助或任何调试建议都会非常有帮助。
谢谢!

mesh before laplacian smooth in first region

first spike

mesh before laplacian smooth in second region

second spike

解决方法

你能提供一个网格样本吗? 由于 MarchingCubes 可能导致退化的零面积三角形,这可能是一个数值问题。原因是拉普拉斯平滑尝试沿曲面的切平面移动顶点,这导致零面积三角形未定义。最后,您还可以尝试通过运行 merge close vertices 过滤器来移除那些退化三角形。这个问题也可能出现,因为桌面 meshlab 在浮动上运行,而它的 python 对应 pymeshlab 在 double 上运行。 最终只是直接使用 pymeshlab 尝试从 numpy 数组中创建网格

import numpy as np
import pymeshlab as ml
import k3d

ms = ml.MeshSet()
ms.set_verbosity(True)
ms.apply_filter('implicit_surface',voxelsize=0.050000000001,expr="x*x+y*y+z*z-0.5")
#ms.apply_filter("merge_close_vertices")
ms.apply_filter("laplacian_smooth",stepsmoothnum=1)
ms.apply_filter("compact_vertices")
ms.apply_filter("compact_faces")

plot = k3d.plot()
plot += k3d.mesh(ms.current_mesh().vertex_matrix().astype(np.float32),ms.current_mesh().face_matrix().astype(np.uint32),color=0xf0f0c0)
plot.display()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...