介绍

通过雷达、激光扫描、立体摄像机等三维测量设备获取的点云数据,具有数据量大、分布不均匀等特点。作为三维领域中一个重要的数据来源,点云数据主要是表征目标表面的海量点的集合,并不具备传统实体网格数据的几何拓扑信息。所以点云数据处理中最为核心的问题就是建立离散点间的拓扑关系,实现基于邻域关系的快速查找。

概念

KD-Tree 是一棵二叉搜索树。与普通的二叉搜索树一样,它具有左儿子比父亲小,右儿子比父亲大的特点。但是,比较点的大小是没有实际意义的,因此,KD-Tree并不是整体比较点的大小,而是比较某一维的大小。

如何构造一棵Kd-tree?

对于Kd-tree这样一棵二叉树,我们首先须要确定如何划分左子树和右子树。即一个K维数据是根据什么被划分到左子树或右子树的。

在构造1维BST树时,一个1维数据依据其与树的根结点和中间结点进行大小比較的结果来决定是划分到左子树还是右子树。同理。我们也能够依照这种方式,将一个K维数据与Kd-tree的根结点和中间结点进行比較。仅仅只是不是对K维数据进行总体的比較,而是选择某一个维度Di。然后比較两个K维数在该维度Di上的大小关系。即每次选择一个维度Di来对K维数据进行划分,相当于用一个垂直于该维度Di的超平面将K维数据空间一分为二。平面一边的全部K维数据在Di维度上的值小于平面还有一边的全部K维数据相应维度上的值。也就是说。我们每选择一个维度进行如上的划分,就会将K维数据空间划分为两个部分。假设我们继续分别对这两个子K维空间进行如上的划分。又会得到新的子空间,对新的子空间又继续划分,反复以上过程直到每一个子空间都不能再划分为止。以上就是构造Kd-Tree的过程,上述过程中涉及到两个重要的问题:1)每次对子空间的划分时。如何确定在哪个维度上进行划分;2)在某个维度上进行划分时,如何确保在这一维度上的划分得到的两个子集合的数量尽量相等。即左子树和右子树中的结点个数尽量相等。

每次对子空间的划分时,如何确定在哪个维度上进行划分?

最简单的方法就是轮着来,即假设这次选择了在第i维上进行数据划分,那下一次就在第j(j≠i)维上进行划分,比如:j = (i mod k) + 1。想象一下我们切豆腐时,先是竖着切一刀,切成两半后。再横着来一刀,就得到了非常小的方块豆腐。但是“轮着来”的方法能否够非常好地解决这个问题呢?再次想象一下,我们如今要切的是一根木条,依照“轮着来”的方法先是竖着切一刀,木条一分为二。干净利落,接下来就是再横着切一刀。这个时候就有点考验刀法了,假设木条的直径(横截面)较大,还能够下手,假设直径较小,就没法往下切了。

因此。假设K维数据的分布像上面的豆腐一样,“轮着来”的切分方法是能够奏效。但是假设K维度上数据的分布像木条一样。“轮着来”就不好用了。因此,还须要想想其它的切法。

假设一个K维数据集合的分布像木条一样。那就是说明这K维数据在木条较长方向代表的维度上。这些数据的分布散得比较开,数学上来说,就是这些数据在该维度上的方差(invariance)比较大。换句话说,正由于这些数据在该维度上分散的比较开,我们就更easy在这个维度上将它们划分开。因此,这就引出了我们选择维度的还有一种方法:最慷慨差法(max invarince)。即每次我们选择维度进行划分时,都选择具有最慷慨差维度。

在某个维度上进行划分时。如何确保在这一维度上的划分得到的两个子集合的数量尽量相等。即左子树和右子树中的结点个数尽量相等?

如果当前我们依照最慷慨差法选择了在维度i上进行K维数据集S的划分,此时我们须要在维度i上将K维数据集合S划分为两个子集合A和B,子集合A中的数据在维度i上的值都小于子集合B中。首先考虑最简单的划分法,即选择第一个数作为比较对象(即划分轴。pivot),S中剩余的其它全部K维数据都跟该pivot在维度i上进行比较。如果小于pivot则划A集合。大于则划入B集合。

把A集合和B集合分别看做是左子树和右子树,那么我们在构造一个二叉树的时候,当然是希望它是一棵尽量平衡的树,即左右子树中的结点个数相差不大。

而A集合和B集合中数据的个数显然跟pivot值有关。由于它们是跟pivot比较后才被划分到对应的集合中去的。好了。如今的问题就是确定pivot了。给定一个数组。如何才干得到两个子数组,这两个数组包括的元素个数差点儿相同且当中一个子数组中的元素值都小于还有一个子数组呢?方法非常easy,找到数组中的中值(即中位数。median)。然后将数组中全部元素与中值进行比较,就能够得到上述两个子数组。相同,在维度i上进行划分时,pivot就选择该维度i上全部数据的中值。这样得到的两个子集合数据个数就基本相同了。

Kd-Tree的构建算法

  1. 在K维数据集合中选择具有最慷慨差的维度k,然后在该维度上选择中值m为pivot对该数据集合进行划分。得到两个子集合;同一时候创建一个树结点node,用于存储;
  2. 对两个子集合反复(1)步骤的过程,直至全部子集合都不能再划分为止。假设某个子集合不能再划分时,则将该子集合中的数据保存到叶子结点(leaf node)。

pcl学习之kd-tree相关推荐

  1. PCL点云库调库学习系列——k-d tree与八叉树

    k-d tree与八叉树 1 k-d tree与八叉树 本文并不涉及具体原理的解释,文章着重在k-d树与八叉树在近邻搜索方面的API的使用 1.1 k-d tree k-d tree算法及原理: ht ...

  2. PCL:k-d tree 1 讲解

    1.简介 kd-tree简称k维树,是一种空间划分的数据结构.常被用于高维空间中的搜索,比如范围搜索和最近邻搜索.kd-tree是二进制空间划分树的一种特殊情况.(在激光雷达SLAM中,一般使用的是三 ...

  3. PCL :K-d tree 2 结构理解

    K-d tree 基础思路:(先看之前的KNN思想,更容易理解) 导语:kd 树是一种二叉树数据结构,可以用来进行高效的 kNN 计算.kd 树算法偏于复杂,本篇将先介绍以二叉树的形式来记录和索引空间 ...

  4. K-D Tree 学习笔记

    K-D Tree 学习笔记 最近看了一下k-NN然后它说如果特征空间维数比较低的时候用K-D Tree来求k近邻比较快所以就来补一下学OI时没学的K-D Tree假装写一个学习笔记吧. 是什么? 是一 ...

  5. NLP学习—18.Annoy、HNSW、KD tree以及多轮对话

    文章目录 引言 一.Annoy 1.Annoy实战 二.HNSW 三.KD tree 1.Annoy与KD Tree比较 四.Dialog Management(任务型多轮对话) 引言   Annoy ...

  6. K-D Tree学习笔记

    引入 K-D Tree 是一种处理高维空间的数据结构. 支持O(nk−1k)O(n^{\frac {k-1}k})O(nkk−1​)查询给定超矩形内的点的信息, kkk 为维数. 可以用替罪羊树的思想 ...

  7. [学习笔记] 乱世之神杀疯了 —— K-D tree

    文章目录 K-D tree 建树 合并 插入 删除 查询(估价函数) 旋转坐标系 题目练习 [SDOI2012]最近最远点对 [Violet]天使玩偶/SJY摆棋子 [CQOI2016]K远点对 [国 ...

  8. PCL学习笔记(二):PCL官方教程学习

    PCL学习笔记(二):PCL官方教程学习 PCD文件制作 Features 表面法线提取 Keypoints 提取NARF关键点 KdTree Range Image How to create a ...

  9. PCL学习笔记(八)-- PCL实现快速邻域搜索

    一.简介 学习如何用k-d tree树找到具体点或空间位置的k近邻,然后学习如何找到用户指定的(本例中是随机的)某一半径内的所有近邻. Vector: C++标准库提供了被封装的动态数组--Vecto ...

  10. PCL学习笔记-PCL简介

    PCL(点云库)学习笔记 1.简介 点云数据的处理可以采用获得广泛应用的Point Cloud Library(点云库,PCL库). PCL库是一个最初发布于 2013年的开源c++库,它实现了大量点 ...

最新文章

  1. ubuntu 12.04安装 jdk
  2. smarty中如何统计数组的个数?
  3. git 放弃本地修改 强制更新
  4. 如何在python中对列表套列表进行排序_如何实现对Python中列表的排序?
  5. linux实时信号与sigqueue函数编程实例
  6. Codeforces Round #524 Div. 2 翻车记
  7. 冲啊电竞er,纵享游戏人生,你还需要一副索尼耳机!
  8. 6月首批国产游戏获批:共55款 腾讯B站上榜
  9. C++11 POD 类型
  10. Abaqus 两套常用单位
  11. 黑莓手机使用手册【转】
  12. Laravel文档梳理5、HTTP请求
  13. 提供风声无组件上传类V2.11下载 解决图片尺寸读取问题
  14. 算24(递归)--算法学习
  15. 计算机考研初试350分什么水平,考研分数,考研350分什么水平!
  16. CSDN - 盛洪宇(技术胖) - Vue2.x从入门到实战
  17. SSL/TLS、对称加密和非对称加密和TLSv1.3
  18. 0003-动态环境绿色公益环保宣传PPT模板免费下载
  19. sentinel dashboard扩展
  20. 浅析LUM及相关实验

热门文章

  1. python del 函数
  2. 【BZOJ1901】Zju2112 Dynamic Rankings 主席树+树状数组
  3. 关于UIScrollViewDelegate协议中每个回调函数的意义及执行
  4. django实例:创建你的第一个应用投票系统(3)后台管理
  5. 自定义函数:删除数组B中与数组A重复的值
  6. VC预定义常量WIN32、_WIN32、_WIN64分析(转载)
  7. 15. 链表中倒数第k个节点(C++版本)
  8. docker学习记录 docker 脚本----redis,zookeeper,kafka(三)
  9. 备份 虚拟机安装centos8 并配置部分开发环境(不用docker)
  10. nodejs npm和yarn 源管理模块 yrm(记录方便查看)