在点云处理中,过密的点云需要下采样,离群点和噪声点需要去除,通过滤波的方法,可以抽稀点云,把离群点去除,以便进行下一步处理
open3d中,很多滤波器已经被封装成了对应的方法(源码是C++)
1.直通滤波
直通滤波过滤指定维度(x,y,z)内,指定值域外的点
# 定义直通滤波函数
def pass_through(cloud, limit_min=0, limit_max=10, filter_value_name="z"):
points = np.asarray(cloud.points)
if filter_value_name == "x":
ind = np.where((points[:, 0] >= limit_min) & (points[:, 0] <= limit_max))[0]
x_cloud = pcd.select_by_index(ind)
return x_cloud
elif filter_value_name == "y":
ind = np.where((points[:, 1] >= limit_min) & (points[:, 1] <= limit_max))[0]
y_cloud = cloud.select_by_index(ind)
return y_cloud
elif filter_value_name == "z":
ind = np.where((points[:, 2] >= limit_min) & (points[:, 2] <= limit_max))[0]
z_cloud = pcd.select_by_index(ind)
return z_cloud
pcd = o3d.io.read_point_cloud("./data/test.ply")
filtered_cloud = pass_through(pcd,limit_min=0,limit_max=50,
filter_value_name="y")
2.体素下采样
下采样
首先根据输入点云,计算一个正好包裹点云的长方体,然后根据给定的体素分辨率分割成小正方体(体素),最后用非空体素的质心或者中心坐标代替原来的点
调用o3d函数,参数只有一个:给定的体素分辨率
pcd = o3d.io.read_point_cloud("./data/test.ply")
pcd.voxel_down_sample(voxel_size = 0.05)
3.均匀下采样
也是下采样
通过构建球体,选择距离球心最近的点采样,比起体素下采样,均匀下采样不移动点本身的位置
调用o3d函数,参数只有一个:每k个点保留一个点
pcd = o3d.io.read_point_cloud("./data/test.ply")
pcd =pcd.uniform_down_sample(every_k_points = 3)
4.统计滤波
去除分布稀疏的点
对于点云中的每个点,计算到最近k个点的平均距离,然后假设结果构成高斯分布,过滤平均距离大于标准差的点
调用o3d函数,参数有两个:文章来源地址https://www.toymoban.com/news/detail-464049.html
# nb_neighbors:最近k个点 std_ratio:基于标准差的阈值,越小滤除点越多
cl,ind = pcd.remove_statistical_outlier(nb_neighbors=5,std_ratio=1)
pcd = pcd.select_by_index(ind)
5.半径滤波
也是去除分布稀疏的点
以每个点为中心建立给定半径的球体,移除球体中点的数量小于给定阈值的点文章来源:https://www.toymoban.com/news/detail-464049.html
调用o3d函数,参数有两个:
# nb_points:基于球体内包含点数量的阈值 radius:半径
cl,ind = pcd.remove_radius_outlier(nb_points,radios=1)
pcd = pcd.select_by_index(ind)
到了这里,关于Open3D常用点云滤波的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!