大尺度噪声包含两部分,一部分是那些悬浮在主体点云周围且偏离主体点云的稀疏点,另一部分是距离主体点云中心较远且小而密集的点。对于大尺度噪声,这里采用栅格划分的方式进行删除。
对于点云 P ,其大尺度噪声采用栅格划分的方式删除。首先,将点云 P 中所有数据点的三维坐标点存到一个一维数组中,并构造一个与坐标轴平行的长方体包围盒,但要确保包围到点云的所有数据点。假设该长方体包围盒中点的最大和最小坐标分别为{ x max , y max , z max }和{ x min , y min , z min },长方体栅格的长度为 L 。其次,根据数据点的密度将长方体包围盒划分成多个小立方体栅格,那么小立方体栅格在 x , y , z 三个方向的个数 Sum x , Sum y , Sum z 为:
对于点云 P 中的某一确定点 p i ( x p i , y p i , z p i ),( x p i , y p i , z p i )表示点 p i 的三维坐标,那么,点 p i 所在小立方体栅格在 x , y , z 轴三个方向的索引号( I x pi , I y pi , I z pi )为:
基于以上的栅格划分结果,接下来判断每个栅格内的数据点数以删除大尺度噪声,具体步骤如下:
步骤1:假设栅格化后点云 P 的小立方体栅格总数为 Sum 个,栅格的集合为 R ={ R 1 , R 2 ,…, R Sum },其中 Sum=Sum x ×Sum y ×Sum z ,并定义栅格内点数大于给定阈值的栅格为有点栅格,点数小于等于给定阈值的栅格为无点栅格。
步骤2:取第 i 个小立方体栅格 R i ( i= 1,2,…, Sum ),并判断该栅格内的数据点数,如果 R i 为无点栅格,则根据栅格内点的索引号( I x pk , I y pk , I z pk )删除 R i 内的所有数据点,这些删除的点就是悬浮在点云周围的散乱稀疏的大尺度噪声点。
步骤3:如果栅格 R i 为有点栅格,则以 R i 为中心查看其周围的小立方体栅格内的数据点数;如果某个栅格有点栅格,则以该栅格为中心查看其周围栅格内的数据点数。
步骤4:继续依次把周围的有点栅格作为中心,查看其周围栅格,直到查看完所有栅格为止,以此找出与栅格 R i 属于同一片点云的所有相邻栅格。
步骤5:取下一个与 R i 不属于同一片点云的栅格 R j ( j =1,2,…, Sum ), j ≠ i ,重复类似步骤2到步骤4的过程,即可找到与栅格 R j 属于同一片点云的所有相邻栅格。
步骤6:继续取下一个与 R i 和 R j 都不属于同一片点云的栅格 R k ( k= 1,2,…, Sum , k ≠ j ≠ i ),重复类似步骤2到步骤4的过程,一直这样执行下去,直到将所有栅格都划分到相应的某片点云中为止,以此将点云 P 划分成 S 片点云{ P 1 , P 2 ,…, P s }。
步骤7:计算每一片点云中有点栅格的数目,从而可以从 S 片点云中找出含有点栅格数目最多的那一片点云,那么,该片点云即为主体点云,其余的点云均为距离主体点云中心较远且小而密集的大尺度噪声点,要删除掉。
通过以上步骤即可实现点云中的大尺度噪声删除,接下来,采用特征加权FCM算法删除点云中的小尺度噪声。