使用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轴进行分割,依次类推,直到最终只剩每个空间中只有一个点结束分割。 
这样的分割过程就对应于一个二叉树,每个分割线对应于一个分支,每个点对应于一个叶子节点。 


这里写图片描述 

2、k-d树的搜索过程

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


这里写图片描述 

这是对一组二维点集 {(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为半径画一个圆,如下图所示: 
这里写图片描述 
可见该圆与 (5,4)所在的分割线有交点,因此需要对 (5,4)的左子树进行遍历,发现与 (2,3)的距离为1.5。继续回溯,而以 (2,4.5)为圆心,以1.5为半径画圆,与 (7,2)所在的分割线没有交点,因此不需要对 (7,2)的右子树进行遍历,如下图所示: 
这里写图片描述 
所以最终找的最近邻点为 (2,3),查找结束。 
这里有一个博客对k-d树的建立与查找讲得很详细,我的例子就是参考的它的,感谢。 
http://www.cnblogs.com/eyeszjwang/articles/2429382.html

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

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

离散点云的点之间是没有拓扑结构的,因此为了找到它的几何属性,可以找到各点的邻域结构。对于采样点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轴进行分割,依次类推,直到最终只剩每个空间中只有一个点结束分割。 
这样的分割过程就对应于一个二叉树,每个分割线对应于一个分支,每个点对应于一个叶子节点。 


这里写图片描述 

2、k-d树的搜索过程

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


这里写图片描述 

这是对一组二维点集 {(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为半径画一个圆,如下图所示: 
这里写图片描述 
可见该圆与 (5,4)所在的分割线有交点,因此需要对 (5,4)的左子树进行遍历,发现与 (2,3)的距离为1.5。继续回溯,而以 (2,4.5)为圆心,以1.5为半径画圆,与 (7,2)所在的分割线没有交点,因此不需要对 (7,2)的右子树进行遍历,如下图所示: 
这里写图片描述 
所以最终找的最近邻点为 (2,3),查找结束。 
这里有一个博客对k-d树的建立与查找讲得很详细,我的例子就是参考的它的,感谢。 
http://www.cnblogs.com/eyeszjwang/articles/2429382.html

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

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

猜你喜欢

转载自blog.csdn.net/xs1997/article/details/78023623