包含x%点的最小边界球体

时间:2016-09-26 14:24:57

标签: algorithm 3d language-agnostic geometry point-clouds

给定3D点云,如何找到包含给定百分点的最小边界球?

即。如果我有一个带有一些噪声的点云,并且我想忽略5%的异常值,如果我不知道哪些点是异常值,我怎么能得到包含95%剩余点的最小球体?

示例:我想找到绿色球体,而不是红色球体:

enter image description here

我正在寻找一种合理快速而简单的算法。它不必找到最优解,合理的近似也很好。

我知道如何计算100%点的近似边界球,例如用Ritter的算法。

如何将此推广到找到包含x%点的最小球体的算法?

5 个答案:

答案 0 :(得分:3)

只是一个想法:二元搜索。

首先,使用其中一个边界球algorithms来首先找到100%的边界球。

将95%球体的中心点固定为与100%球体的中心点相同。 (不能保证它是,但你说你可以用近似答案。)然后在球体半径上使用二分搜索,直到你得到95% +- epsilon个点。

假设点从中心点按距离(或平方距离稍微快一些)进行排序,对于固定半径r,需要O(log n)次操作才能找到内部点的点数。半径为r的球体,例如通过使用另一个二分搜索。右r本身的二进制搜索需要这种评估的对数。因此,在找到100%球体后,整个搜索应该只需要O(log 2 n)步骤。

编辑:如果您认为缩小球体的中心距离整个球体太远,您可以重新计算边界球体,或者仅重新计算点集的质量中心,每次丢掉一些积分之后。每次重新计算不应超过O(n)。重新计算后,按距离新中心点的距离求助点。由于您希望它们已经几乎已经排序,您可以依赖冒泡排序,这对于近乎分类的数据在O(n + epsilon)中起作用。请记住,这些测试只需要一个对数,所以你应该能够完全接近O(n log 2 n)。

这取决于您正在寻找的确切表现以及您愿意为此牺牲的内容。 (我很高兴得知我错了,这对我来说是一个非常精确的算法。)

答案 1 :(得分:1)

距离平均点位置的距离可能会给出一个合理的指示,表明一个点是否是异常值。

该算法可能类似于:

  1. 查找分数的边界
  2. 查找平均点位置
  3. 选择距离平均位置最远的边界球上的点,将其作为异常值移除
  4. 重复步骤1-3,直至删除5%的分数

答案 2 :(得分:1)

ryann的算法并不坏。我建议使用几何中位数进行证明,然后来到这个草图:

  1. 计算O(N ^ 2)
  2. 中的NxN距离
  3. 在O(N ^ 2)
  4. 中对此矩阵的每一行(=一个点与其他点的距离)求和
  5. 对获得的"人群进行排序"距离O(N * log N)
    (距离最小的点是几何中值的近似值)
  6. 去除O(1)中最大的5% 在这里我们只考虑最大的人群距离作为异常值,
    而不是从中位数获取最大距离。
  7. 以O(N)
  8. 计算所获得球体的半径

    当然,它也会受到次优性的影响,但是在远离异常值的情况下应该会有所改善。总成本为O(N ^ 2)。

答案 3 :(得分:1)

我会迭代以下两个步骤直到收敛:

1)给定一组点,找到包围100%点的最小球体并计算出其中心。

2)给定一个中心,找到包含最接近中心的原始数字的95%的点组。

每个步骤减少(或至少不增加)所涉及球体的半径,因此您可以在半径停止减小时声明收敛。

事实上,我会从多个随机开始迭代,每次开始都是通过找到包含所有一小部分点的最小球体而产生的。我注意到,如果你有10个异常值,并且你将你的点集分成11个部分,那么这些部分中至少有一个不会有任何异常值。

(这非常基于https://en.wikipedia.org/wiki/Random_sample_consensus

答案 4 :(得分:0)

找到欧几里得最小生成树,并按长度的降序检查边缘。对于每条边,考虑通过删除边获得的两个连接树中的点集。

如果较小的点集小于总数的5%,并且较大的点集周围的边界球不与其重叠,则删除较小的点集。 (如果你的点云中心有一个空白的空间,这个条件是必要的。)

重复此操作,直至达到阈值或长度足够小'你不在乎删除它们。