目录:

  • 前言
  • 一.表面法线估计
  • 二.裁剪和上色TriangleMesh
  • 三.网格过滤
    • 1.均值滤波器
    • 2.拉普拉斯滤波器
  • 总结

前言

来学习一下另一种3d数据TriangleMesh,关于open3d中TriangleMesh的数据结构详解见这篇博客:TriangleMesh

数据下载地址:链接:https://pan.baidu.com/s/1wEBL_OwaVfP4AV78s8Es-Q
提取码:wnhs

一.表面法线估计

import open3d as o3d
import numpy as  np
import copymesh=o3d.io.read_triangle_mesh("./test_data/knot.ply")
print("计算法线")
mesh.compute_vertex_normals()
print(np.asarray(mesh.triangle_normals))
o3d.visualization.draw_geometries([mesh],window_name="mesh",width=810,height=520,zoom=0.8,front=[-0.4999, -0.1659, -0.8499],lookat=[2.1813, 2.0619, 2.0999],up=[0.1204, -0.9852, 0.1215])

我们使用TriangleMesh对象的compute_vertex_normals()进行顶点法线估计。

二.裁剪和上色TriangleMesh

import open3d as o3d
import numpy as  np
import copymesh=o3d.io.read_triangle_mesh("./test_data/knot.ply")
#裁剪
mesh1=copy.deepcopy(mesh)
#将三角形网格和法线用numpy索引一半,转换成3d向量
mesh1.triangles = o3d.utility.Vector3iVector(np.asarray(mesh1.triangles)[:len(mesh1.triangles) // 2, :])
mesh1.triangle_normals = o3d.utility.Vector3dVector(np.asarray(mesh1.triangle_normals)[:len(mesh1.triangle_normals) // 2, :])
print(mesh1.triangles)
#上色
mesh1.paint_uniform_color([1,0.706,0])
o3d.visualization.draw_geometries([mesh1,mesh],window_name="mesh1",width=810,height=520,zoom=0.8,front=[-0.4999, -0.1659, -0.8499],lookat=[2.1813, 2.0619, 2.0999],up=[0.1204, -0.9852, 0.1215])

我们获取一个mesh的副本mesh1,然后我们索引出triangles和triangle_normals的一半赋值给mesh1,直观来说就是我们mesh1是mesh的一半。然后我们给mesh1上色可视化。

其中o3d.utility.Vector3iVector和o3d.utility.Vector3dVector是opend3d的3d向量数据结构。o3d.utility.Vector3iVector和o3d.utility.Vector3dVector将numpy矩阵转换成open3d中的3d矩阵。其中3代表的是数据维度为3,即输入为[n,3]。i和d代表数据类型,Vector3iVector要求输入是numpy.int32数据类型,Vector3dVecto要求输入是numpy.float64数据类型。

mesh对象的paint_uniform_color方法用于给网格上色,输入的是rgb颜色值,每个范围是0-1.

程序运行结果如下:

其中黄色的部分就是我们裁剪出来的TriangleMsh了。

三.网格过滤

Open3D包含许多过滤网格的方法。下面将展示一些过滤器,以平滑有噪声的三角形网格。

1.均值滤波器

最简单的滤波器,当前顶点是相邻顶点的平均值。公式如下:

import open3d as o3d
import numpy as npmesh_in=o3d.io.read_triangle_mesh("./test_data/knot.ply")
#拿出各个顶点,加上0-5的随机数,也就是噪声
vertices=np.asarray(mesh_in.vertices)
noise_max=5
vertices+=np.random.uniform(0,noise_max,size=vertices.shape)
#换成新顶点
mesh_in.vertices=o3d.utility.Vector3dVector(vertices)
mesh_in.compute_vertex_normals()
o3d.visualization.draw_geometries([mesh_in],window_name="noise",width=810,height=520,zoom=0.8,front=[-0.4999, -0.1659, -0.8499],lookat=[2.1813, 2.0619, 2.0999],up=[0.1204, -0.9852, 0.1215])
print("一次迭代")
mesh_out=mesh_in.filter_smooth_simple(number_of_iterations=1)
mesh_out.compute_vertex_normals()
o3d.visualization.draw_geometries([mesh_out],window_name="filter1",width=810,height=520,zoom=0.8,front=[-0.4999, -0.1659, -0.8499],lookat=[2.1813, 2.0619, 2.0999],up=[0.1204, -0.9852, 0.1215])print("5次迭代")
mesh_out=mesh_in.filter_smooth_simple(number_of_iterations=5)
mesh_out.compute_vertex_normals()
o3d.visualization.draw_geometries([mesh_out],window_name="filter5",width=810,height=520,zoom=0.8,front=[-0.4999, -0.1659, -0.8499],lookat=[2.1813, 2.0619, 2.0999],up=[0.1204, -0.9852, 0.1215])

我们先给我们的TriangleMsh加上一些随机噪声。

TriangleMesh对象的filter_smooth_simple方法用于对TriangleMesh使用均值滤波,参数如下:
number_of_iterations:均值滤波的次数
filter_scope:设置过滤条件,默认是open3d.geometry.FilterScope.All,代表使用所有索性作为过滤条件,open3d.geometry.FilterScope.Color代表使用颜色过滤,open3d.geometry.FilterScope.Normal代表使用法线过滤,open3d.geometry.FilterScope.Vertex代表使用顶点过滤。

运行结果如下:

这是加了噪声的体素


这是进行一些均值滤波的体素


进行五次均值滤波的体素

2.拉普拉斯滤波器

open3d中拉普拉斯滤波器公式为:

其中λ是过滤器的强度,Wn是与相邻顶点的距离相关的归一化权重。

示例代码如下:

import numpy as np
import open3d as o3dmesh_in=o3d.io.read_triangle_mesh("test_data/knot.ply")print("迭代10次")
mesh_out=mesh_in.filter_smooth_laplacian(number_of_iterations=10)
mesh_out.compute_vertex_normals()
o3d.visualization.draw_geometries([mesh_in],window_name="mesh_in",width=810,height=520,zoom=0.8,front=[-0.4999, -0.1659, -0.8499],lookat=[2.1813, 2.0619, 2.0999],up=[0.1204, -0.9852, 0.1215])
o3d.visualization.draw_geometries([mesh_out],window_name="laplacian10",width=810,height=520,zoom=0.8,front=[-0.4999, -0.1659, -0.8499],lookat=[2.1813, 2.0619, 2.0999],up=[0.1204, -0.9852, 0.1215])print("迭代50次")
mesh_out=mesh_in.filter_smooth_laplacian(number_of_iterations=50)
mesh_out.compute_vertex_normals()
o3d.visualization.draw_geometries([mesh_out],window_name="laplacian50",width=810,height=520,zoom=0.8,front=[-0.4999, -0.1659, -0.8499],lookat=[2.1813, 2.0619, 2.0999],up=[0.1204, -0.9852, 0.1215])

拉普拉斯滤波器定义在TriangleMesh对象的filter_smooth_laplacian方法,参数如下:

     number_of_iterations (int, optional, default=1): 拉普拉斯滤波器迭代次数lambda (float, optional, default=0.5): λfilter_scope (open3d.geometry.FilterScope, optional, default=<FilterScope.All: 0>):和上面均值滤波器一样

运行结果如下:

原始体素

经过10次拉普拉斯滤波器

经过50次拉普拉斯滤波器

总结

朋友们还没完结,后续见下一节

3d机器学习笔记5--TriangleMesh处理(1)相关推荐

  1. 机器学习笔记一:导论

    机器学习笔记一:导论 1.定义 2.课程主要内容 监督学习(supervised learning) 例子:<房价预测>给定一组已知房价数据,使用算法预测待定房子的价格. 例子:<乳 ...

  2. Python_ML_斯坦福机器学习笔记

    斯坦福机器学习笔记 Introduction 线性回归 回归问题 线性回归与梯度下降 程序示例--梯度下降 正规方程 特征缩放 多项式回归 程序示例--多项式回归 欠拟合与过拟合 程序示例--局部加权 ...

  3. 龙珠训练营机器学习笔记

    龙珠训练营机器学习笔记 本学习笔记为阿里云天池龙珠计划机器学习训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/promotion/aicampml ...

  4. 一份520页的机器学习笔记!附下载链接

    点击上方"视学算法",选择"星标"公众号 第一时间获取价值内容 近日,来自SAP(全球第一大商业软件公司)的梁劲(Jim Liang)公开了自己所写的一份 52 ...

  5. 700 页的机器学习笔记火了!完整版开放下载

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 作者       梁劲(Jim Liang),来自SAP(全球第一大商业软件公司). 书籍特点       条理清晰 ...

  6. 机器学习笔记十四:随机森林

    在上一篇机器学习笔记十三:Ensemble思想(上)中,简要的提了一下集成学习的原理和两种主要的集成学习形式.  而在这部分要讲的随机森林,就算是其中属于bagging思路的一种学习方法.为了篇幅,b ...

  7. 机器学习笔记七:损失函数与风险函数

    一.损失函数 回顾之前讲过的线性回归模型,我们为了要学习参数使得得到的直线更好的拟合数据,我们使用了一个函数 这个函数就是比较模型得到的结果和"真实值"之间的"差距&qu ...

  8. 吴恩达机器学习笔记55-异常检测算法的特征选择(Choosing What Features to Use of Anomaly Detection)

    吴恩达机器学习笔记55-异常检测算法的特征选择(Choosing What Features to Use of Anomaly Detection) 对于异常检测算法,使用特征是至关重要的,下面谈谈 ...

  9. Python机器学习笔记:sklearn库的学习

    自2007年发布以来,scikit-learn已经成为Python重要的机器学习库了,scikit-learn简称sklearn,支持包括分类,回归,降维和聚类四大机器学习算法.还包括了特征提取,数据 ...

最新文章

  1. 【正一专栏】巴萨耗光了所有的激情和精力
  2. java注释 param_java注释文档(下)
  3. SSO单点登录和OAuth2.0的区别和理解
  4. matlab isinteger,MATLAB数据类型
  5. Linux查看内存占用--free
  6. java接口构造函数_Java8自定义函数式编程接口和便捷的引用类的构造器及方法
  7. 步骤mysql_mysql 安装 等步骤(一)
  8. Linux驱动总结3- unlocked_ioctl和堵塞(waitqueue)读写函数的实现 【转】
  9. 做为程序员,我到底在恐慌什么
  10. linux裁剪视频教程,适用于Linux桌面的超简单实用的视频裁剪应用
  11. element-ui的el-table更改筛选值filtered-value后不起作用
  12. 风控决策引擎——决策流构建实战
  13. 海康威视SDK二次开发通过云台参数设置控制摄像机的位置
  14. 解决fileReader读取文件乱码
  15. 记一次腾讯TBS浏览服务集成实践
  16. JS事件 失焦事件(onblur)onblur事件与onfocus是相对事件,当光标离开当前获得聚焦对象的时候,触发onblur事件,同时执行被调用的程序。...
  17. nat123搭建以及gitlab使用
  18. Bootstrap3 缩略图( thumbnail )
  19. 适合大一大二学生的深度学习实践项目汇总:涵盖图像处理、语音识别、自然语言处理等领域
  20. 手撕面试官的OKhttp连环炮击~

热门文章

  1. android intent分享第二次,Android利用Intent.ACTION_SEND进行分享
  2. Pycharm安装第三方库的三种方法
  3. 写的真好,文笔真不错,读起来很舒服和很有同感
  4. 计算机毕业设计:基于HTML学校后台用户登录界面模板源码
  5. Java中jar包怎么使用_java中jar包的使用方法
  6. 串口转换器、虚拟串口转TCP
  7. Simotion应用与组网之十整流与逆变
  8. 前后端数据交互——ajax技术
  9. 2021年图灵奖出炉!高性能计算鼻祖Jack Dongarra获奖
  10. 分享 嵌入式DVR怎样做远程监控