Open3D点云算法汇总及实战案例汇总的目录地址:
Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客
一、概述
均值滤波(Mean Filtering)是一种基本的网格平滑技术,通过将每个顶点的位置替换为其邻域顶点位置的均值,从而平滑网格表面。这种方法可以有效地去除网格表面上的小噪声,使得网格表面更加光滑和连续
1.1原理
均值滤波的基本思想是将网格中每个顶点的位置替换为其相邻顶点位置的平均值。通过多次迭代这个过程,网格的高频噪声会被削弱,整体表面变得更加光滑。与拉普拉斯滤波不同,均值滤波不强调顶点之间的差异,而是直接取邻域的平均值。
1.2实现步骤
- 加载网格模型: 使用 Open3D 加载一个三角网格模型,准备进行平滑处理。
- 应用均值滤波: 使用 Open3D 提供的 filter_smooth_simple 函数对网格进行均值滤波处理。
- 可视化结果: 显示平滑后的网格模型,与原始模型进行比较,观察平滑效果。
1.3应用场景
- 噪声去除: 适用于从三维扫描数据中去除细小的表面噪声,使得网格表面更加平滑和连续。
- 模型优化: 在3D建模过程中使用均值滤波来优化网格,使表面更加均匀和平整。
- 动画和渲染: 平滑处理可以帮助生成更自然的动画角色和场景,并且在渲染中表现更为细腻。
二、代码实现
2.1关键函数
filter_smooth_simple 是 Open3D 中用于对三角网格模型进行简单平滑处理的函数。这种平滑方法通常被称为均值滤波,通过对网格中每个顶点的位置进行调整,使网格表面更加光滑。
def filter_smooth_simple(self, number_of_iterations: int = 1) -> open3d.cpu.pybind.geometry.TriangleMesh
参数详解
number_of_iterations: int
- 描述: 控制平滑操作的迭代次数。
- 作用: 该参数决定了平滑的强度。每次迭代会根据均值滤波的原理调整顶点的位置。迭代次数越多,网格表面会变得更加光滑。
- 默认值: 1,表示进行一次迭代。
返回值
smoothed_mesh: open3d.geometry.TriangleMesh
- 描述: 返回经过均值滤波处理后的三角网格模型。该模型通常具有更光滑的表面。
2.2完整代码
import open3d as o3d
import numpy as np
class o3dtut:
def get_knot_mesh():
# 读取三角网格模型并计算顶点法线
mesh = o3d.io.read_triangle_mesh(r"E:\work\Open3D\open3d20231128\Blog_Cloud\Open3D_Blog\Cloud_Data\cloud_ply\dragon_vrip.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=600)
# 使用 simple 滤波进行平滑处理,迭代10次
print('Filter with Taubin with 10 iterations')
mesh_out = mesh_in.filter_smooth_simple(number_of_iterations=10)
mesh_out.compute_vertex_normals() # 重新计算顶点法线以反映平滑后的顶点位置
# 可视化平滑处理后的网格
o3d.visualization.draw_geometries([mesh_out], width=800, height=600)
# 使用 simple 滤波进行平滑处理,迭代100次
print('Filter with Taubin with 100 iterations')
mesh_out = mesh_in.filter_smooth_simple(number_of_iterations=100)
mesh_out.compute_vertex_normals() # 重新计算顶点法线以反映平滑后的顶点位置
# 可视化经过100次迭代平滑处理后的网格
o3d.visualization.draw_geometries([mesh_out], width=800, height=600)
import open3d as o3d
import numpy as np
class o3dtut:
def get_knot_mesh():
# 读取三角网格模型并计算顶点法线
mesh = o3d.io.read_triangle_mesh("dragon_vrip.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=600)
# 使用 simple 滤波进行平滑处理,迭代10次
print('Filter with Taubin with 10 iterations')
mesh_out = mesh_in.filter_smooth_simple(number_of_iterations=10)
mesh_out.compute_vertex_normals() # 重新计算顶点法线以反映平滑后的顶点位置
# 可视化平滑处理后的网格
o3d.visualization.draw_geometries([mesh_out], width=800, height=600)
# 使用 simple 滤波进行平滑处理,迭代100次
print('Filter with Taubin with 100 iterations')
mesh_out = mesh_in.filter_smooth_simple(number_of_iterations=100)
mesh_out.compute_vertex_normals() # 重新计算顶点法线以反映平滑后的顶点位置
# 可视化经过100次迭代平滑处理后的网格
o3d.visualization.draw_geometries([mesh_out], width=800, height=600)