open3d点云滤波,直通滤波、体素下采样、均匀下采样、统计滤波、半径滤波

open3d点云滤波,直通滤波、体素下采样、均匀下采样、统计滤波、半径滤波

      • 一、直通滤波
      • 二、体素下采样
      • 三、均匀下采样
      • 四、统计滤波
      • 五、半径滤波
      • 六、点云数据集获得

一、直通滤波

import open3d as o3d
import numpy as np

def pass_through(pcd, pass_min, pass_max, pass_axis='x'):
    """
    Args:
        pcd: 点云数据
        pass_min: 下限
        pass_max: 上限
        pass_axis: 坐标轴
    Returns: 直通滤波后的点云数据
    """
    # 将点云数据转换为ndarray
    points = np.array(pcd.points)

    # 判断处理的轴
    if pass_axis=='x':
        pass_axis = 0
    elif pass_axis=='y':
        pass_axis = 1
    else:
        pass_axis = 2

    # 获得筛选后的数据下标
    index = np.where((points[:, pass_axis] >= pass_min) & (points[:, pass_axis] <= pass_max))[0]
    # 获得筛选后的点云数据
    pcd = pcd.select_by_index(index)

    return pcd


if __name__ == '__main__':
    # 直通滤波
    pcd = o3d.io.read_point_cloud('点云数据')
    
    pcd = pass_through(pcd)
    o3d.visualization.draw_geometries([pcd])

原理

Open3D 中的直通滤波(PassThrough Filter)用于过滤点云中的点,只保留位于指定范围内的点。这在一些情况下非常有用,比如去除点云中的地面或者天空等。(补充:主要是关于numpy数组的、直通滤波处理数据自己手写 np.where来适用点云项目,后面会主要讲一期numpy和点云处理的。。)

参数修改

`pcd`: 点云数据
 `pass_min`: 设置下限
 `pass_max`: 设置上限
 `pass_axis`: 坐标轴

open3d点云滤波,直通滤波、体素下采样、均匀下采样、统计滤波、半径滤波_第1张图片

二、体素下采样

downPcd = pcd.voxel_down_sample(voxel_size=体素大小float类型)

原理

在 Open3D 中,voxel_down_sample 方法用于对点云进行体素下采样(Voxel Down Sampling),以减少点云的密度和复杂度。

参数

voxel_size:体素大小,即用于下采样的立方体的边长。较小的体素大小会产生更密集的下采样结果,而较大的体素大小会产生更稀疏的下采样结果。这是一个必需的参数。例如voxel_size 设置为 0.05,这意味着在每个 0.05x0.05x0.05 的立方体内,只保留一个代表点。

open3d点云滤波,直通滤波、体素下采样、均匀下采样、统计滤波、半径滤波_第2张图片

三、均匀下采样

downPcd = pcd.uniform_down_sample(every_k_points=多少点保留一个点数目 int)

原理

通过构建球体,选择距离球心最近的点采样,比起体素下采样,均匀下采样不移动点本身的位置

参数

every_k_points:每k个点保留一个点

open3d点云滤波,直通滤波、体素下采样、均匀下采样、统计滤波、半径滤波_第3张图片

四、统计滤波

	# 移除统计上的离群点
    # nb_neighbors:最近k个点    std_ratio:基于标准差的阈值,越小滤除点越多
    cl, index = pcd.remove_statistical_outlier(nb_neighbors=2, std_ratio=0.3)

原理

去除分布稀疏的点,对于点云中的每个点,计算到最近k个点的平均距离,然后假设结果构成高斯分布,过滤平均距离大于标准差的点。

参数

nb_neighbors:最近k个点

std_ratio:基于标准差的阈值,越小滤除点越多

返回值

cl:返回处理后的点云

index:去除数据的下标索引

open3d点云滤波,直通滤波、体素下采样、均匀下采样、统计滤波、半径滤波_第4张图片

五、半径滤波

cl, index = pcd.remove_radius_outlier(nb_points=10,radius=0.5)

原理

也是去除分布稀疏的点,以每个点为中心建立给定半径的球体,移除球体中点的数量小于给定阈值的点。

参数

nb_points:指定在计算离群点时考虑的邻居点的最小数量。如果在指定半径范围内的邻居点数量少于此值,则当前点将被标记为离群点。

radius:指定用于确定邻居点的搜索半径。在给定半径范围内搜索邻居点以确定每个点是否为离群点。

返回值

cl:返回处理后的点云

index:去除数据的下标索引

open3d点云滤波,直通滤波、体素下采样、均匀下采样、统计滤波、半径滤波_第5张图片

六、点云数据集获得

点云数据:百度链接:https://pan.baidu.com/s/1ovbrFzrqeM409Lp-O51gyw
提取码:sg6x

你可能感兴趣的:(open3d持续更新,python,计算机视觉,3d)