无人机避障——4D毫米波雷达点云滤波去噪(四)

噪声的来源:

对于4D毫米波雷达的前后两帧点云数据进行去噪,可以采用多种方法。首先,需要了解点云数据的噪声来源,可能是由于硬件限制、环境干扰或目标本身的反射特性等因素造成的。噪声点通常包括漂移点、孤立点、冗余点和混杂点等。

参考学习:

十种滤波算法的Python实现_控制十个数据,先进先出-CSDN博客

去噪方法可以分为传统方法和基于深度学习的方法:

以4D毫米波的平面和三维点云为例: 

点云效果如下:

 

滤波测试结果:

中值平均滤波法:

中值平均滤波法(Median Mean Filter)是一种常见的信号处理滤波方法,结合了中值滤波和均值滤波的特点。它的基本思想是对信号进行中值滤波和均值滤波的结合,以平衡两种滤波方法的优缺点。

这种滤波方法的步骤通常包括:

  1. 对信号进行中值滤波,以消除噪声对信号的影响。
  2. 对中值滤波后的信号再进行均值滤波,以保留信号的整体特征
结果:

左边是4D雷达点云,右边是滤波之后的效果

pre为10 

pre为5 

改变左边雷达点云,观察右边滤波效果。

[注意]:得看看平面的效果!!!

pre = 10

pre = 5

结论:

有一定的去噪能力,但是感觉滤波能力还不太够

代码: 
def adjust_array_size(points, per):"""调整数组的大小,使其长度为 per 的倍数。参数:points (numpy.ndarray): 输入的点数组。per (int): 每个分组的大小。返回:numpy.ndarray: 调整大小后的点数组。"""num_points = len(points)  # 获取点数组的长度print('调整之前点的数目:',num_points)remainder = num_points % per  # 计算点数组长度对 per 的余数print('remainder:',remainder)if remainder != 0:  # 如果余数不为零,说明需要调整数组大小points = points[:-remainder]  # 删除多余的点print("删除")return points  # 返回调整后的点数组def MedianAverage3D(points, per):"""对三维点数组进行中值平均去噪。参数:points (numpy.ndarray): 输入的三维点数组。per (int): 每个分组的大小。返回:numpy.ndarray: 去噪后的点数组。"""points = adjust_array_size(points, per)  # 调整点数组的大小,使其长度为 per 的倍数num_points = len(points)  # 获取调整后点数组的长度num_groups = num_points // per  # 计算分组的数量# 确保 points 数组的大小是 per 的倍数if num_points != num_groups * per:raise ValueError(f"The number of points ({num_points}) is not a multiple of per ({per}).")points_reshaped = points.reshape((num_groups, per, 3))  # 将点数组重塑为 (num_groups, per, 3) 的形状denoised_points = np.zeros((num_points, 3))  # 初始化去噪后的点数组for i in range(num_groups):  # 遍历每个分组for j in range(3):  # 遍历每个通道(x, y, z)channel = points_reshaped[i, :, j]  # 获取当前分组的当前通道数据# print('channel:',channel)# 检查数组大小,确保在删除最大值和最小值后仍然有数据点if len(channel) > 2:# 检查 channel 中的元素是否都相同if np.all(channel == channel[0]):# 如果所有元素都相同,则不进行删除操作# print("运行到这1!!!")denoised_points[i*per:(i+1)*per, j] = channel[0]else:# print("运行到这2!!!")max_indices = np.where(channel == channel.max())[0]min_indices = np.where(channel == channel.min())[0]# print("max_indices1:",max_indices)# print("min_indices1:",min_indices)                 # 合并需要删除的索引indices_to_delete = np.unique(np.concatenate((max_indices, min_indices)))                    # 删除最大值和最小值channel = np.delete(channel, indices_to_delete)# 如果删除后数组大小为零,则使用原始数据if len(channel) == 0:channel = points_reshaped[i, :, j]denoised_points[i*per:(i+1)*per, j] = np.mean(channel)  # 计算剩余数据的均值,并赋值给去噪后的点数组else:denoised_points[i*per:(i+1)*per, j] = np.mean(channel)  # 如果数据点不足,直接使用均值return denoised_points  # 返回去噪后的点数组

递推平均滤波法:

递推平均滤波(也称为移动平均滤波或滑动平均滤波)是一种常用的信号处理技术,用于减少数据中的随机噪声,平滑数据序列。以下是递推平均滤波的特点以及它的优缺点:

 特点:
1. **简单易实现**:递推平均滤波的算法简单,容易在硬件或软件中实现。
2. **时域滤波**:它在时域内对信号进行处理,不需要像频域滤波那样进行傅里叶变换。
3. **局部平均**:通过对数据序列中相邻的一组数据点求平均值,实现局部平滑。
4. **递推计算**:每个点的平均值是基于前一个平均值和当前窗口的数据点计算的,这样可以减少计算量。

优点:
1. **去噪效果好**:对于随机噪声,递推平均滤波能够有效地减少数据的波动,使信号更加平滑。
2. **稳定性高**:由于是局部操作,对数据的局部变化不敏感,因此滤波结果比较稳定。
3. **实时处理**:适合于在线实时处理,因为每个新数据点的滤波结果可以快速计算出来。
4. **无需训练**:不需要像一些自适应滤波器那样进行训练或参数调整。

缺点:
1. **引入延迟**:由于需要考虑当前点和前面的点,所以滤波后的数据会有一定的时间延迟。
2. **边缘效应**:在数据序列的开始和结束部分,无法形成完整的窗口,这可能导致边缘处的数据不够平滑。
3. **不能消除周期性噪声**:如果噪声的周期与窗口大小相匹配,递推平均滤波可能无法有效去除这种噪声。
4. **信号失真**:对于非平稳信号,递推平均滤波可能会导致信号的波形失真,尤其是在信号的快速变化区域。
5. **参数依赖**:滤波效果依赖于窗口大小的选择,窗口太大可能导致信号过度平滑,失去细节;窗口太小则去噪效果不佳。

在使用递推平均滤波时,需要根据具体的应用场景和数据特性来选择合适的窗口大小。过大的窗口会消除信号中的重要细节,而过小的窗口则可能无法有效去除噪声。此外,对于非静态信号或非线性信号,递推平均滤波可能不是最佳选择,可能需要考虑更复杂的滤波方法。

结果:

pre = 15

pre = 10

pre = 5

结论:

去噪声比较弱,但是其有产生连续性规则性的点,肯定没法直接用的

代码:
# 递推平均滤波
def SlidingAverage(inputs, per):# 如果输入数组的行数不能被'per'整除,则去掉余数部分if inputs.shape[0] % per != 0:# 去掉不能整除的部分inputs = inputs[:inputs.shape[0] // per * per]# 初始化一个空数组来存储滤波后的结果filtered = np.zeros_like(inputs)# 遍历每个点,计算递推平均for i in range(inputs.shape[0]):# 计算当前点的起始索引start_idx = max(i - per + 1, 0)# 计算当前点的结束索引end_idx = i + 1# 计算窗口内的数据window = inputs[start_idx:end_idx]# 计算平均值filtered[i] = window.mean(axis=0)# 返回滤波后的数组return filtered

中值平均滤波+递推平均滤波法:

结果:

中值:pre = 10

+

递推:pre = 5

中值:pre = 15

+

递推:pre = 5

递推:pre = 5

+

中值:pre = 10

[注意]:这个数据可以用

递推:pre = 5

+

中值:pre =  5

递推:pre = 5

+

中值:pre =  7

递推:pre = 5

+

中值:pre =  13

递推:pre = 5

+

中值:pre =  15

结论:

能够具有一些效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1559419.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

毕业设计项目——基于RISC-V的标签化跨层调度应用任务管理(论文/代码)

完整的论文代码见文章末尾 以下为核心内容 摘要 在现代操作系统中,高效的系统调度策略对于优化系统性能、提高资源利用率和保证系统稳定性至关重要。本文提出了一个基于Linux进程文件系统(procfs)的系统监控工具,旨在通过实时收…

Spring Cloud全解析:链路追踪之springCloudSleuth简介

文章目录 springCloudSleuth简介链路追踪?SpringCloudSleuth术语链路示意图zipkin依赖配置 springCloudSleuth简介 链路追踪? 什么是链路追踪?就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示&#xff…

算法:1、动态规划算法DP(Dynamic Programming)

算法介绍 动态规划(Dynamic Programming,DP)‌,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。它的关键思想是对于最终结果依赖前序步骤的问题,将结果定义为状态值dp,然后推导出后续步骤由…

深度学习常见问题

1.YOLOV5和YOLOV8的区别 YOLOv5 和 YOLOv8 是两个版本的 YOLO(You Only Look Once)目标检测算法,它们在网络架构、性能优化、功能扩展等方面有显著的区别。YOLOv5 是 YOLO 系列的重要改进版本,而 YOLOv8 是最新的一次重大升级&am…

SQL性能优化指南:如何优化MySQL多表join场景

目录 多表join问题SQL 这里解释下 Using join buffer (Block Nested Loop): 对性能产生的影响: 三种join算法介绍 join操作主要使用以下几种算法: (1)Nested Loop Join (2)Block Nested …

搭建企业域名服务器案例

任务要求: 某企业要建立一台应用于以下情况的主域名服务器 拥有一个C类网段地址,为202.101.55.0。企业域名注册为company.com。域名服务器的IP地址定位为202.101.55.55,主机名为dns.company.com。企业网通过路由器与Internet连接。要解析的…

第九届清洁能源与发电技术国际学术会议(CEPGT 2024)

第九届清洁能源与发电技术国际学术会议(CEPGT 2024) 2024 9th International Conference on Clean Energy and Power Generation Technology (CEPGT 2024) 【早投稿早录用,享受早鸟优惠】 第九届清洁能源与发电技术国际学术会议&#xff0…

记录一个Ajax发送JSON数据的坑,后端RequestBody接收参数小细节?JSON对象和JSON字符串的区别?

上半部分主要介绍我实际出现的问题,最终下面会有总结。 起因:我想发送post请求的data,但是在浏览器中竟然被搞成了地址栏编码 如图前端发送的ajax请求数据 如图发送的请求体: 很明显是keyvalue这种形式,根本就不是…

开源的键鼠共享工具「GitHub 热点速览」

十一长假回来,我的手放在落灰的键盘上都有些陌生了,红轴竟敲出了青轴般的响声,仿佛在诉说对假期结束的不甘。 假期回归的首更,让我们看看又有什么好玩的开源项目冲上了开源热榜。一套键盘和鼠标控制多台电脑的工具 deskflow&#…

supOS加速数实融合发展

作为工业操作系统领军企业,蓝卓受邀参加2024金砖国家新工业革命伙伴关系论坛,深度参与多个环节。在9月11日召开的金砖国家新工业革命伙伴关系论坛产融合作专题研讨上,蓝卓总经理谭彰分享了supOS在产融协同的最新实践,以及supOS进入…

云上考场小程序+ssm论文源码调试讲解

2 关键技术简介 2.1 微信小程序 微信小程序,简称小程序,英文名Mini Program,是一种全新的连接用户与服务的方式,可以快速访问、快速传播,并具有良好的使用体验。 小程序的主要开发语言是JavaScript,它与…

集师知识付费小程序:打造培训机构在线教育的金字招牌 集师知识付费系统 集师知识付费小程序 集师知识服务系统 集师线上培训系统 集师线上卖课小程序

在数字化浪潮的推动下,在线教育已成为教育领域的热门话题。而在众多在线教育平台中,集师知识付费小程序凭借其独特的定位和创新的模式,成功为培训机构打造了一张闪亮的在线教育金字招牌。 集师知识付费小程序,是一个集课程展示、…

数据分析Power BI设置万为单位的数据

玩过Power BI的同学都知道,power BI在度量值设置单位里,唯独没有万这个单位,但是我们可以自定义,操作过程如下: 1.用DAX新建单位表 单位 SELECTCOLUMNS( { ( "元", 1), ("万",10000), ("千…

面试题:Redis(三)

1. 面试题 背景 问题,上面业务逻辑你用java代码如何写? 2. 缓存双写一致性谈谈你的理解? 3. 双检加锁策略 多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个 互斥锁来锁住它。 其他的线程走到这…

进程守护化

文章目录 概念引入ps细节展示什么是进程组什么是会话细节演示有关指令的处理 用户级任务和进程组的关系关系不同 什么是守护进程如何创建守护进程 代码说明如何关闭守护进程 问题 概念引入 我们在之前的章节中已将看过进程相关的概念, 本篇介绍守护进程 进程还有进程组, 作业,…

锐龙7 7800X3D与i7-14700K到底怎么选!其实很简单

从2022年的锐龙7 5800X3D到后来的锐龙7 7800X3D,笔者使用X3D处理器已有2年多的时间。站在自己的立场,我是非常希望游戏老鸟购买这类处理器的,并且也推荐了不少。 这里说的是老鸟,也就是比较懂电脑的玩家。 但是对于新手玩家而言&a…

Kali Linux 下载与安装手册

目录 Kali 是什么? 通过Kali官方网站下载 Kali 是什么? Kali Linux,前称BackTrack,是一个基于Debian的Linux发行版,专为数字取证和渗透测试而设计。它由Offensive Security Ltd.开发和维护,旨在为安全专…

HarmonyOS NEXT应用开发实战(二、封装比UniApp和小程序更简单好用的网络库)

网络访问接口,使用频次最高。之前习惯了uniapp下的网络接口风格,使用起来贼简单方便。转战到鸿蒙上后,原始网络接口写着真累啊!目标让鸿蒙上网络接口使用,简单程度比肩uniapp,比Axios更轻量级。源码量也不多…

【Parsec】一款安全高效的远程桌面软件

Parsec 是一款远程桌面软件,它允许用户通过P2P(点对点)技术远程访问和控制另一台计算机。以下是Parsec的一些主要作用、安全私密性特点以及优缺点: 作用: 远程游戏:用户可以远程访问高性能PC进行游戏&am…

记一次pyc逆向

.py文件   源代码文件。   这是开发者编写的 Python 源代码文件,包含了可执行的 Python 代码。 .pyc文件   字节码文件。   Python 源文件(.py)在执行时会被编译为字节码,并存储在 __pycache__ 目录下,文件名通…