Open3D mesh Taubin滤波

2024-09-01 09:36
文章标签 滤波 mesh open3d taubin

本文主要是介绍Open3D mesh Taubin滤波,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

参数详解

返回值

2.2完整代码

三、实现效果

3.1加入噪声的mesh

3.2Taubin迭代10次

3.3Taubin迭代100次


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

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


一、概述

        在三维网格处理中,Taubin 滤波是一种常用的平滑技术,它通过对网格顶点位置进行反复平滑和拉伸操作,以消除高频噪声和细节,但不会像简单的拉普拉斯平滑那样导致体积收缩。因此,Taubin 滤波可以在保持网格整体形状的前提下,消除噪声并平滑网格。

1.1原理

        Taubin 滤波是一种基于拉普拉斯平滑的迭代方法。它的基本思想是通过交替应用两个相反的拉普拉斯平滑操作,一个平滑操作用于去除噪声(收缩网格),另一个平滑操作用于抵消第一次操作的体积收缩。这样可以平滑网格表面,而不引入明显的体积损失。

1.2实现步骤

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

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

 

这篇关于Open3D mesh Taubin滤波的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126564

相关文章

Open3D 基于法线的双边滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 输入参数: 输出参数: 参数影响: 2.2完整代码 三、实现效果 3.1原始点云 3.2滤波后点云 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述         基于法线的双边

6.4双边滤波

目录 实验原理 示例代码1 运行结果1 实验代码2 运行结果2 实验原理 双边滤波(Bilateral Filtering)是一种非线性滤波技术,用于图像处理中去除噪声,同时保留边缘和细节。这种滤波器结合了空间邻近性和像素值相似性的双重加权,从而能够在去噪(平滑图像)的同时保留图像的边缘细节。双边滤波器能够在的同时,保持边缘清晰,因此非常适合用于去除噪声和保持图像特征。在Op

数据集 3DPW-开源户外三维人体建模-姿态估计-人体关键点-人体mesh建模 >> DataBall

3DPW 3DPW-开源户外三维人体建模数据集-姿态估计-人体关键点-人体mesh建模 开源户外三维人体数据集 @inproceedings{vonMarcard2018, title = {Recovering Accurate 3D Human Pose in The Wild Using IMUs and a Moving Camera}, author = {von Marc

6.3中值滤波

目录 实验原理 示例代码1 运行结果1 示例代码2 运行结果2 实验原理 中值滤波(Median Filtering)是一种非线性滤波技术,常用于图像处理中去除噪声,特别是在保留边缘的同时减少椒盐噪声(salt-and-pepper noise)。OpenCV中的cv::medianBlur函数可以实现中值滤波。 函数原型 void medianBlur( InputAr

数据集 Ubody人体smplx三维建模mesh-姿态估计 >> DataBall

Ubody开源人体三维源数据集-smplx-三维建模-姿态估计 UBody:一个连接全身网格恢复和真实生活场景的上半身数据集,旨在拟合全身网格恢复任务与现实场景之间的差距。 UBody包含来自多人的现实场景的1051k张高质量图像,这些图像拥有2D全身关键点、3D SMPLX模型。 UBody由国际数字经济学院(IDEA)提供。 (UBody was used for mesh r

【控制算法 数据处理】一阶滤波算法

简单介绍: 一阶滤波算法是比较常用的滤波算法,它的滤波结果=a*本次采样值+(1-a)*上次滤波结果,其中,a为0~1之间的数。一阶滤波相当于是将新的采样值与上次的滤波结果计算一个加权平均值。a的取值决定了算法的灵敏度,a越大,新采集的值占的权重越大,算法越灵敏,但平顺性差;相反,a越小,新采集的值占的权重越小,灵敏度差,但平顺性好。优点是对周期干扰有良好的抑制作用,适用于波动频率比较高的场合,它

Data Mesh,数据网格的道与术

周末的时候,看到有群友讨论关于 Data Mesh 的话题。这个名词我在2020年初的时候听到过一次,当时感觉就是一个概念,看的糊里糊涂,没有当回事。最近突然又被推上了话题风口,所以静下心来看了一下相关的论文和介绍。 在讨论 Data Mesh 之前,首先要给大家介绍一下 Service Mesh。 Service Mesh 公认的定义,是用以处理服务与服务之间通信的专用基础设施层。更本质的理

RSSI滤波方法

文章目录 一、均值滤波二、递推平均滤波三、中位值滤波四、狄克逊检验法滤波五、高斯滤波六、速度滤波七、卡尔曼滤波 一、均值滤波 均值滤波是指节点接收到另一节点的多个RSSI值之后,求其算式平均值,作为测试结果 R S S I ‾ = 1 n ∙ ∑ i = 1 n R S S I i \overline{RSSI} = \frac {1}{n} \bullet \sum_{i=1

CUDAPCL ROR点云滤波

文章目录 一、简介二、实现代码三、实现效果参考资料 一、简介 该方法的具体原理为输入的点云中每一个点设定一个范围(半径为r的圆),如果在该范围内没有达到某一个设定的点数值,则该数据点将会被删除,重复上述此过程直到最后一个数据点,即完成该滤波过程。 二、实现代码 ROR.cuh #ifndef ROR_GPU_CUH#define ROR_GPU_CU

matlab频域滤波

步骤: (1)计算原图像f(x,y)的DFT, (2) 讲频谱的零频点移动到频谱图的中心位置; (3)计算滤波器函数H(U,V)与F(U,V)的乘积G(U,V); (4)讲频谱G(U,V)的零频点移回到频谱图的坐上角。 (5)计算(4)的结果的傅立叶反变换g(x,y); (6)取g(x,y)的实部作为最终的滤波后的结果图像。   代码: 大家别激动的啦   代