当前位置: 首页 > news >正文

【C++】使用中值滤波算法过滤数据样本中的尖刺噪声

目录

前言:

一、中值滤波的基本原理

二、中值滤波的优势

三、中值滤波的局限性

四、中值滤波的应用领域

五、中值滤波算法代码及注释

六、如果这篇文章能帮助到你,请点个赞鼓励一下吧ξ( ✿>◡❛)~


前言:

        中值滤波是一种非线性图像处理技术,广泛用于去除噪声(尤其是椒盐噪声)并保留图像边缘信息,除此之外还可以对样本数据点进行滤波处理,以过滤掉尖刺噪声,以下是其核心原理、实现步骤、应用领域及优缺点的详细解析:

一、中值滤波的基本原理

        中值滤波的核心思想是通过排序统计的方法,将图像中每个像素点的值替换为其邻域内的中值。具体步骤如下:

  • 定义窗口:选择一个奇数大小的滑动窗口(如3×3、5×5),针对一维数据也可以选择如3、5等尺寸作为滑动窗口尺寸,窗口中心为当前像素点。
  • 收集邻域像素值:将窗口覆盖的所有像素值提取出来。
  • 排序与取中值:将这些像素值按大小排序,取中间值作为当前像素的新值。
  • 滑动窗口处理:重复上述步骤,直到图像所有像素都被处理

二、中值滤波的优势

  • 有效去除椒盐噪声
    椒盐噪声表现为孤立的黑白像素点,排序后这些异常值通常位于序列两端,不会成为中值。
  • 保留边缘信息
    相比均值滤波(线性滤波),中值滤波不会平滑边缘细节,避免图像模糊。
  • 计算简单
    实现逻辑清晰,适合硬件加速(如FPGA或GPU)。

三、中值滤波的局限性

  • 对高斯噪声效果有限
    高斯噪声是连续分布的,中值滤波无法有效抑制。
  • 窗口过大会导致模糊
    增大窗口尺寸虽然能增强去噪能力,但可能损失图像细节。
  • 计算开销较高
    需对每个窗口进行排序操作,时间复杂度为 O(k2log⁡k2)O(k2logk2)(kk 为窗口边长)。

四、中值滤波的应用领域

  • 图像去噪
    • 医学影像处理:去除X光或MRI图像中的椒盐噪声,保留关键解剖结构。
    • 卫星遥感:清理传感器噪声,提升地表特征识别精度。
  • 视频处理
    • 实时视频流中去除随机噪声,如摄像头拍摄的低光照场景。
  • 工业检测
    • 在缺陷检测中,保留产品边缘的同时去除背景噪声。
  • 文档扫描
    • 清除扫描图像中的斑点噪声,提升OCR识别准确率。
  • 数据滤波
    • 过滤掉数据样本中的尖刺噪声,如对ADC电压采集数据使用中值滤波,提升数据准确性。

五、中值滤波算法代码及注释

#include "stdlib.h"	    //使用其中的快速排序函数qsort#define u16 uint16_t//void 指针经过转化后可以指向任何一个类型
int compare(const void *a, const void *b) 
{return (*(int*)a - *(int*)b);	    //实现两个数值比大小函数功能
}/*****************************************************************************
[函数名称]median_filter
[函数功能]中值滤波算法
[参    数]input:输入数组, output:输出数组, length:数组大小, window_size:滤波窗口大小
[备    注]就是将数组中的所有数据都替换为数组内窗口大小局部数组的中值
*****************************************************************************/
void median_filter(u16 *input, u16 *output, int length, int window_size)
{int half_window = window_size / 2;		//计算窗口一半尺寸,用以遍历u16 u16WindowBuf[window_size];			//创建缓存窗口数组for (int i = 0; i < length; i++) 		//开始遍历{int count = 0;						//创建数组下标变量for (int j = -half_window; j <= half_window; j++) //通过交叉滑动窗口遍历数组所有数据{int index = i + j;if (index >= 0 && index < length) {u16WindowBuf[count++] = input[index];	//将输入数组的数据加载到窗口数组中}}qsort(u16WindowBuf, count, sizeof(u16), compare); // 对窗口数组内的元素进行排序output[i] = u16WindowBuf[count / 2]; //取排序后的中值,对窗口中间数据重新赋值,达到滤波效果}
}

六、如果这篇文章能帮助到你,请点个赞鼓励一下吧ξ( ✿>◡❛)~

http://www.lryc.cn/news/598113.html

相关文章:

  • 「Linux命令基础」查看用户和用户组状态
  • Vue 项目中的组件引用如何实现,依赖组件间的数据功能交互及示例演示
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘notebook’问题
  • 处理URL请求参数:精通`@PathVariable`、`@RequestParam`与`@MatrixVariable`
  • 项目重新发布更新缓存问题,Nginx清除缓存更新网页
  • 强制缓存与协商缓存
  • 如何在 conda 中删除环境
  • 配置NGINX
  • fastapi 传参以及参数校验
  • HTML应用指南:利用GET请求获取全国奈雪的茶门店位置信息
  • 鸿蒙平台运行Lua脚本
  • 自己动手造轮子:如何创建JAR并通过Maven在Spring Boot中引用
  • Python进阶第三方库之Matplotlib
  • 同花顺前端潜在面试题目与答案
  • [iOS开发工具] 【iOS14以及以下】cydia商店按键精灵iOS新版V2.X安装教程
  • 数据库垂直拆分和水平拆分
  • Kafka入门指南:从零开始掌握分布式消息队列
  • 【医疗行业】DICOM
  • Spring Boot 请求参数绑定:全面解析常用注解及最佳实践
  • PHP文件下载
  • Edwards爱德华泵软件 支持nEXT85和nXDS系列泵,包括nXRi, nRVi和nXLi增强型 nEXT nXDS nXLi
  • 二分查找----4.搜索旋转排序数组
  • 【STM32】FreeRTOS 任务的删除(三)
  • 力扣面试150题--在排序数组中查找元素的第一个和最后一个位置
  • C++ - 仿 RabbitMQ 实现消息队列--服务端核心模块实现(三)
  • MapStruct类型转换接口未自动注入到spring容器中
  • 点击按钮滚动到底功能vue的v-on:scroll运用
  • 大模型微调学习笔记(基于讯飞星辰MaaS速学版)
  • Hive常用函数
  • CSDN技术专栏开篇:高效开发环境搭建指南