Open3D KDtree的建立与使用

news2024/9/19 10:46:49

目录

一、概述

1.1kd树原理

1.2kd树搜索原理

1.3kd树构建示例

二、常见的领域搜索方式

2.1K近邻搜索(K-Nearest Neighbors, KNN Search)

2.2半径搜索(Radius Search)

2.3混合搜索(Hybrid Search)

三、代码实现

3.1关键函数

3.1.1K近邻搜索

3.1.2半径邻域搜索

3.1.3混合搜索

3.2完整代码

四、实现效果


一、概述

1.1kd树原理

        KD树(K-Dimensional Tree)是一种用于组织k维空间数据的树状数据结构,特别适用于多维空间中的最近邻搜索和范围搜索KD树通过递归地将空间划分为较小的子空间,从而实现高效的空间查询。

KD树的构建原理:

  1. 选择分割维度从数据集中选择一个维度进行分割。通常选择当前维度上的方差最大的维度,以最大化分割的效果。这可以帮助平衡树的结构。
  2. 选择分割点:在选择的分割维度上选择中位数作为分割点。中位数确保每次分割后,两个子空间包含的点数大致相等,从而保持树的平衡。
  3. 递归构建子树:对于每个子集,递归地选择新的分割维度和分割点,直到达到某个终止条件,例如节点包含的点数小于某个阈值或树的深度达到预定值。

1.2kd树搜索原理

1.最近邻搜索:

  • 从根节点开始,根据查询点在当前分割维度上的值,递归地搜索子树,直到到达叶节点。
  • 在回溯过程中,检查当前节点是否比已知的最近邻更近,如果是,则更新最近邻。
  • 还需检查当前节点的另一子树是否可能包含更近的点,如果可能,则进行搜索。

2.范围搜索:

  • 类似于最近邻搜索,通过比较查询点与分割点的关系,递归地搜索子树,检查节点是否在查询范围内。


1.3kd树构建示例

我们将使用以下点构建一个KD树:

A(2,3), B(5,4), C(9,6), D(4,7), E(8,1), F(7,2)

第一层:

  • 选择 x 轴进行分割。
  • 选择 x 轴上的中位数作为分割点,这里是点 D(4,7)。
                D(4,7)
               /      \

第二层:

  • 对于左子树,选择 y 轴进行分割。
  • 左子树的点为 A(2,3) 和 B(5,4),选择 y 轴上的中位数点 A(2,3) 作为分割点。
  • 对于右子树,选择 y 轴进行分割。
  • 右子树的点为 C(9,6), E(8,1) 和 F(7,2),选择 y 轴上的中位数点 F(7,2) 作为分割点。
                D(4,7)
               /      \
          A(2,3)     F(7,2)
             \       /    \
            B(5,4) E(8,1) C(9,6)

第三层:

  • 对于左子树的右子树,选择 x 轴分割。
  • 对于右子树的左右子树,选择 x 轴分割。

最终构建的KD树结构如下:

                D(4,7)
               /      \
          A(2,3)     F(7,2)
             \       /    \
            B(5,4) E(8,1) C(9,6)

二、常见的领域搜索方式

2.1K近邻搜索(K-Nearest Neighbors, KNN Search)

K近邻搜索是找到离查询点最近的K个点的一种方法。K近邻搜索基于欧几里得距离度量,通过KD树可以高效地实现。

过程:

  • 从根节点开始,根据查询点在当前分割维度上的值,递归地搜索子树,直到到达叶节点。
  • 在回溯过程中,检查当前节点是否比已知的K个最近邻点更近,如果是,则更新最近邻集合。
  • 还需检查当前节点的另一子树是否可能包含更近的点,如果可能,则进行搜索。

应用:

  • 数据分类:KNN算法在分类问题中广泛应用,通过查找最近的K个邻居进行多数投票决定分类结果。
  • 数据降噪:可以通过找到每个点的K个最近邻来平滑数据。

2.2半径搜索(Radius Search)

半径搜索是找到所有在查询点某个给定半径范围内的点的一种方法。与K近邻搜索不同,半径搜索返回的是所有在指定半径范围内的点。

过程:

  • 从根节点开始,根据查询点和分割点之间的距离,递归地搜索子树。
  • 检查当前节点是否在查询点的半径范围内,如果是,则将其加入结果集合。
  • 检查当前节点的另一子树是否可能包含在半径范围内的点,如果可能,则进行搜索。

应用:

  • 密度估计:通过找到某个区域内的所有点,可以估计该区域的点云密度。
  • 空间聚类:在聚类算法中,半径搜索用于找到每个点的邻域,从而进行聚类。

2.3混合搜索(Hybrid Search)

混合搜索结合了K近邻搜索和半径搜索的特点,在进行K近邻搜索的同时,还限制了搜索范围在一个给定的半径内。也就是说,它在指定半径范围内找到最多K个最近的点。

过程:

  • 从根节点开始,根据查询点在当前分割维度上的值和半径约束,递归地搜索子树,直到到达叶节点。
  • 检查当前节点是否在查询点的半径范围内,并且是否属于最近的K个点,如果是,则将其加入结果集合。
  • 检查当前节点的另一子树是否可能包含在半径范围内并且属于最近的K个点,如果可能,则进行搜索。

应用:

  • 提高搜索效率:在处理大规模点云数据时,混合搜索可以限制搜索范围,从而提高搜索效率。
  • 平衡搜索结果:混合搜索可以在保证结果精确度的同时,限制搜索范围,避免返回过多不相关的点。

三、代码实现

3.1关键函数

3.1.1K近邻搜索

 search_knn_vector_3d返回查询点的k个最近邻的索引列表。这些相邻的点存储在数组numpy中,使用pcd.colors对numpy数组内所有的点进行颜色渲染(渲染为绿色[0,1,0])。这里跳过了第一个索引点,因为它是查询点本身

#K近邻搜索
pcd.colors[10000] = [1, 0, 0]#给定查询点并渲染为红色
[k, idx, _] = pcd_tree.search_knn_vector_3d(pcd.points[10000], 200)#K近邻搜索
np.asarray(pcd.colors)[idx[1:], :] = [0, 1, 0]#K邻域的点,渲染为绿色

3.1.2半径邻域搜索

  使用 search_radius_vector_3d查询所有的和查询点点距离小于给定半径的点

#半径搜索
pcd.colors[5000] = [1, 0, 0]#给定查询点并渲染为红色
[k1, idx1, _] = pcd_tree.search_radius_vector_3d(pcd.points[5000], 0.02)#半径搜索
np.asarray(pcd.colors)[idx1[1:], :] = [0, 0, 1]#半径搜索结果并渲染为蓝色

3.1.3混合搜索

除了KNN搜索(search_knn_vector_3d)和RNN搜索(search_radius_vector_3d)以外,Open3d还提供了混合搜索函数(search_hybrid_vector_3d)。它最多返回K个和查询点距离小于给定半径的最邻近点。这个函数结合了KNN和RNN的搜索条件,在某些文献中也被称作RKNN搜索。在许多情况下它有着性能优势,并且在Open3d的函数中大量的使用.

#混合搜索
pcd.colors[30000] = [1, 1, 0]#给定查询点并渲染为黄色
[k2, idx2, _] = pcd_tree.search_hybrid_vector_3d(pcd.points[30000], 0.05,200)#K近邻搜索
np.asarray(pcd.colors)[idx2[1:], :] = [0, 1, 0.8]#半径搜索结果并渲染为青色

3.2完整代码

import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud("Horse.pcd")
pcd.paint_uniform_color([0.5, 0.5, 0.5])#把所有点渲染为灰色
pcd_tree = o3d.geometry.KDTreeFlann(pcd)#建立KD树索引

#K近邻搜索
pcd.colors[10000] = [1, 0, 0]#给定查询点并渲染为红色


[k, idx, _] = pcd_tree.search_knn_vector_3d(pcd.points[10000], 200)#K近邻搜索
np.asarray(pcd.colors)[idx[1:], :] = [0, 1, 0]#K邻域的点,渲染为绿色

#半径搜索
pcd.colors[5000] = [1, 0, 0]#给定查询点并渲染为红色
[k1, idx1, _] = pcd_tree.search_radius_vector_3d(pcd.points[5000], 0.02)#半径搜索
np.asarray(pcd.colors)[idx1[1:], :] = [0, 0, 1]#半径搜索结果并渲染为蓝色

#混合搜索
pcd.colors[30000] = [1, 1, 0]#给定查询点并渲染为黄色
[k2, idx2, _] = pcd_tree.search_hybrid_vector_3d(pcd.points[30000], 0.05,200)#K近邻搜索
np.asarray(pcd.colors)[idx2[1:], :] = [0, 1, 0.8]#半径搜索结果并渲染为青色
o3d.visualization.draw_geometries([pcd])

四、实现效果

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

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

相关文章

STM32F446RE实现多通道ADC转换功能实现(DMA)

目录 概述 1 软硬件介绍 1.1 软件版本 1.2 ADC引脚介绍 2 STM32Cube配置项目 2.1 配置基本参数 2.2 ADC通道配置 2.3 DMA通道配置 3 项目代码介绍 3.1 自生成代码 3.2 ADC-DMA初始化 3.3 测试函数 3.4 ADC1、ADC2、ADC3轮询采集数据存贮格式 4 测试 源代码下载地…

clickhouse学习笔记(五)SQL操作

目录 一、增 二、删改 三、查询以及各种子句 1、with子句 a、表达式为常量 b、表达式为函数调用 c、表达式为子查询 2、from子句 3、array join子句 a、INNER ARRAY JOIN b、LEFT ARRAY JOIN c、数组的一些函数 groupArray groupUniqArray arrayFlatten splitBy…

小米订单锐减背后的挑战与应对之道

近期,富士康印度子公司Bharat FIH面临高管离职、工厂关闭的困境,其背后原因之一是小米订单的显著下滑,据报道,这一降幅高达70%。这一现象不仅反映了富士康在印度市场的艰难处境,也揭示了小米在全球智能手机市场面临的挑…

Atom CMS v2.0 SQL 注入漏洞(CVE-2022-24223)

前言 概要 CVE-2022-24223 是一个发现于 Atom CMS v2.0 中的 SQL 注入漏洞。该漏洞存在于 /admin/login.php 文件中,通过该文件,攻击者可以在未经身份验证的情况下执行任意的 SQL 命令。 漏洞描述 该漏洞位于 Atom CMS 的管理员登录页面(/a…

甄选范文“论区块链技术及应用”,软考高级论文,系统架构设计师论文

论文真题 区块链作为一种分布式记账技术,目前已经被应用到了资产管理、物联网、医疗管理、政务监管等多个领域。从网络层面来讲,区块链是一个对等网络(Peer to Peer, P2P),网络中的节点地位对等,每个节点都保存完整的账本数据,系统的运行不依赖中心化节点,因此避免了中…

跨境电商代购系统与电商平台API结合的化学反应

随着全球化的不断推进和互联网技术的飞速发展,跨境电商已成为国际贸易的重要组成部分。跨境电商代购系统作为连接国内外消费者与商品的桥梁,不仅为消费者提供了更多元化的购物选择,也为商家开辟了更广阔的市场空间。在这一过程中,…

数据结构——顺序表(java实现)

文章目录 顺序表顺序表的定义代码实现:创建一个顺序表的类在顺序表中增加一条新的数据展示顺序表中内容在pos位置处插入一条数据判断顺序表中是否包含指定的数据查找某个数据在顺序表中的位置获取pos位置的元素将pos位置的元素改为value删除顺序表中第一个出现的数据…

搭建基础库~

前言 项目中会用到工具库、函数库以及一些跟框架绑定的组件,如果这些基础模块每个项目都实现一套,维护起来那真的头大,你说呢😉 搭建流程 准备工作 创建文件夹myLib、安装Git以及pnpm 目录大概就系这样子: myLib ├…

从零开始做题:好怪哦

题目 给出一个压缩文件 解题 方法1 01Edit打开,发现是个反着的压缩包(末尾倒着的PK头) import os# 目标目录路径 # target_directory /home/ai001/alpaca-lora# 切换到目标目录 # os.chdir(target_directory)# 打印当前工作目录以确认…

# Redis 入门到精通(一)数据类型(1)

Redis 入门到精通(一)数据类型(1) 一 、Redis 入门到精通 基本介绍 1、Redis 基础 ( windows 环境 ) redis 入门数据类型通用命令Jedis 2、Redis 高级 ( linux 环境 ) 持久化redis.conf 配置事务集群 3、Redis 应用 ( linux…

WAIC | 2024年世界人工智能大会“数学与人工智能”学术会议成功举办!

由斯梅尔数学与计算研究院(Smale Institue of Mathematics & Computation)主办的2024年世界人工智能大会(WAIC)“数学与人工智能”学术会议7月4日在上海世博中心圆满落幕!作为全球性高级别学术研讨会,此次会议由华院计算技术&…

SQLServer的系统数据库用别的服务器上的系统数据库替换后做跨服务器连接时出现凭证、非对称金钥或私密金钥的资料无效

出错作业背景: 公司的某个sqlserver服务器要做迁移,由于该sqlserver服务器上数据库很多,并且做了很多的job和维护计划,重新安装的sqlserver这些都是空的,于是就想到了把系统4个系统数据库进行替换,然后也把…

Camera Raw:裁剪

Camera Raw 的裁剪 Crop面板提供了裁剪、旋转、翻转、拉直照片等功能,通过它们可以更精确地调整照片的视角和范围,以达到最佳二次构图的视觉效果。 快捷键:C ◆ ◆ ◆ 使用方法与技巧 1、使用预设 选择多种裁剪预设(如 1:1、16:…

JAVA基础-----128陷阱

一、何为128陷阱 Java中Integer类型在使用比较时的特殊行为------128陷阱,解释了当数值在-128到127范围内,由于valueOf方法的缓存机制导致地址相同,比较为真;超出这个范围则新分配内存,地址不同,比较为假。…

YOLOv10改进 | 主干篇 | 低照度增强网络PE-YOLO改进主干(改进暗光条件下的物体检测模型)

一、本文介绍 本文给大家带来的改进机制是低照度图像增强网络PE-YOLO中的PENet,PENet通过拉普拉斯金字塔将图像分解成多个分辨率的组件,增强图像细节和低频信息。它包括一个细节处理模块(DPM),用于通过上下文分支和边…

数据链路层(超详细)

引言 数据链路层是计算机网络协议栈中的第二层,位于物理层之上,负责在相邻节点之间的可靠数据传输。数据链路层使用的信道主要有两种类型:点对点信道和广播信道。点对点信道是指一对一的通信方式,而广播信道则是一对多的通信方式…

办公必备——ONLYOFFICE8.1版本桌面编辑器

一、介绍ONLYOFFICE ONLYOFFICE是一款免费的开源办公软件,它可以让你创建、编辑和分享文档、表格和演示文稿。就像微软的Office一样,但它是完全免费的,而且可以在多种设备上使用,包括电脑和手机。它还支持多人同时在线编辑文档&am…

Golang | Leetcode Golang题解之第223题矩形面积

题目: 题解: func computeArea(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2 int) int {area1 : (ax2 - ax1) * (ay2 - ay1)area2 : (bx2 - bx1) * (by2 - by1)overlapWidth : min(ax2, bx2) - max(ax1, bx1)overlapHeight : min(ay2, by2) - max(ay1, by1)…

独立开发者系列(22)——API调试工具apifox的使用

接口的逻辑已经实现,需要对外发布接口,而发布接口的时候,我们需要能自己简单调试接口。当然,其实自己也可以写简单的代码调试自己的接口,因为其实就是简单的request请求或者curl库读取,调整请求方式get或者…

第11章 规划过程组(二)(11.10制订进度计划)

第11章 规划过程组(二)11.10制订进度计划,在第三版教材第395~397页;文字图片音频方式 第一个知识点:定义及作用 分析活动顺序、持续时间、资源需求和进度制约因素,创建项目进度模型,从而落实项目…