KdTree聚类算法

参考博客:https://blog.csdn.net/zhubaohua_bupt/article/details/70194047

第一种方法叫做密度减法聚类
功能:能识别特定尺寸的点云簇集合,通过参数设置期望形状的大小。
输入:一片点云
输出:是几个聚类完成的点簇和聚类中心点
类别不需要提前设定,最终聚成几类由初始参数决定。
论文  3D Candidate Selection Method for Pedestrian Detection on Non-Planar Roads 用其来提取行人的ROI。

第二种方法叫做自适应密度聚类
功能:可以寻找出每个点云的三维连通域,不需要设置形状和大小参数。
输入:一片点云
输出:每个点云所在的连通域以及此点云集合一共有多少连通域。
类别不需要提前设定,最终聚成几类由连通规则中参数决定。
论文 一种聚类与滤波融合的点云去噪平滑方法  和  密度聚类算法在连续分布点云去噪中的应用 用这种聚类方法来对点云去噪。

下面只介绍自适应密度聚类,用于定位面积变化的物体

这种方法就是实际上就是三维连通域检测。聚类最后的输出是若干块三维连通域。和上一种方法不一样,这种聚类方法不需要设置新装参数,输出的每块连通域的大小不一定相等。下面给出这种 方法的流程图:

                                     

图 4  自适应密度聚类算法流程

此算法寻找连通域的步骤对应于流程图的第二至第三个判断条件组成的循环体。每循环一次,生成一个新的三维连通域。

密度定义 :此方法没有对密度定义,而是定义了一个类似密度的核心对象:是在点云空间范围内,如果离点p的欧式距离小于e的其他点云数大于一个值Minpts,就认为点p是核心对象。

那么为什么称这种方法叫自适应密度聚类呢?

答案是,聚类它可以根据点云自适应求出半径参数e和点数Minpts,不需要自己提前设定,当然自己也可以提前设定。

怎么求参数e和Minpts呢?

引用原文的话:


在上述密度聚类步骤中,初始半径e 和最小邻域数MinPts均为自定义参数。参数初始值设置好后,需要根据聚类效果不断调整这两个参数以获得最好的聚类效果,比较耗时。为了解决这一问题,本文提出一种自适应参数计算方法。

                                                                                         (1)

【1】首先,根据式(1) 计算任意两点之间的欧式距离1。

然后根据式( 2)-式( 3) 求得dist(i,j ) 的最大值maxdist 和最小值mindist。axdist = Max{dist( i,j)| 0 ≤ i < n,0 ≤ j < n}                    ( 2)

                                                                      mindist = Min{dist( i,j )| 0 ≤ i < n,0 ≤ j < n}                  ( 3)

【2】进而根据式( 4) 求得距离间隔distrange。

                                                                      distrange = maxdist -mindist                                            ( 4)

其中,n 表示点的数目。将距离间隔等距分为十段,统计dist(i,j)在每段范围内的频数,初始半径e 的值即为erang 所在分段的中值。erang 的计算公式如式( 5)所示。

                                                                       erang = Max{pk | 0 ≤ k < 10}                                            (5)

【3】初始半径e 确定后,根据e 逐步增大最小邻域数目MinPts,计算邻域超过最小邻域数目的点的数目pNum(计算公式如式( 7)所示) 。随着最小邻域数目的增加,pNum 会逐渐减少并趋于稳定,选择拐点所在的最小邻域数目作为MinPts。其中,对于任意给定点p 的邻域点数目pNumi的计算如式( 6)所示。

                                                                       pNumi = count{dist( i,j)< e | 0 ≤ j < n}                           ( 6)

那么:                                                               pNum = count{ pNumi ≥ MinPts |0 ≤ i < n}                       ( 7)

通过该方法可以实现初始半径和最小邻域数的自动选择,进而避免这两个参数的反复设置。

猜你喜欢

转载自www.cnblogs.com/2Bthebest1/p/10909177.html