Open3D mesh 均值滤波

Open3D点云算法汇总及实战案例汇总的目录地址:

Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客


一、概述

        均值滤波(Mean Filtering)是一种基本的网格平滑技术,通过将每个顶点的位置替换为其邻域顶点位置的均值,从而平滑网格表面。这种方法可以有效地去除网格表面上的小噪声,使得网格表面更加光滑和连续

1.1原理

        均值滤波的基本思想是将网格中每个顶点的位置替换为其相邻顶点位置的平均值。通过多次迭代这个过程,网格的高频噪声会被削弱,整体表面变得更加光滑。与拉普拉斯滤波不同,均值滤波不强调顶点之间的差异,而是直接取邻域的平均值。

1.2实现步骤

  1. 加载网格模型: 使用 Open3D 加载一个三角网格模型,准备进行平滑处理。
  2. 应用均值滤波: 使用 Open3D 提供的 filter_smooth_simple 函数对网格进行均值滤波处理。
  3. 可视化结果: 显示平滑后的网格模型,与原始模型进行比较,观察平滑效果。

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)

三、实现效果

3.1加入噪点的mesh

3.2迭代10次

 3.3迭代100次

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
open3d是一个开源的3D数据处理库,它提供了一系列的函数和工具,可以对3D数据进行各种操作和处理。其中之一是均值滤波均值滤波是一种常用的图像和数据处理方法,用于去除图像或数据中的噪声和不连续性。在open3d中,均值滤波可以应用于点云数据。 点云是一种由离散的点组成的三维数据表示,它可以用来表示物体的形状、表面特征等。然而,由于传感器噪声、采样误差等原因,点云数据往往存在一些噪点和不规则性,这会影响后续的处理和分析。 均值滤波可以通过计算邻域内点的平均值来平滑点云数据。在open3d中,可以使用`open3d.geometry.PointCloud`类的`filter_smooth_simple`方法来实现均值滤波。 ```python import open3d as o3d # 读取点云数据 point_cloud = o3d.io.read_point_cloud('point_cloud.ply') # 进行均值滤波 filtered_point_cloud = point_cloud.filter_smooth_simple(2) # 可以调整参数2来控制滤波程度,值越大滤波效果越明显 # 可视化结果 o3d.visualization.draw_geometries([point_cloud, filtered_point_cloud]) ``` 在上述代码中,我们首先使用`o3d.io.read_point_cloud`函数读取点云数据。然后,我们使用`filter_smooth_simple`方法对点云数据进行均值滤波。最后,使用`o3d.visualization.draw_geometries`方法将原始点云和滤波后的点云进行可视化。 总的来说,open3d提供了方便和高效的函数和工具,可以帮助我们对点云数据进行均值滤波,去除噪声和不规则性,提升数据质量和后续处理效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值