【点云处理教程】04 Python 中的点云过滤

一、说明

        这是我的“点云处理”教程的第 4 篇文章。“点云处理”教程对初学者友好,我们将在其中简单地介绍从数据准备到数据分割和分类的点云处理管道。

        在本教程中,我们将学习如何使用 Open3D 在 python 中过滤点云以进行下采样和异常值去除。使用 Open3D 进行点云预处理

  • 第1条:点云处理简介
  • 文章2:在Python中从深度图像估计点云
  • 文章3:了解点云:使用Python实现地面检测
  • 文章4:Python中的点云过滤
  • 文章 5 : Python 中的点云分割

二、 简介

        由于所使用的3D扫描仪(如结构光扫描仪)或捕获的场景(包括吸收红外光的材料)的性质,计算或收集的点云有时会产生噪声。另一方面,一些算法和/或计算机视觉技术对噪声很敏感,例如估计表面法线和曲率变化。

        为了降低噪音,使用了滤波技术。一些滤波器还用于降低点云密度,从而减少计算时间。在本文中,我们将看到一些常见的过滤器,即:直通滤波器、统计异常值去除滤波器、半径异常值去除滤波器和下采样滤波器。

2.2  直通滤波器

        直通筛选器对输入数据应用约束,这些约束通常是阈值或间隔。对于点云,如果一个点满足约束,则点通过过滤器,这些约束主要是沿一个或多个轴的间隔。为了降低噪声,间隔通常根据输入设备的性质和状态进行固定:深度数据在间隔内更准确,否则会变得更加嘈杂。直通滤波器不仅可用于滤除噪声输入,还可用于减少数据,例如考虑最近的点。

        在版本 0.7.0 之前,Open3D 支持以下功能:crop_point_cloud(input, min_bound, max_bound)

input是输入点云。

min_bound是点坐标的最小界限。

max_bound是点坐标的最大边界。

返回区间内点的点云。

        例如,要过滤点云以减少沿 Z 轴的噪声,请考虑间隔。对于 X 轴和 Y 轴,我们将边界设置为无穷大,因为我们没有沿着它们进行过滤:[0.8, 3]

from open3d import *
import math
import numpy as np

cropped = crop_point_cloud(pcd, 
                          min_bound=np.array([-math.inf, -math.inf, 0.8]), 
                          max_bound=np.array([math.inf, math.inf, 3]))

        在0.7.0版本之后,可以使用裁剪点云的方法。与前面的函数类似,此方法返回裁剪的点云。为此,我们首先创建一个边界框,其中包含将要考虑的点。此边界框是根据区间边界的组合创建的(请参见)。在这里,我们只沿 Z 轴过滤:仅返回其 z 坐标之间的点。最后,使用创建的边界框对象裁剪输入点云:crop(bounding_box)open3d.geometry.PointCloudbounding_box_points[0.8, 2]

import numpy as np
import open3d as o3d
import math
import itertools

if __name__ == '__main__':
    # Read point cloud:
    pcd = o3d.io.read_point_cloud("../data/depth_2_pcd.ply")

    # Create bounding box:
    bounds = [[-math.inf, math.inf], [-math.inf, math.inf], [0.8, 2]]  # set the bounds
    bounding_box_points = list(itertools.product(*bounds))  # create limit points
    bounding_box = o3d.geometry.AxisAlignedBoundingBox.create_from_points(
        o3d.utility.Vector3dVector(bounding_box_points))  # create bounding box object

    # Crop the point cloud using the bounding box:
    pcd_croped = pcd.crop(bounding_box)

    # Display the cropped point cloud:
    o3d.visualization.draw_geometries([pcd_croped])

生成的点云如下所示:

 
灰色:输入点云。绿色:生成的点云

 

 

2.3 下采样

        下采样点云包括减少点数。例如,它通常用于减少处理步骤的运行时间或选择确切数量的点进行训练。

        Open3D 库提供了三种不同的方法来降低采样点云:

  • random_down_sample(pcd, sampling_ratio):从输入点云中选择随机点。它可用于数据增强,因为每次都会选择不同的点。但是,它对噪音很敏感:可以选择它。n*sampling_ratiopcd
  • uniform_down_sample(every_k_points):根据点的顺序统一选择点。它在每个点选择一个点。始终选择第一个点(标记为 0)。因此,所选点的索引为:0、、2 * 等。如果输入点云是有组织的,则该函数返回均匀的点云;否则,它类似于第一种方法,只是每次都生成相同的输出。every_k_pointsevery_k_pointsevery_k_points
  • voxel_down_sample(voxel_size):创建 3D 体素网格。体素格网将输入划分为一组××体素。每个体素都包含属于 3 个轴的相同间隔的点。然后对属于同一体素的点进行下采样并替换为其质心。此过滤器用于减小点云的大小并使其平滑。但是,这很耗时,因为它在将点云重组为体素后计算质心,并且对异常值很敏感。voxel_sizevoxel_sizevoxel_size

现在,让我们测试所有这些方法并显示生成的点云。为了获得更好的可视化效果,我们分别设置为 、to 和 for 和 。最后,我们应用平移在同一窗口中分别显示所有点云。sampling_ratio0.005every_k_points200voxel_size0.4random_down_sampleuniform_down_samplevoxel_down_sample

import open3d as o3d
import numpy as np

if __name__ == '__main__':
    # Read point cloud:
    pcd = o3d.io.read_point_cloud("../data/depth_2_pcd.ply")

    # Random down-sampling:
    random_pcd = pcd.random_down_sample(sampling_ratio=0.005)

    # Uniform down-sampling:
    uniform_pcd = pcd.uniform_down_sample(every_k_points=200)

    # Voxel down-sampling:
    voxel_pcd = pcd.voxel_down_sample(voxel_size=0.4)

    # Translating point clouds:
    points = np.asarray(random_pcd.points)
    points += [-3, 3, 0]
    random_pcd.points = o3d.utility.Vector3dVector(points)

    points = np.asarray(uniform_pcd.points)
    points += [0, 3, 0]
    uniform_pcd.points = o3d.utility.Vector3dVector(points)

    points = np.asarray(voxel_pcd.points)
    points += [3, 3, 0]
    voxel_pcd.points = o3d.utility.Vector3dVector(points)

    # Display:
    o3d.visualization.draw_geometries([pcd, random_pcd, uniform_pcd, voxel_pcd])

有组织的点云下采样。上图:输入点云。向下,从左到右:随机下采样、均匀下采样和基于体素的下采样。

 

         请注意,该方法生成的点云均匀分布在 3D 空间中。这是因为输入是一个有组织的点云(点在列表中组织)。uniform_down_sample

让我们通过洗牌前一个点云的点来创建无组织的点云,如下所示:

points = np.asarray(pcd.points)
np.random.shuffle(points)
u_pcd= o3d.geometry.PointCloud()
u_pcd.points= o3d.utility.Vector3dVector(points)

        然后与前面的示例类似,我们应用不同的下采样方法并显示结果。可视化窗口如下所示:u_pcd

 
 无组织的点云下采样。上图:输入点云。向下,从左到右:随机下采样、均匀下采样和基于体素的下采样。

 

         在这里,该方法得到的点云在3D空间中分布不均匀。它看起来更像是随机下采样,因为这些点是无组织的。但是,返回相同的点云,因为它将点重组为 3D 网格。uniform_down_samplevoxel_down_sample

2.4. 异常值去除过滤器

  • 半径异常值移除是一种条件过滤器,用于移除给定半径的球体内相邻点数少于给定数量的每个点。Open3D 提供了以下方法:remove_radius_outlier(nb_points, radius)

nb_points是邻居的数量。

radius是球体半径。

返回:过滤点云的元组和内变量索引的列表。

  • 统计异常值移除过滤器可移除距离其相邻点较远的点。对于每个点,计算从它到其所有相邻点的平均距离。然后,如果点的平均距离超出由全局距离平均值和标准差定义的区间,则该点是异常值。Open3D 提供了以下方法: [2]:remove_statistical_outliers(nb_neighbors, std_ratio)

nb_neighbors是邻居的数量。

std_ratio是标准偏差比。

返回:过滤点云的元组和内变量索引的列表。

让我们测试这两种方法并显示生成的点云。为了减少运行时间,我们首先应用下采样。应用异常值去除过滤器后,我们使用 .我们设置反转索引的选择。select_by_index(index, invert)invertTrue

import open3d as o3d
import numpy as np

if __name__ == '__main__':
    # Read point cloud:
    pcd = o3d.io.read_point_cloud("../data/depth_2_pcd.ply")
    # Down sampling to reduce the running time:
    pcd = pcd.voxel_down_sample(voxel_size=0.02)

    # Radius outlier removal:
    pcd_rad, ind_rad = pcd.remove_radius_outlier(nb_points=16, radius=0.05)
    outlier_rad_pcd = pcd.select_by_index(ind_rad, invert=True)
    outlier_rad_pcd.paint_uniform_color([1., 0., 1.])

    # Statistical outlier removal:
    pcd_stat, ind_stat = pcd.remove_statistical_outlier(nb_neighbors=20,
                                                 std_ratio=2.0)
    outlier_stat_pcd = pcd.select_by_index(ind_stat, invert=True)
    outlier_stat_pcd.paint_uniform_color([0., 0., 1.])

    # Translate to visualize:
    points = np.asarray(pcd_stat.points)
    points += [3, 0, 0]
    pcd_stat.points = o3d.utility.Vector3dVector(points)

    points = np.asarray(outlier_stat_pcd.points)
    points += [3, 0, 0]
    outlier_stat_pcd.points = o3d.utility.Vector3dVector(points)

    # Display:
    o3d.visualization.draw_geometries([pcd_stat, pcd_rad, outlier_stat_pcd, outlier_rad_pcd])

点云异常值去除。左:半径滤波器。右:统计过滤器。

三、 结论

        为此,我们引入了最著名的点云过滤器。这些过滤器在 Open3D 中实现。它们也在其他一些点云库中实现,例如 PCL。在大多数实时应用中,尤其是对于密集点云,需要过滤和减小点云的大小。下一个教程将讨论点云分割。您将看到,您可以仅使用一些Python库来简单地执行此操作。

四、引用

[1]open3d.geometry.crop_point_cloud

[2]open3d.geometry.PointCloud — Open3D 0.17.0 documentation

柴玛·扎特

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集

Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集 前言相关介绍COCO格式实例分割数据集转换为YOLO格式实例分割数据集coco格式对应的json文件,以test.json为例格式转换代码,内容如下 前言 由于本人水平有限,难免出现错漏&#xf…

【JAVASE】什么是方法

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈Java 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 方法 1. 方法概念及使用1.1 什么是方法1…

Vue『卡片拖拽式课程表』

Vue『卡片拖拽式课程表』 概述 在本篇技术博客中,我们将介绍一个使用Vue实现的『卡片拖拽式课程表』。这个课程表允许用户通过拖拽课程卡片来安排不同的课程在时间表上的位置。我们将逐步讲解代码实现,包括课程表的布局、拖拽功能的实现,以…

6G内存运行Llama2-Chinese-7B-chat模型

6G内存运行Llama2-Chinese-7B-chat模型 Llama2-Chinese中文社区 第一步: 从huggingface下载 Llama2-Chinese-7b-Chat-GGML模型放到本地的某一目录。 第二步: 执行python程序 git clone https://github.com/Rayrtfr/llama2-webui.gitcd llama2-web…

QtC++ 技术分析3 - IOStream

目录 iostreamscanf/printfiostream 整体架构流相关类流缓冲区 模板特化后整体结构文件流文件流对象创建常见文件流操作输出格式设定文件流状态 字符串流字符串流内部缓冲区字符串流使用 流缓冲区用户自定义 IO iostream scanf/printf 几种常见的输入输出流函数 scanf 从键盘…

操作系统4

文件管理 文件的逻辑结构 文件的目录 文件的物理结构 文件存储空间管理 文件的基本操作

【深度学习】以图搜索- 2021sota repVgg来抽取向量 + facebook的faiss的做特征检索, 从环境搭建到运行案例从0到1

文章目录 前言安装小试牛刀用repVgg抽取向量构建Faiss索引进行相似性搜索项目延伸总结 前言 Faiss的全称是Facebook AI Similarity Search。 这是一个开源库,针对高维空间中的海量数据,提供了高效且可靠的检索方法。 暴力检索耗时巨大,对于…

Mac下certificate verify failed: unable to get local issuer certificate

出现这个问题,可以安装证书 在finder中查找 Install Certificates.command找到后双击,或者使用其他终端打开 安装完即可

tcp三次握手python实现和结果

下载抓包工具 安装 使用1 使用2 结果 红色笔为想要发送的数据。 代码 from scapy.all import * import logginglogging.getLogger(scapy.runtime).setLevel(logging.ERROR)target_ip = 172.20.211.4 target_port = 80 data = GET / HTTP/1.0 \r\n\r\ndef start_tcp(target_…

Mac代码编辑器sublime text 4中文注册版下载

Sublime Text 4 for Mac简单实用功能强大,是程序员敲代码必备的代码编辑器,sublime text 4中文注册版支持多种编程语言,包括C、Java、Python、Ruby等,可以帮助程序员快速编写代码。Sublime Text的界面简洁、美观,支持多…

上传图片到腾讯云对象存储桶cos 【腾讯云对象存储桶】【cos】【el-upload】【vue3】【上传头像】【删除】

1、首先登录腾讯云官网控制台 进入对象存储页面 2、找到跨越访问CIRS设置 配置规则 点击添加规则 填写信息 3、书写代码 这里用VUE3书写 第一种用按钮出发事件形式 <template><div><input type"file" change"handleFileChange" /><…

【设计模式】详解观察者模式

文章目录 1、简介2、观察者模式简单实现抽象主题&#xff08;Subject&#xff09;具体主题&#xff08;ConcreteSubject&#xff09;抽象观察者&#xff08;Observer&#xff09;具体观察者&#xff08;ConcrereObserver&#xff09;测试&#xff1a; 观察者设计模式优缺点观察…

DataEase开源BI工具安装_数据全量_增量同步_大屏拖拽自动生成_多数据源支持_数据血缘分析---大数据工作笔记0183

我这里用的是Centos7.9安装的 可以通过uname -p来查看一下我们的电脑架构,可以看到是x86_64架构的 我们下第一个,这个是x86架构的,第二个arm架构的 然后解压到/opt/module中 然后再去重命名一下文件夹. 推荐200G 本地模式的功能比较多 推荐100G

【FPGA IP系列】FIFO的通俗理解

FPGA厂商提供了丰富的IP核&#xff0c;基础性IP核都是可以直接免费调用的&#xff0c;比如FIFO、RAM等等。 本文主要介绍FIFO的一些基础知识&#xff0c;帮助大家能够理解FIFO的基础概念。 一、FIFO介绍 FIFO全称是First In First Out&#xff0c;即先进先出。 FIFO是一个数…

C语言第十一课--------操作符的使用与分类-------基本操作

作者前言 作者介绍&#xff1a; 作者id&#xff1a;老秦包你会&#xff0c; 简单介绍&#xff1a; 喜欢学习C语言和python等编程语言&#xff0c;是一位爱分享的博主&#xff0c;有兴趣的小可爱可以来互讨 个人主页::小小页面 gitee页面:秦大大 一个爱分享的小博主 欢迎小可爱们…

7.27 作业 QT

要求&#xff1a; 结果图&#xff1a; clock.pro: QT core gui QT texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated …

算法与数据结构(四)--排序算法

一.冒泡排序 原理图&#xff1a; 实现代码&#xff1a; /* 冒泡排序或者是沉底排序 *//* int arr[]: 排序目标数组,这里元素类型以整型为例; int len: 元素个数 */ void bubbleSort (elemType arr[], int len) {//为什么外循环小于len-1次&#xff1f;//考虑临界情况&#xf…

Power BI-云端报表定时刷新--ODBC、MySQL、Oracle等其他本地数据源的刷新(二)

ODBC数据源 一些小众的数据源无法直接连接&#xff0c;需要通过微软系统自带的应用“ODBC数据源”连接。 1.首次使用应安装对应数据库的ODBC驱动程序&#xff0c;Mysql的ODBC驱动需要手动安装 2.在web服务中进行数据源的配置 Mysql数据源 1.Powerbi与Gateway第一次连SQL…

Ansible安装部署与应用

文章目录 一、ansible简介二、ansible 环境安装部署三、ansible 命令行模块3.1 command 模块3.2 shell 模块3.3 cron 模块3.4 user 模块3.5 group 模块3.6 copy 模块3.7 file 模块3.8 hostname 模块3.9 ping 模块3.10 yum 模块3.11 service/systemd 模块3.12 script 模块3.13 m…

Staples Drop Ship EDI 需求分析

Staples 是一家美国零售公司&#xff0c;总部位于马萨诸塞州弗拉明汉&#xff0c;主要提供支持工作和学习的产品和服务。该公司于 1986 年在马萨诸塞州布莱顿开设了第一家门店。到 1996 年&#xff0c;该公司已跻身《财富》世界 500 强&#xff0c;后来又收购了办公用品公司 Qu…