简单介绍几种获取点云的采样方法
Random Sampling
从点云或mesh的顶点集直接随机抽样,获得点云。
这种最自然的想法的问题是:由于随机性,点的分布可能在某些局部是“一簇一簇”的。换言之,点的分布其实不够均匀。
Uniform Sampling
从mesh的各个面片上均匀抽取点。其方法为(假设为三角mesh):
- 估计总面积和各面片的面积,根据比例关系确定各个面片上究竟各需要采多少个点。
- 在一个三角形区域内均匀采样。
Uniform Sampling in a Triangle
在三角形内均匀采样的一种错误方法:
- 从[0,1]均匀分布中抽取三个值
- 归一化:
可以证明:这样得到的其实不是均匀分布,而是在三角形中心更加集中。
正确的方法是:
- 先把转化为平行四边形,其中是关于所在直线的对称点。
- 从[0,1]均匀分布抽取2个值,并归一化得到
- ,当不在中时,就使用其关于所在直线的对称点。
容易证明,此时抽出的点在平行四边形内是均匀分布的,因此对称后在三角形中还是均匀分布。
如下图所示,左图为错误方法,右图为正确方法(图源:Geography meets ML)。
需要注意的是,均匀采样仍然带有随机性,因此采出来的点还是不太均匀。
Farthest Point Sampling
这是一种基于“最大化点之间距离”从而使点分布均匀的采样方法。当然,实际使用时采用的是迭代近似的方案。
首先需要定义点到点集(点云)的距离为点到点集中所有点距离中的最小值。
- 先用Uniform Sampling等方法,得到一个初始点云,但的点数远多于目标点数(如10倍)
- 令。
- 令代表中各点到当前(点集)的距离表。初始化为(由于一开始是空的)。
- 随机选择一个点。
- 把放入中。如果的大小已经达到目标点数,则退出。
- 计算点到中所有点的距离,并将其与的对应各个距离值取较小值来更新。
- 选择到距离最大的点,即中最大值所对应的点(由于已经在的点到的距离就是0,因此不会被重复选择)
- 返回第5步。
可以参考的简单代码实现:
1 | import numpy as np |
复杂度
设共有个点,目标点数为,则每次循环会执行次计算(更新距离表),因此总复杂度为。
Voxel Sampling
即将空间栅格化,每个空间小格随机取一个点。可以分桶实现,于是复杂度为线性。
按:这种方法和图像采样问题有相似之处。