之前一直以为CC软件里面没有子采样这个功能,不过找了找之后发现还是有的,感觉这些小的功能挺有意思的,所以也就记录一下。
文章目录
- 一、Random采样
- 二、space采样
- 三、octree采样
- 四、小结
一、Random采样
有时候我总是喜欢使用一些小的样本来测试一些算法,所以这个小功能感觉还是很实用的,可以在保证原点云数据特征(如:颜色、法向量等等)的同时,而且能有效的降低点云数据的数据量。
(1)加载数据。
(2)选中要进行子采样的点云对象,然后点击“Subsample”按钮。
(3)选择随机采样,并设置参数。
(4)最后,点击“确定”即可生成新的点云数据。(此时的“Use active SF”使用不了,该选项只适用于space采样)
二、space采样
这个功能感觉也是很实用,它有点类似PCL中的VoxelGrid(体素)滤波器(在CC软件中,该方法为“Octree”中的“Resample”方法),虽然其做法可能与体素滤波器有些不同,但是达到的效果却是有些类似。这两种方法均可以在减少点云数据量的同时,还可以减轻点云数据分布不均匀(或是密度不同)的影响。
因为过程和随机采样类似,所以我就只说一下参数设置。
处理效果:
本着学习的态度我又试了一下“Use active SF”选项,设置如下所示:
此时我当前活动的字段是高程字段,那么我的设置就很明显了,就是想要高程越低点云数据分布的密度也越低,并且此时的高程和采样距离存在着一种线性插值的关系。处理的效果如下所示:
三、octree采样
octree采样方法与体素滤波器与很多相似之处,他们唯一的区别就是体素滤波器使用的是体元中的原始点集的质心作为采样点,而octree方法则是把距离体元中心最近的那个点作为采样点。这样的做法使得octree采样所获取的采样点均来源于原始点集,而没有产生新的采样点,这样做不仅可以减轻点云数据分布不均而带来的影响,而且还尽可能的保留了原始点集的特征。
参数设置如下所示:
处理效果:
不过在这里要注意的是如果你的CC软件是32位的,那么你的分割水平最高只能为10层,而如果是64位的则可以达到21层。
私下,我曾仔细思考了一下为什么会有这方面的限制,以下的内容纯属我个人的猜测,如果有所错误就当是个笑话看看得了*~*。
因为我们都比较了解octree这种数据结构,其体元数每分割一次就会扩大8倍。在这里我们假设使用octree方法采样所得到的体元可以用1个字节来表示,那么 8 10 8^{10} 810是多少呢?1,073,741,824个体元,也就是1,073,741,824字节。而我们经常所说的32位系统就是指计算机的逻辑地址空间有 2 32 2^{32} 232个字节,也就是4,294,967,296个字节。那么此时我们就可以看出来,如果我们要将分割水平设置为11层,那么 8 11 8^{11} 811就已经大于 2 32 2^{32} 232了,计算机内的逻辑地址空间就不够用了,在这里也可以简单理解为内存不够用了。同样的道理如果是64位系统,分割层数一但大于21层,那么也会和上述情况一样,面临着逻辑地址空间不够使用了,所以这可以解释一下为什么octree会有分割水平的限制。
四、小结
我有时候在使用一些功能的时候会时不时的进行瞎猜,之所以这样做一方面可能就是为了求个“道理”,而另一方面可能就是方便自己的记忆吧,如果文中因此出现错误还希望大家能及时的指出*~*。