首页 > 其他分享 >Open3D mesh Taubin滤波

Open3D mesh Taubin滤波

时间:2024-09-01 12:56:04浏览次数:17  
标签:迭代 Taubin 平滑 网格 mesh Open3D 顶点

目录

一、概述

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 np

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

 

标签:迭代,Taubin,平滑,网格,mesh,Open3D,顶点
From: https://blog.csdn.net/qq_47947920/article/details/141712003

相关文章

  • Linux Debian12安装flameshot火焰截图工具
    一、LinuxDebian12安装flameshot打开终端,运行:sudoaptinstallflameshot安装成功后,使用下面命令查看帮助信息:flameshot-h其中flameshotlauncher命令可以打开启动器。二、使用flameshot截图方法打开终端,输入下面命令:flameshotlauncher打开启动器可以进行新的截......
  • Linux Debian12使用flameshot或gnome-screenshot和ImageMagick垂直合并多张图片后组成
    在发布博客,有时需要滚动截长图,虽然在windows系统有滚动截长图的工具,例如:FastStoneCapture等,但是LinuxDebian系统,这种滚动截长图的工具没有找到合适的。经过自己筛选验证,发现LinuxDebian12使用flameshot或gnome-screenshot截取多张图片,再使用和ImageMagick图像处理工具进行垂直合......
  • 使用open3d合并ply模型
    importopen3daso3dfromscipy.ndimageimportbinary_fill_holesdefmerge_ply(ply1,ply2,output_path):#加载两个多边形模型mesh1=o3d.io.read_triangle_mesh(ply1)mesh2=o3d.io.read_triangle_mesh(ply2)#使用+运算符合并两个多边形模型......
  • [Paper Reading] One-Stage 3D Whole-Body Mesh Recovery with Component Aware Trans
    One-Stage3DWhole-BodyMeshRecoverywithComponentAwareTransformerlink时间:CVPR2023机构:粤港澳大湾区数字经济研究院(IDEA)&&清华大学深圳国际研究生院TL;DR使用一个纯Transformer结构模型(名为OSX)直接预测Body/Hand/Face的参数,避免了之前各模型分开预测后融合复......
  • Zigbee VS DigiMesh 网络特性对照表
     Zigbee协议DigiMesh协议节点类型协调器,路由器和终端设备同质网络,灵活路由可配置性多重角色定义会导致网络配置不太灵活。每个父设备只能支持数量有限的子设备。可更灵活地扩展网络。简化网络设置。无须考虑网络父/子设备比率。或者,您可以禁用相关设备路由消息的......
  • Open3D初探
         pcl点云库作为点云算法的入门基础,点云从业者对此都应该比较熟悉了,pcl库的下载以及源码的编译再到具体教程,网上的例子铺天盖地,这也间接说明了该库的受欢迎程度很高,该库的优势在于开源,算法覆盖面也是很广,上手也较为轻松,没有特别复杂的编程语言,也易于移植。但是缺点也......
  • Open3D mesh 裁剪
    目录一、概述1.1常用裁剪方法1.2应用场景二、代码实现2.1 轴对齐包围盒(AABB)裁剪2.2有向包围盒(OBB)裁剪2.3 平面裁剪Open3D点云算法汇总及实战案例汇总的目录地址:Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客一、概述        在三......
  • Open3D 计算点云的面状指数
    目录一、概述1.1原理1.2实现步骤步骤1:确定邻域点步骤2:计算协方差矩阵步骤3:特征值分解步骤4:计算面状指数步骤5:可视化与应用1.3应用领域二、代码实现2.1关键函数2.2完整代码三、实现效果3.1原始点云3.2面状指数可视化Open3D点云算法汇总及实战案例汇总的......
  • Docker+Win11:显示Docker中的GUI,解决报错“[Open3D WARNING] GLFW Error: X11: Failed
        在本系列博文中,我将Pytorch部署在Win11为宿主的Docker中,并成功的调用GPU进行了训练。这为我提供了很多便利。    今天在进行3D相关的深度学习研究时我遇到了一些问题:[Open3DWARNING]GLFWError:X11:Failedtoopendisplay:0[Open3DWARNING]Faile......
  • OFtutorial03_understandingTheMesh解析
    OFtutorial3.C#include"fvCFD.H"intmain(intargc,char*argv[]){#include"setRootCase.H" //Thesetwocreatethetimesystem(instancecalledrunTime)andfvMesh(instancecalledmesh).#include"createTime.H"......