使用k-d树进行无序点云去噪

离散点云的点之间是没有拓扑结构的,因此为了找到它的几何属性,可以找到各点的邻域结构。对于采样点 piP 定义其邻域 Nkpi 为采样点 pi 的最近的 k 个采样点组成的集合,即K-nearest neighbors。
那么寻找K-nearest neighbours的方法主要由以下三种:
* 八叉树法
* 空间网格法
* k-d树法

一、八叉树法

(1)首先确定数据点集最小包围盒的边长 Lmin 作为递归的终止条件;
(2)把点云包围盒平均分成8个小的包围盒,对包含多个采样点的包围盒继续分割,直到达到递归的终止条件,分割过程用八叉树记录;
(3)广度遍历八叉树,利用数据点的空间分布与包围盒的空间关系,快速搜索出任意采样点 P 的邻域关系。

二、空间网格法

空间网格法也是基于对空间包围盒的划分,首先确定出包围盒的大小 {xmin,xmax,ymin,ymax,zmin,zmax} ,然后按照 X,Y,Z 方向上创建一系列的平行平面进行分割,这些平面把整个包围盒划分成多个小的包围盒,取各个小包围盒中最靠近该包围盒中心的点作为代表,表示整个包围盒中的数据。
这样不仅确定了空间结构,而且可以精化点云数据。

三、k-d树法

1、k-d树的构建过程

下面以构建二维空间的k-d树为例,介绍一种k-d树的生成的方法。
(1)首先按 X 轴的分割线对空间进行分割。计算所有点的 x 坐标的平均值,选择所有点中最接近平均值的点作为分割线,把空间中的点进行分割;
(2)对分隔好的空间按照 y 轴的分割线进行分割,分割过程同上。分割好后继续按 x 轴进行分割,依次类推,直到最终只剩每个空间中只有一个点结束分割。
这样的分割过程就对应于一个二叉树,每个分割线对应于一个分支,每个点对应于一个叶子节点。


使用k-d树进行无序点云去噪_第1张图片

2、k-d树的搜索过程

假设这里已经存在一棵已经建立好的二叉树,如下图所示:


使用k-d树进行无序点云去噪_第2张图片

这是对一组二维点集 {(2,3),(8,1),(9,6),(4,7),(7,2),(5,4)} 建立起的二叉树。
现在有一点 (2,4.5) ,需要查找它的最近邻点,查找方法如下所示。
(1)首先在建立好的k-d树上进行遍历,因为 (2,4.5) 的x坐标比7小,因此进入 (7,2) 的左子树,由因为 (2,4.5) 的纵坐标比4大,因此进入 (5,4) 的右子树,到达叶子节点 (4,7) ;
(2)计算 (2,4.5) (4,7) 的距离为3.202,现在假定 (4,7) 为最近邻点,进行回溯,计算 (2,4.5) (5,4) 的距离为3.041,则假定最近邻点为 (5,4) ;以 (2,4.5) 为圆心,以3.041为半径画一个圆,如下图所示:
使用k-d树进行无序点云去噪_第3张图片
可见该圆与 (5,4) 所在的分割线有交点,因此需要对 (5,4) 的左子树进行遍历,发现与 (2,3) 的距离为1.5。继续回溯,而以 (2,4.5) 为圆心,以1.5为半径画圆,与 (7,2) 所在的分割线没有交点,因此不需要对 (7,2) 的右子树进行遍历,如下图所示:
使用k-d树进行无序点云去噪_第4张图片
所以最终找的最近邻点为 (2,3) ,查找结束。
这里有一个博客对k-d树的建立与查找讲得很详细,我的例子就是参考的它的,感谢。
http://www.cnblogs.com/eyeszjwang/articles/2429382.html

四、根据k-d树进行无序点云去噪

(1)根据点云数据生成k-d树,建立点云的拓扑关系;
(2)查找任一点的的邻域;
(3)计算该点与邻域内各点的距离取平均值;
(4)判断该平均值是否超过阈值,若超过则判定该点为噪点,进行去除。

你可能感兴趣的:(三维重建,k-d树,点云去噪)