目录
一、概述
1.1去除噪点的方法
1.2应用
二、代码实现
三、实现效果
3.1原始点云
3.2添加噪声的mesh
Open3D点云算法汇总及实战案例汇总的目录地址:
Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客
一、概述
在三维网格模型中,噪点通常是指一些孤立的、偏离主模型的无效数据点或面片,这些噪点可能是由于扫描过程中的误差或其他原因造成的。在 Open3D 中,可以使用多种方法来去除三维网格中的噪点,从而获得更加干净和光滑的网格模型。
1.1去除噪点的方法
- 顶点去噪: 通过滤除某些离群顶点来去除噪点。这种方法通常基于统计学方法,如半径邻域统计、均值或中值滤波。
- 面去噪: 通过移除网格中包含面积过小、形状异常或法向量偏差较大的三角面来实现去噪。
- 网格平滑: 通过平滑网格表面来减少噪点的影响,使得网格表面更加光滑。这种方法在去除高频噪声时非常有效。
1.2应用
- 三维重建: 去除噪点后的网格模型可以用于更精确的三维重建。
- 工业检测: 在工业扫描和检测中,去除噪点可以提高模型的精度和质量。
- 科学计算: 在科学计算中,干净的网格模型可以提高仿真和计算的准确性。
二、代码实现
import open3d as o3d
import numpy as np# ------------------- 加载三角网格模型 -------------------
mesh = o3d.io.read_triangle_mesh("monkey.ply")
mesh.compute_vertex_normals()# ------------------- 生成带有噪点的网格 -------------------
vertices = np.asarray(mesh.vertices)# 生成随机噪声并添加到顶点上
noise = np.random.normal(scale=0.01, size=vertices.shape) # 标准差为0.01的高斯噪声
noisy_vertices = vertices + noise# 创建一个新的网格模型,使用带有噪声的顶点
noisy_mesh = o3d.geometry.TriangleMesh()
noisy_mesh.vertices = o3d.utility.Vector3dVector(noisy_vertices)
noisy_mesh.triangles = mesh.triangles
noisy_mesh.compute_vertex_normals()
noisy_mesh += mesh# ------------------- 可视化带有噪点的网格 -------------------
print("Noisy Mesh")
o3d.visualization.draw_geometries([noisy_mesh], window_name="Noisy Mesh", width=800, height=600)# ------------------- 去除噪点 -------------------
# 移除孤立的顶点(噪点)
noisy_mesh.remove_unreferenced_vertices()# 通过移除网格中的小连通组件来去除噪点
noisy_mesh = noisy_mesh.remove_degenerate_triangles()
noisy_mesh = noisy_mesh.remove_duplicated_triangles()
noisy_mesh = noisy_mesh.remove_duplicated_vertices()
noisy_mesh = noisy_mesh.remove_non_manifold_edges()# 可视化去除噪点后的网格模型
print("Mesh after noise removal")
o3d.visualization.draw_geometries([noisy_mesh], window_name="Mesh after noise removal", width=800, height=600)# ------------------- 进一步平滑网格 -------------------
# 对网格进行平滑处理,以减少表面噪声smoothed_mesh = noisy_mesh.filter_smooth_simple(number_of_iterations=5)# 可视化平滑后的网格模型
print("Smoothed Mesh")
o3d.visualization.draw_geometries([smoothed_mesh], window_name="Smoothed Mesh", width=800, height=600)# ------------------- 可视化原始网格 -------------------
print("Original Mesh")
o3d.visualization.draw_geometries([mesh], window_name="Original Mesh", width=800, height=600)