当前位置: 首页 > 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.xdnf.cn/news/1181161.html

相关文章:

  • rust-方法语法
  • C++STL系列之set和map系列
  • 基于python django的农业可视化系统,以奶牛牧场为例
  • 用 Function Call 让 AI 主动调用函数(超入门级示例)|保姆级大模型应用开发实战
  • SpringBoot航空订票系统的设计与实现
  • 进阶系统策略
  • 技术赋能多元探索:我的技术成长与行业洞察
  • Linux应用开发基础知识——进程学习2(exec函数、system函数、popen函数)(三)
  • 斐波那契数列策略
  • 人形机器人_双足行走动力学:Maxwell模型及在拟合肌腱特性中的应用
  • Java学习----原型模式
  • 使用Claude Code从零到一打造一个现代化的GitHub Star项目管理器
  • day46day47 通道注意力
  • 无源域自适应综合研究【2】
  • C++ 性能优化
  • 力扣 hot100 Day54
  • pytest中使用skip跳过某个函数
  • 无人机速度模块技术要点分析
  • 第三章:掌握 Redis 存储与获取数据的核心命令
  • MNIST 手写数字识别模型分析
  • 秋叶sd-webui频繁出现生成后无反应的问题
  • 【Web APIs】JavaScript 节点操作 ⑧ ( 删除节点 - removeChild 函数 | 删除节点 - 代码示例 | 删除网页评论案例 )
  • 算法竞赛阶段二-数据结构(34)数据结构链表STL vector
  • 【PyTorch】图像二分类项目-部署
  • Spring Boot 3整合Spring AI实战:9轮面试对话解析AI应用开发
  • HttpServletRequest深度解析:Java Web开发的核心组件
  • PyTorch数据选取与索引详解:从入门到高效实践
  • Vue3 面试题及详细答案120道(91-105 )
  • 开立医疗2026年校园招聘
  • 论文复现-windows电脑在pycharm中运行.sh文件