IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 点云滤波:统计滤波器python代码以及open3d处理 -> 正文阅读

[Python知识库]点云滤波:统计滤波器python代码以及open3d处理

统计滤波器主要是用于去除明显的离群点:离群点特征在空间中分布稀疏,定义某处点云小于某个密度,即点云无效。因此我们要计算每个点到其最近的K个点平均距离,则点云中所有点的距离应构成高斯分布,根据全部点集的均值和标准差,计算距离阈值,剔除阈值之外的点。

(1)使用open3d中的函数来实现

import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud('013205.pcd',remove_nan_points = True,remove_infinite_points = True)
print('原始点云个数是:',np.array(pcd.points).shape[0])
o3d.visualization.draw_geometries([pcd])
cl,index = pcd.remove_statistical_outlier(nb_neighbors = 50,std_ratio= 1.0)
new_cloud = pcd.select_by_index(index)
o3d.visualization.draw_geometries([new_cloud])

(2)自己写代码实现:

遍历全部点云数据,首先计算每个点到其他K个点的平均距离,然后计算该点对全部点集的均值和标准差,根据均值和标准差来计算阈值,根据阈值将符合条件的点留下,组成新的点云输出。

import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud('013205.pcd',remove_nan_points = True,remove_infinite_points = True)
print('原始点云个数是:',np.array(pcd.points).shape[0])
o3d.visualization.draw_geometries([pcd])
def statistical_outlier(cloud,k = 50,threshold = 2.0):#自己写一个统计滤波器
    #计算每个点到领域k内的平均距离di
    cloud_kdtree = o3d.geometry.KDTreeFlann(cloud)
    di = []
    new_cloud = []#用于存放新的点云集
    for i in range(np.array(cloud.points).shape[0]):
        [k,idx,_] = cloud_kdtree.search_knn_vector_3d(cloud.points[i],k)#k近邻搜索,拿到k个点的index,第一个点是搜索本身
        #计算K邻域的欧式距离
        eucDistance = [np.linalg.norm(np.array(cloud.points)[j] - np.array(cloud.points)[idx[0]]) for j in np.array(idx[1:])]
        eucdistance_mean = np.mean(eucDistance,axis=0)#计算出均值
        di.append(eucdistance_mean)
        #计算整个点集的均值和标准差
        distance = [np.linalg.norm(np.array(cloud.points)[j] - np.array(cloud.points)[idx[0]]) for j in range(np.array(cloud.points).shape[0])]
        cloud_points_mean = np.mean(distance,axis=0)
        cloud_points_std = np.std(distance)#计算出标准差
        #计算距离阈值
        dmax = cloud_points_mean + threshold*cloud_points_std
        dmin = cloud_points_mean - threshold*cloud_points_std
        #判断点是否符合距离阈值,符合则留下
        if dmin <= di[i] <= dmax :
            new_cloud.append(cloud.points[i])
    new_pcd = o3d.geometry.PointCloud()
    points = o3d.utility.Vector3dVector(np.array(new_cloud))
    new_pcd.points = points
    o3d.io.write_point_cloud('statistical_deal_points.pcd',new_pcd,True)
    o3d.visualization.draw_geometries([new_pcd])
statistical_outlier(pcd,50,1.0)
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:10:10  更:2022-09-13 11:11:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 9:19:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码