Open3D常用点云滤波

在点云处理中,过密的点云需要下采样,离群点和噪声点需要去除,通过滤波的方法,可以抽稀点云,把离群点去除,以便进行下一步处理

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函数,参数有两个:

# nb_neighbors:最近k个点    std_ratio:基于标准差的阈值,越小滤除点越多
cl,ind = pcd.remove_statistical_outlier(nb_neighbors=5,std_ratio=1)
pcd = pcd.select_by_index(ind)

5.半径滤波

也是去除分布稀疏的点

以每个点为中心建立给定半径的球体,移除球体中点的数量小于给定阈值的点

调用o3d函数,参数有两个:

# nb_points:基于球体内包含点数量的阈值  radius:半径
cl,ind = pcd.remove_radius_outlier(nb_points,radios=1)
pcd = pcd.select_by_index(ind)

猜你喜欢

转载自blog.csdn.net/skycol/article/details/127429843