当前位置: 首页 > news >正文

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 npclass 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 npclass 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次


http://www.mrgr.cn/news/17567.html

相关文章:

  • [Algorithm][综合训练][循环汉诺塔][kotori和素因子][dd爱科学]详细讲解
  • Spring MVC 框架简介与实例
  • vector模拟实现迭代器失效
  • 【Kubernetes】持久卷的动态供给 Dynamic Provisioning
  • HX711—称重模块
  • 18. 为什么浮点类型不支持左移和右移运算符?
  • 计算机毕业设计hadoop+spark知识图谱课程推荐系统 课程预测系统 课程大数据 课程数据分析 课程大屏 mooc慕课推荐系统 大数据毕业设计
  • 提高工作效益方法(一)
  • 【EtherCAT】运行原理
  • 支付平台构建支付接口供整个公司调用—支付代理商
  • getopts(1) builtin command
  • Linux 文件操作相关函数整理
  • docker实战基础一 (Docker基础命令)
  • docker实战扩展三(dockerfile中run的详细用法)
  • `lambdaQuery()` 和 `lambda()`
  • MySQL锁机制解析:确保数据库高效并发与数据一致性的关键
  • FFmpeg源码:av_rescale_rnd、av_rescale_q_rnd、av_rescale_q、av_add_stable函数分析
  • 【Hot100】LeetCode—74. 搜索二维矩阵
  • kali——nikto的使用
  • C/C++逆向:寻找mian函数(其他编译配置特征)