点云滤波
- sor(statistical outlier removal): 对每个点的邻域进行一个统计分析,并修剪掉那些不符合一定标准的点。
- 对每个点计算它的k(超参数)临近点的平均距离。
- 假设得到的结果是一个高斯分布,其形状由均值和方差决定。
- 平均距离在标准范围之外,即超出平均距离的d(超参数)个标准差,则该点被标记为离群点。
- 直通滤波(pass through): 不在范围内的点过滤掉
- ror(radius outlier removal)
- 每个点的半径范围r(超参数)内低于d(超参数)个点的被称为异常点
点云下采样
体素化网络(voxel grid)实现下采样
对输入的点云数据创建一个三维体素网格,在每个体素内,用体素中所有点的重心来近似体素中的其它点;该体素内的所有点就用一个重心点表示。
KdTree
KdTree(k-dimensional tree)是每个节点都为k维点的二叉树。所有非叶子节点可以视作用一个超平面把空间分割成两个空间。节点左边的子树代表在超平面左边的点,节点右边的子树代表在超平面右边的点。KdTree是一种分割k维数据空间的数据结构,可用于范围搜索和最近邻搜索。
-
建立KdTree
这里介绍一种最典型的方法。- 随着树的深度轮流选择轴当作分割面。(例如,在三维空间中根节点是 x 轴垂直分割面,其子节点皆为 y 轴垂直分割面,其孙节点皆为 z 轴垂直分割面,其曾孙节点则皆为 x 轴垂直分割面, 依次类推)
- 点由垂直分割面之轴坐标的中位数区分并放入子树
-
最近邻搜索(Nearest neighbor search)
最近邻搜索用来找出在树中与输入点最接近的点。KdTree最近邻搜索的过程如下:
- 从根节点开始,递归的往下移。如果输入点在分区面的左边则进入左节点,在右边则进入右子节点。
- 一旦移到叶节点,将该节点当做"当前最佳节点"。
- 解开递归(应该是回溯),并对每个经过的节点运行下列步骤:
- 如果目前所在点比目前最佳点更靠近输入点,则将其变为"当前最佳节点";
- 检查在分割平面的另一侧是否有任何点比"当前最佳节点"更靠近搜索点[这是通过判断以搜索点位圆心,当前最近距离为半径的超球(hypersphere)与分割超平面是否相交来实现的].如果超球与分割超平面不相交,则算法继续沿树回溯,并消除该节点另一侧的整个分支。
如果超球与该分割超平面相交,则该平面的另一侧可能会有更近的点, 回溯进行相同的操作。
- 当根节点搜索完毕后完成最近邻搜索
如果维持k个最佳距离,则变成k近邻算法。
详细过程参看如下动图(如无法打开,请查看这里https://en.wikipedia.org/wiki/File:Kdtreeogg.ogv) -
范围搜索(Range Search)
从数据集中找出所有与查询点距离在一定区间内的数据。 -
复杂度
- 空间复杂度: 平均O(n), 最坏O(n)
- 搜索时间复杂度: 平均O(nlogn), 最坏O(n)
-
维数灾难
维数灾难让大部分的搜索算法在高维情况下都显得花哨且不实用。同样的,在高维空间中,KdTree也不能做很高效的最近邻搜索。一般的准则是: 在k维情况下,数据点数目N当远大于时,KdTree的最近邻搜索才能很好的发挥其作用。
OcTree
八叉树是一种树型数据结构,其中每个内部节点整好有八个子节点。八叉树常用于将三维空间递归地分为8个1/8。
具体应用和更多细节部分还不了解,欢迎补充!
聚类算法
下图是scikit-learn.org提供的关于聚类算法的一个汇总, 可以通过https://scikit-learn.org/stable/auto_examples/cluster/plot_cluster_comparison.html中的程序进行复现
下面对K-Means, MeanShift和DBSCAN进行简单介绍。
-
K-Means
K-Means把n个点划分到k个聚类中, k是输入参数。具体算法思想需要进一步了解。 -
MeanShift
Mean Shift算法在1975年被提出, 后来又Yizong Cheng对其进行扩充,主要提出了两点改进: 定义了核函数,增加了权重系数。它不需要事先设定类别个数。这个博客https://www.biaodianfu.com/mean-shift.html介绍的不错。Mean Shift算法是如何确定聚类中心数量的 ? 具体的算法细节还需要进一步了解。
-
DBSCAN
DBSCAN(Density-based spatial clustering of applications with noise),是在1996提出的聚类分析算法。维基百科我觉的介绍的不错,感兴趣的可以查看这个链接: https://zh.wikipedia.org/zh-cn/DBSCAN。
参考资料
- https://zh.wikipedia.org/wiki/K-d%E6%A0%91
- https://baike.baidu.com/item/kd-tree/2302515
- https://blog.csdn.net/silangquan/article/details/41483689
- <<点云库PCL从入门到精通>> 郭浩、苏伟著
- https://scikit-learn.org/stable/modules/clustering.html#clustering
- https://en.wikipedia.org/wiki/Octree
- https://www.biaodianfu.com/mean-shift.html
待补充…