Open3D 体素化下采样

参考笔记:Open3D: 3D点云的体素下采样技术-CSDN博客 

目录

一、算法原理

二、计算过程

三、代码实现


一、算法原理

体素化下采样是一种点云数据下采样方法,通常在点云处理任务的预处理步骤,体素化下采样分为两大步:

把点云装进体素网格

把每个体素网格中的所有点做平均,只保留一个代表点

二、计算过程

依据点云数据坐标集合,求取 \color{red}X\color{red}Y\color{red}Z 三个坐标值上的最大值 \color{red}X_{max}\color{red}Y_{max}\color{red}Z_{max} 和最小值  \color{red}X_{min}\color{red}Y_{min}\color{red}Z_{min}

根据 \color{red}X\color{red}Y\color{red}Z 三个坐标轴上的最大值、最小值求得点云的最小包围盒边长 \color{red}l_{x }\color{red}l _y\color{red}l_z,公式如下:

设置体素网格的边长 voxel_size,为了方便,记为 r

计算体素网格的数量:

D_x=\left \lfloor l_x/r\right \rfloor\\ \\ D_y=\left \lfloor l_y/r\right \rfloor\\ \\ D_z=\left \lfloor l_z/r\right \rfloor\\ \\

 其中,\color{red}D_x  指的是 \color{red}x 轴方向有多少个体素网格,\color{red}D_y\color{red}D_z 同理。所以总体素网格数量为:\color{red}D_x\times D_y\times D_z 。\left \lfloor \right \rfloor 指的是向下取整

计算每个体素网格的质心作为该体素网格的代表点,替代其他的所有点,完成下采样

        质心算法:已知一个非空体素网格 \color{red}V,包含 \color{red}m 个点,则该体素网格的质心 \color{red}P_{centroid}(x_{centroid}\;\;,y_{centroid}\;\;,z_{centroid}) 为:

注:质心说白了就是求平均值。如果点还有其他属性,比如RGB、法线等也是取平均值

三、代码实现

主要函数:

def voxel_down_sample(self, voxel_size): 

 voxel_size:体素网格的边长 


我们用经典的兔子点云做一下对比

import open3d as o3d
import numpy as np

pcd = o3d.io.read_point_cloud("rabbit.txt",format="xyz")#读取点云
print("原始点云中点的个数为:", np.asarray(pcd.points).shape[0])
o3d.visualization.draw_geometries([pcd])#原始点云可视化

print("使用边长为0.5的体素对点云进行下采样")
downpcd = pcd.voxel_down_sample(voxel_size=0.5)
print("体素下采样后点的个数为:", np.asarray(downpcd.points).shape[0])

#可视化体素下采样后的点云
o3d.visualization.draw_geometries([downpcd], window_name="体素滤波",
                                  width=1200, height=800,
                                  left=50, top=50,
                                  mesh_show_back_face=False)

运行结果

原始点云中点的个数为: 35947
使用边长为0.5的体素对点云进行下采样
体素下采样后点的个数为: 3023
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值