目录
Open3D点云算法汇总及实战案例汇总的目录地址:
Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客
一、概述
在三维网格处理中,Taubin 滤波是一种常用的平滑技术,它通过对网格顶点位置进行反复平滑和拉伸操作,以消除高频噪声和细节,但不会像简单的拉普拉斯平滑那样导致体积收缩。因此,Taubin 滤波可以在保持网格整体形状的前提下,消除噪声并平滑网格。
1.1原理
Taubin 滤波是一种基于拉普拉斯平滑的迭代方法。它的基本思想是通过交替应用两个相反的拉普拉斯平滑操作,一个平滑操作用于去除噪声(收缩网格),另一个平滑操作用于抵消第一次操作的体积收缩。这样可以平滑网格表面,而不引入明显的体积损失。
1.2实现步骤
- 加载网格模型: 使用 Open3D 加载一个三角网格模型,准备进行平滑处理。
- 应用 Taubin 滤波: 调用 Open3D 中的平滑函数对网格进行 Taubin 滤波处理。
- 可视化结果: 显示平滑后的网格模型,与原始模型进行比较,观察平滑效果。
1.3应用场景
- 噪声去除: 适用于三维扫描数据的噪声去除,保留主要形状特征的同时消除高频噪声。
- 模型修复: 在三维建模中,用于修复和优化不规则的网格,特别是在3D扫描后数据处理中。
- 光滑化表面: 在计算机图形学和动画中,用于生成光滑的表面效果。
二、代码实现
2.1关键函数
filter_smooth_taubin 是 Open3D 中用于执行 Taubin 平滑的函数。Taubin 滤波的特点是通过交替应用两个相反的拉普拉斯平滑操作来实现平滑处理,同时避免网格的体积收缩。
def filter_smooth_taubin(self, number_of_iterations: int = 1, lambda: float = 0.5, mu: float = -0.53, filter_scope=None) -> open3d.cpu.pybind.geometry.TriangleMesh
参数详解
1.number_of_iterations: int
- 描述: 指定平滑操作的迭代次数。
- 作用: 决定平滑处理的强度,迭代次数越多,平滑效果越显著。
- 默认值: 1,表示进行一次迭代。
2.lambda: float
- 描述: 拉普拉斯平滑的收缩系数。
- 作用: 控制第一次平滑操作的强度,通常设置为正值。典型值为 0.5。
3.mu: float
- 描述: 拉普拉斯平滑的扩展系数。
- 作用: 控制第二次平滑操作的强度,用于抵消第一次平滑引起的体积收缩。典型值为 -0.53。
4.filter_scope: open3d.geometry.FilterScope
- 描述: 控制平滑操作的作用范围。
- 作用: 可以指定只平滑顶点、面片或整个网格。
- 默认值: None,表示对整个网格进行平滑。
返回值
- smoothed_mesh: open3d.geometry.TriangleMesh
- 描述: 返回经过 Taubin 滤波处理后的三角网格模型。
2.2完整代码
import open3d as o3d
import numpy as np
class o3dtut:
def get_knot_mesh():
# 读取三角网格模型并计算顶点法线
mesh = o3d.io.read_triangle_mesh("bunny.ply")
mesh.compute_vertex_normals() # 计算并存储顶点法线
return mesh
# 获取网格模型
mesh_in = o3dtut.get_knot_mesh()
# 将网格的顶点转换为numpy数组
vertices = np.asarray(mesh_in.vertices)
# 生成并添加噪声到顶点上
noise = 0.001 # 设置噪声的幅度
vertices += np.random.uniform(0, noise, size=vertices.shape) # 给顶点添加均匀分布的噪声
# 将带噪声的顶点数据重新赋值回网格
mesh_in.vertices = o3d.utility.Vector3dVector(vertices)
mesh_in.compute_vertex_normals() # 重新计算顶点法线以反映新的顶点位置
# 可视化带有噪声的网格
o3d.visualization.draw_geometries([mesh_in], width=800, height=800)
# 使用 Taubin 滤波进行平滑处理,迭代10次
print('Filter with Taubin with 10 iterations')
mesh_out = mesh_in.filter_smooth_taubin(number_of_iterations=10)
mesh_out.compute_vertex_normals() # 重新计算顶点法线以反映平滑后的顶点位置
# 可视化平滑处理后的网格
o3d.visualization.draw_geometries([mesh_out], width=800, height=800)
# 使用 Taubin 滤波进行平滑处理,迭代100次
print('Filter with Taubin with 100 iterations')
mesh_out = mesh_in.filter_smooth_taubin(number_of_iterations=100)
mesh_out.compute_vertex_normals() # 重新计算顶点法线以反映平滑后的顶点位置
# 可视化经过100次迭代平滑处理后的网格
o3d.visualization.draw_geometries([mesh_out], width=800, height=800)
三、实现效果
3.1加入噪声的mesh
3.2Taubin迭代10次
3.3Taubin迭代100次