基于Open3D的点云处理6-点云去噪

news/2024/11/24 13:22:36/

当我们从扫描设备获取点云数据时,数据会包含噪声和伪影,点云噪声特性包括不真实的点、孤立点、不规则,基于噪声特性对器进行去除;

统计滤波 Statistical Outlier Removal(SOR)(去除离群点)

  • 滤波思想
    对每一个点的邻域进行一个统计分析,计算它到所有临近点的平均距离。假设得到的结果是一个高斯分布,其形状是由均值和标准差决定,那么平均距离在标准范围(由全局距离平均值和方差定义)之外的点,可以被定义为离群点并从数据中去除。

  • 接口函数

remove_statistical_outlier(self, nb_neighbors, std_ratio, print_progress=False)

在这里插入图片描述
当判断点与nb_neighbors个近邻点的平均距离大于【平均距离+std_ratio*σ】,即判定为噪声点,一般取std_ratio=2或3为极限误差;

  • 测试
import open3d as o3d
# 加载点云
pcd = o3d.io.read_point_cloud("./data/desk.pcd")
# 统计滤波
k = 20  # K邻域点的个数
μ = 2.0  # 标准差乘数
sor_pcd, idx = pcd.remove_statistical_outlier(k, μ)#当判断点的k近邻的平均距离大于【平均距离+μ*σ】,即判定为噪声点,一般取μ=2或3为极限误差
sor_pcd.paint_uniform_color([0, 0, 1])
# 提取噪声点云
sor_noise_pcd = pcd.select_by_index(idx, invert=True)
sor_noise_pcd.paint_uniform_color([1, 0, 0])
o3d.visualization.draw_geometries([sor_pcd,sor_noise_pcd], window_name="SOR")

在这里插入图片描述

半径滤波 Radius Outier Removal

  • 滤波思想
    在给定阈值参数MinPts后,遍历点云所有点,对于点云中任意一点,设其半径R内有K个点,当K< MinPts时,即可识别该点为噪声点,并该点去除。

  • 接口函数

remove_radius_outlier(self, nb_points, radius, print_progress=False)

在这里插入图片描述
其中,nb_points:邻域球内的最少点个数,小于该个数为噪声点;
radius:邻域半径大小;
当判断点的nb_points近邻平均距离大于【平均距离+μ*σ】,即判定为噪声点;

  • 测试
import open3d as o3d# 加载点云
pcd = o3d.io.read_point_cloud("./data/desk.pcd")
# 半径滤波
MinPts = 5  # 邻域球内的最少点个数,小于该个数为噪声点
R = 0.05    # 邻域半径大小# pc 去噪后的点云
# idx 去噪保留的点索引
pc, idx = pcd.remove_radius_outlier(MinPts, R)pc.paint_uniform_color([0, 0, 1])
ror_noise_pcd = pcd.select_by_index(idx,invert = True)
ror_noise_pcd.paint_uniform_color([1, 0, 0])
o3d.visualization.draw_geometries([pc, ror_noise_pcd], window_name="半径滤波")

在这里插入图片描述

引导滤波 Guilter Filter

  • 滤波思想
    引导滤波假设点云经过一个线性变换,具有很好的保留边缘信息功能;Guided Filter一般用来对2D图像进行降噪等处理,实际上,稍作修改后可以对3D点云进行降噪。针对点云的Guided Filter算法,可概况为
  1. 计算点云中某一个点pi的领域 N ( i ) N ( i ) N(i)

  2. N ( i ) N ( i ) N(i)中所有点的均值 u i u_i ui 和协方差 Σ i Σ_i Σi

  3. 根据公式计算 A k A_k Ak b k b_k bk
    在这里插入图片描述

  4. q i = A k p i + b k q_i =A_k p_i +b_k qi=Akpi+bk, 输出 q i q_i qi 作为对点 p i p_i pi 的滤波结果;

  • python 源码
  • 测试
import numpy as np
import open3d as o3d#guild filter
def guided_filter(pcd, radius, epsilon):kdtree = o3d.geometry.KDTreeFlann(pcd)points_copy = np.array(pcd.points)points = np.asarray(pcd.points)num_points = len(pcd.points)for i in range(num_points):k, idx, _ = kdtree.search_radius_vector_3d(pcd.points[i], radius)if k < 3:continueneighbors = points[idx, :]mean = np.mean(neighbors, 0)cov = np.cov(neighbors.T)e = np.linalg.inv(cov + epsilon * np.eye(3))A = cov @ eb = mean - A @ meanpoints_copy[i] = A @ points[i] + bpcd.points = o3d.utility.Vector3dVector(points_copy)#添加噪声
def add_noise(pcd, sigma):points = np.asarray(pcd.points)noise = sigma * np.random.randn(points.shape[0], points.shape[1])points += noisepcd = o3d.io.read_point_cloud('./data/bunny.ply')
add_noise(pcd, 0.004)
o3d.visualization.draw_geometries([pcd],window_name="rawPointCloud")
guided_filter(pcd, 0.01, 0.1)
guided_filter(pcd, 0.01, 0.1)
o3d.visualization.draw_geometries([pcd],window_name="guildFilter")

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/99510.html

相关文章

计算机体系结构标量处理机

先行控制技术 缓冲深度的设计方法 以先行指令缓冲栈为例。 假设缓冲深度为 D 1 D_1 D1​&#xff0c;考虑以下两种极端情况。 &#xff08;1&#xff09;先行指令缓冲栈已经充满&#xff0c;此时指令流出速度最快&#xff0c;例如连续分析RR型指令 &#xff0c;设这种指令序…

summernote编辑内容在前端的显示

summernote编辑内容在前端的显示 summernote编辑器编辑的内容保存的时候是带有html标签的&#xff0c;那么小编在这里总结了两种方法&#xff0c;把这些内容在前端显示出来。 1使用htmlspecialchars_decode() 函数 我们可以在Controller里面将这个字段的内容用htmlspecialchar…

Fiddler抓包工具之fiddler设置抓HTTPS的请求证书安装

设置抓HTTPS的请求包 基础配置&#xff1a; 路径&#xff1a;启动Fiddler 》Tools》Options》HTTPS 注意&#xff1a;Option更改完配置需重启Fiddler才能生效 选中"Decrpt HTTPS traffic", Fiddler就可以截获HTTPS请求&#xff0c;如果是第一次会弹出证书安装提…

全国酒店评论数据

评论数据字段内容&#xff1a; id int(11) NOT NULL AUTO_INCREMENT, fetchTime datetime DEFAULT NULL, hotelId int(11) NOT NULL, hotelName varchar(100) DEFAULT NULL, hotelEnName varchar(50) DEFAULT NULL, hotelUrl varchar(500) DEFAULT NULL, …

区块链复习

文章目录 简答题第一章1.区块链的概述&#xff08;问题&#xff1a;区块链是通过哪些机制实现信任的&#xff1f;&#xff09;2.哈希函数的性质&#xff08;问题&#xff1a;区块链为什么能够保证链上数据的不可篡改&#xff1f;&#xff09;3.区块链的特点&#xff08;P18-P19…

2023/5/28总结

static static:静态&#xff0c;可以修饰成员方法&#xff0c;成员变量。&#xff08;是所有成员共享的&#xff09; static修饰的特点&#xff1a; 被类的所有对象共享&#xff08;判断是否使用静态关键字的条件&#xff09;可以通过类名和对象名调用在定义对象时&#xff0c;…

基于博奇编码的计算全息图及再现研究

一、引言 全息技术作为一种新的成像技术近年来得到迅速的发展&#xff0c;计算机制全息图不需要实物的存在&#xff0c;同时还能通过计算机实现像的再现。计算全息图主要包括迂回位相型计算全息图和修正离轴参考光计算全息图&#xff0c;这两类全息图由不同的编码方式得到。前…

【C++】容器篇(四)—— queue的基本介绍以及模拟实现

前言&#xff1a; 在上期博文中我带大家对stack进行深入的学习&#xff0c;本期我将带领学习的是关于 queue的基本知识&#xff0c;并且还将给大家介绍并实现 priority_queue。接下来&#xff0c;让我们正式本期的内容。 目录 &#xff08;一&#xff09;queue的基本介绍 &…