Open3D mesh Taubin滤波

news2024/9/24 9:26:09

目录

一、概述

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次

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2093660.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【学习笔记】卫星通信发展趋势

卫星通信系统是融合现代通信技术、航天技术与计算机技术的综合应用,已成为国际与国内通信、国防、移动通信及广播电视领域的关键基础设施。基于其频带宽度大、通信容量高、业务兼容性强、覆盖范围广、性能稳定、地理条件适应性高及成本与距离无关等特性,…

猫咪浮毛不再乱飞 希喂、霍尼韦尔、352宠物空气净化器功能实测

“你真的养猫了吗?为什么一点也看不出来?”养宠以来我经常收到这样的提问,原因是另一位铲屎官身上总会时不时出现猫咪毛发,标记着他的身份。哪有不会掉毛的猫咪呢,何况到了夏天,换毛季的掉毛量更是惊人。其…

KTV开台源码--SAAS本地化及未来之窗行业应用跨平台架构

一、ktv开台源码 function 未来之窗_人工智能_KTV开台(title,桌台id,类型id,类型名称){var 未来之窗app_通用ID"未来之城激光加工机";var 未来之窗_人工智能_内容 tpl_未来之窗_模板_KTV开单;CyberWin_Dialog.layer(未来之窗_人工智能_内容,{type:"frame",…

Kubernetes 网关流量管理:Ingress 与 Gateway API

引言 随着 Kubernetes 在云原生领域的广泛使用,流量管理成为了至关重要的一环。为了有效地管理从外部流入集群的流量,Kubernetes 提供了多种解决方案,其中最常见的是 Ingress 和新兴的 Gateway API。 Ingress 随着微服务架构的发展&#x…

【手撕数据结构】二叉树的性质

目录 叶子节点和边的性质概念小试牛刀 叶子节点和边的性质 概念 可以看到度为0的节点如F没有边,度为1的节点如C有一条边,而度为2的节点如B有两条边。那么设度为2的节点为a个,度为1的节点为b个。二叉树边 2ab另⼀⽅⾯,由于共有 a…

反激式开关电源(硬件面试86题 电源专栏)

在硬件面试经典中的第 86 题中提到的反激式开关电源,是通过开关通断将交流转变成直流的 AD-DC 开关电源的一种,并且反激式开关电源是由 BUCK-BOOST 电路演变而来,所以博客由浅入深一步一步讲解完反激式开关的知识,让我们开始吧&am…

未使用CMSIS之前的stm32标准库中SystemHandler的宏定义

背景: 在stm32的标准库还叫STM32F10xxx_FWLib_V2.0.3的那个年代 文件 STM32F10xFWLib_V2.0.3/FWLib/library/inc/stm32f10x_nvic.h 中有对System Handlers的定义。具体内容如下: /* System Handlers -------------------------------------------------…

【Python】2.基础语法(2)

文章目录 1.顺序语句2.条件语句2.1语法格式2.1.1 if2.1.2 if - else2.1.3 if - elif - else 2.2缩进和代码块2.3 空语句 pass 3. 循环语句3.1 while 循环3.2 for 循环3.3 continue3.4 break 4. 综合案例4.1 设置初始属性4.2 设置性别4.3 设置出生点4.4 针对每一岁, 生成人生经历…

【MySQL】主键优化原理篇——【数据组织方式&主键顺序插入&主键乱序插入&页分裂&页分裂】

前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

AI搜索:重塑信息获取的新纪元

在信息爆炸的时代,如何快速、准确地获取所需信息成为了每个人面临的挑战。传统的搜索引擎虽然在一定程度上解决了这一问题,但广告干扰、结果冗余、内容质量参差不齐等问题仍让用户体验大打折扣。随着AI技术的不断发展,AI搜索产品以其独特的优…

【软件测试】bug以及测试用例的设计方法

系列文章目录 第一章 【软件测试】常见的开发模型和测试模型 文章目录 系列文章目录前言一、bug的基本要素。二、bug的处理流程三、弱网测试四、设计方法1.基于需求的设计方法2.具体的测试方法(1)等价类划分法(2)边界值分析法&am…

Serilog文档翻译系列(三) - 基础配置

Serilog 使用简单的 C# API 来配置日志记录。当需要外部配置时,可以(慎用)通过使用 Serilog.Settings.AppSettings 包或 Serilog.Settings.Configuration 包进行混合配置。 创建日志记录器 日志记录器是通过 LoggerConfiguration 对象创建的…

STM32硬件篇:W25Q64

W25Q64简介 W25Qxx系列是一种低成本、小型化、使用简单(使用SPI通信协议)的非易失性(掉电不丢失)存储器,常用于数据存储、字库存储、固件程序存储等场景。 【注意】W25Qxx芯片只支持SPI的模式0和模式3。 存储介质&am…

【单片机开发】IAP技术详解及应用

【前言】 在单片机开发过程中,程序的烧录是一个至关重要的环节。随着技术的不断演进,单片机烧录方式也日益多样化。 【单片机开发】单片机的烧录方式详解(ICP、IAP、ISP)-CSDN博客文章浏览阅读775次,点赞14次&#x…

kali系统学习笔记1

收集DSN相关信息命令 1、ping IP/URL 例如 ping 153.3.238.110 ping www.baidu.com2、nslookup 域名 例如 nslookup www.baidu.com3、dig URL //查询域名正向解析 dig www.baidu.com //查询域名所有解析(正向、反向) dig www.baidu.com any//通过指…

江协科技stm32————11-1SPI通信协议

目录 SPI通信 硬件电路 移位示意图 SPI时序基本单元 模式0 模式1 SPI时序 发送指令 指定地址写 指定地址读 SPI通信 四根通信线: SCK(Serial Clock):串行时钟线 MOSI(Master Output Slave Input&#xff09…

书生大模型实战营闯关记录----第十一关:LMDeploy 量化部署进阶实践 KV cache量化部署,W4A16 模型量化和部署

文章目录 1 配置LMDeploy环境1.1 环境搭建1.2 InternStudio环境获取模型1.3 LMDeploy验证启动模型文件 2 LMDeploy与InternLM2.5 2.1 LMDeploy API部署InternLM2.52.1.1 启动API服务器 2.1.2 以命令行形式连接API服务器 2.1.3 以Gradio**网页形式连接API服务器** 2.2 LMDeploy…

使用developer command prompt查看代码信息

1.在Visual Studio里面写入以下的代码&#xff0c;命名为Myproject #include <iostream>template<typename T> T Sub(T a, T b) {return a - b; } int main() {int x 1, y 2;int z Sub(x, y);double a 1.0, b 2.0;double c Sub(a, b);return 0; }2.打开dev…

在VBA中,对Excel单元格的操作方法 (qo+op)

一、读取单元格内容 读取单元格的内容&#xff0c;将单元格的值赋给一个变量。例如&#xff0c;读取A1单元格的内容并打印到窗口。 Sub Cell() Dim cellContent As String cellContent Worksheets("Sheet1").Range("A1").Value Debug.Print cellContent …

C语言基础(二十八)

1、冒泡排序&#xff1a; #include "date.h" #include <stdio.h> #include <stdlib.h> #include <time.h> // 函数声明 void bubbleSort(int *arr, int n); int* createRandomArray(int n, int *size); int main() { int time getTi…