【滤波第二期】中值滤波的原理和C代码

c252ecec54fb6f3a9739e75631e899a7.png

中值滤波是一种非线性数字滤波技术,主要应用于信号处理和图像处理领域,用于减小信号中的噪声和离群值。中值滤波的核心思想是通过计算一组数据点的中间值,以抑制脉冲噪声等离群值的影响,从而实现信号的平滑处理。

1,中值滤波的操作步骤如下:

窗口设置: 中值滤波使用一个固定大小的窗口覆盖信号中的数据点。这个窗口的大小是根据具体应用需求事先确定的,通常是奇数,例如3x3、5x5等。

数据排序: 在每个窗口位置,将窗口内的数据点按照大小进行排序。这样,窗口中的数据就被排列成一个有序序列。

中值计算: 选择排序后序列的中间位置的值作为滤波结果。如果窗口大小是奇数,中值就是排序序列的正中间的值;如果窗口大小是偶数,中值通常是中间两个值的平均值。

2,中值滤波的原理可通过以下几个关键概念来理解:

排序特性: 中值滤波的核心在于对数据进行排序。排序后,中间值处于排序序列的中间位置,因此能够较好地反映数据的趋势

非线性特性: 与线性滤波器不同,中值滤波是一种非线性滤波方法。它对噪声和离群值的敏感性相对较低,因为中值主要受窗口中排序序列的中间位置的影响,而不受其他数值的大小影响。

适用于离散信号: 中值滤波通常适用于处理离散信号,例如时间序列中的测量数据。在图像处理中,中值滤波也常被用于去除图像中的噪声。

中值滤波的优点在于它能够有效抑制离群值,同时保持信号边缘信息,不引入额外的相位变化。然而,中值滤波也有一些缺点,比如在处理高斯噪声等均值为零的噪声时效果相对较差,因为中值滤波并不是最优的线性估计器。

3,示例代码:

#include <stdio.h>
#define WINDOW_SIZE 3
// 函数原型
float medianFilter(float data[], int dataSize);
int main() {
// 输入数据
float inputData[] = {1.0, 3.0, 5.0, 2.0, 8.0, 6.0, 4.0, 7.0, 9.0, 10.0};
int dataSize = sizeof(inputData) / sizeof(inputData[0]);
// 创建输出数组
    float outputData[dataSize];
// 对每个数据点应用中值滤波
for (int i = 0; i < dataSize; ++i) {
        outputData[i] = medianFilter(inputData, dataSize);
    }
// 打印结果
printf("Original Data:\n");
for (int i = 0; i < dataSize; ++i) {
printf("%f ", inputData[i]);
    }
printf("\nFiltered Data:\n");
for (int i = 0; i < dataSize; ++i) {
printf("%f ", outputData[i]);
    }
return 0;
}
// 计算中值滤波
float medianFilter(float data[], int dataSize) {
float window[WINDOW_SIZE];
for (int i = 0; i < dataSize; ++i) {
// 填充窗口
for (int j = 0; j < WINDOW_SIZE; ++j) {
int index = i - (WINDOW_SIZE / 2) + j;
// 处理窗口边界情况
if (index < 0) {
                window[j] = data[0];
            } else if (index >= dataSize) {
                window[j] = data[dataSize - 1];
            } else {
                window[j] = data[index];
            }
        }
// 对窗口内数据进行排序
for (int j = 0; j < WINDOW_SIZE - 1; ++j) {
for (int k = 0; k < WINDOW_SIZE - j - 1; ++k) {
if (window[k] > window[k + 1]) {
// 交换
float temp = window[k];
                    window[k] = window[k + 1];
                    window[k + 1] = temp;
                }
            }
        }
// 选择中间值作为滤波结果
float median = window[WINDOW_SIZE / 2];
return median;
    }
}

在这个简单的示例中,WINDOW_SIZE 定义了中值滤波的窗口大小。medianFilter 函数对每个数据点应用中值滤波,处理窗口边界情况以确保滤波窗口不越界。请注意,这只是一个基本的实现,实际应用中可能需要根据具体需求进行调整和优化。

==========

往期回顾:

移动平均滤波的原理和C代码

MOS管防反接电路

STM32的看门狗原理和示例代码

Keil仿真调试STM32与LED

==========

519ebda92a56d89201adc99514835a79.png

d26d3b963ce371adc97cf8b5a6c523ae.png

8872287380561b04938d932b6252bfe2.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SaToken利用Redis做持久化

官网解释 官网解释 教程 引入依赖 <!-- 提供Redis连接池 --> <dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId> </dependency><!-- Sa-Token 整合 Redis &#xff08;使用 jdk 默认序…

QT使用SQLite(打开db数据库以及对数据库进行增删改查)

QTSQLite 在QT中使用sqlite数据库&#xff0c;有多种使用方法&#xff0c;在这里我只提供几种简单&#xff0c;代码简短的方法&#xff0c;包括一些特殊字符处理。 用SQlite建立一个简单学生管理数据库 数据库中有两个表一个是class和student。 class表结构 student表结果…

GitHub Copilot试用指南

GitHub Copilot试用指南 首先读这个文档&#xff0c;按照步骤开启30天的试用&#xff1a;管理个人帐户的 GitHub Copilot 订阅 然后读这个文档&#xff1a;使用 IDE 中的 GitHub Copilot 聊天 &#xff0c;在你习惯使用的IDE中配置copilot&#xff0c;暂时好像只支持jetbrai…

Android Edittext进阶版(Textfieids)

一、Text fieids 允许用户在 UI 中输入文本&#xff0c;TextInputLayout TextInputEditText。 在 Text fieids 没出来(我不知道)前&#xff0c;想实现这个功能就需要自己自定义控件来实现这个功能。 几年前做个上面这种样式(filled 填充型)。需要多个控件组合 动画才能实现&a…

YoloV5改进策略:Swift Parameter-free Attention,无参注意力机制,超分模型的完美迁移

摘要 https://arxiv.org/pdf/2311.12770.pdf https://github.com/hongyuanyu/SPAN SPAN是一种超分网络模型。SPAN模型通过使用参数自由的注意力机制来提高SISR的性能。这种注意力机制能够增强重要信息并减少冗余,从而在图像超分辨率过程中提高图像质量。 具体来说,SPAN模…

qt 5.15.2 主窗体事件及绘制功能

qt 5.15.2 主窗体事件及绘制功能 显示主窗体效果图如下所示&#xff1a; main.cpp #include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.setFixedWidth(600);w.setFixedHeight(6…

java学习part34collect和map

153-集合框架-数组的特点、弊端与集合框架体系介绍_哔哩哔哩_bilibili 1.以前的数组 2.常用 3.Collection add只能加object&#xff0c;如果有基本类型会装箱 3.2集合和数组转换 3.3往集合添加对象的注意事项 4.迭代器 容易越界 一般不用 常用好用 5.for each 类似c的for( …

鸿蒙4.0开发笔记之ArkTS装饰器语法基础之监听者模式@Watch案例讲解(十四)

1、Watch定义 Watch实际是指状态变量更改通知。如果开发者需要关注某个状态变量的值是否改变&#xff0c;可以使用Watch为状态变量设置回调函数&#xff08;监听函数&#xff09;。 Watch用于监听状态变量的变化&#xff0c;当状态变量变化时&#xff0c;Watch的回调方法将被…

Hadoop实验putty文件

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 很多朋友反馈做hadoop实验中的putty找不到Connection-SSH-Auth路径下找不到Private key for authentication私有密钥&#xff0c;无法将转…

非标设计之气缸类型

空压机&#xff1a; 空压机又称空气压缩机&#xff0c;简单来说就是将机械能转化为压力能来进行工作的&#xff0c;空压机在电力行业应用比较多&#xff0c;除了在电力行业应用较多外&#xff0c;其实空压机还有一个比较常见的用途就是用来制冷和分离气体&#xff0c;输送气体…

EM32DX-C4【C#】

1外观&#xff1a; J301 直流 24V 电源输入 CAN0 CAN0 总线接口 CAN1 CAN1 总线接口 J201 IO 接线段子 S301-1、S301-2 输出口初始电平拨码设置 S301-3~S301-6 模块 CAN ID 站号拨码开关 S301-7 模块波特率拨码设置 S301-8 终端电阻选择开关 2DI&#xff1a; 公共端是…

Gson 自动生成适配器插件

在json解析方面 我们常见有下面几方面困扰 1. moshi code-gen能自动生成适配器,序列化效率比gson快,但是自定义程度不如gson,能java kotlin共存 且解决了默认值的问题 2.gson api 强大自由,但是 第一次gson的反射缓存比较慢,而且生成对象都是反射,除非主动注册com.google.gson…

SQL Sever 基础知识 - 数据筛选(1)

SQL Sever 基础知识 - 四、数据筛选 四、筛选数据第1节 DISTINCT - 去除重复值1.1 SELECT DISTINCT 子句简介1.2 SELECT DISTINCT 示例1.2.1 DISTINCT 一列示例1.2.2 DISTINCT 多列示例 1.2.3 DISTINCT 具有 null 值示例1.2.4 DISTINCT 与 GROUP BY 对比 第2节 WHERE - 过滤查询…

翻译: 生成式人工智能的工作原理How Generative AI works

ChatGPT 和 Bard 等系统生成文本的能力几乎像魔法一样。它们确实代表了 AI 技术的一大步进。但是文本生成到底是如何工作的呢&#xff1f;在这个视频中&#xff0c;我们将看看生成式 AI 技术的底层原理&#xff0c;这将帮助你理解你可以如何使用它&#xff0c;以及何时可能不想…

免费的SEO外链发布工具,提升排名的利器

互联网已经成为信息传播和商业发展的重要平台。而对于拥有网站的个人、企业来说&#xff0c;如何让自己的网站在搜索引擎中脱颖而出&#xff1f;SEO&#xff08;Search Engine Optimization&#xff09;作为提高网站在搜索引擎中排名的关键手段. 什么是SEO外链&#xff1f; S…

【数据结构】最短路径——Floyd算法

一.问题描述 给定带权有向图G&#xff08;V&#xff0c;E&#xff09;&#xff0c;对任意顶点 V &#xff08;ij)&#xff0c;求顶点到顶点的最短路径。 转化为&#xff1a; 多源点最短路径求解问题 解决方案一&#xff1a; 每次以一个顶点为源点调用Dijksra算法。时间复杂…

根据已有安装的cuda配置合适的pytorch环境

目前网络上根据电脑配置安装合适的深度学习环境的帖子已经很多了&#xff0c;但是现实中会出现很久之前已经安装了对应的cuda&#xff0c;但是现在忘记了当时安装的是什么版本。本文针对这一问题展开攻略。 1 cuda安装版本查询 我们在查询自己应该安装什么版本的cuda时&#…

前端——html拖拽原理

文章目录 ⭐前言⭐draggable属性&#x1f496; api&#x1f496; 单向拖动示例&#x1f496; 双向拖动示例 ⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端——html拖拽原理。 vue3系列相关文章&#xff1a; vue3 fastapi 实现选择目录所有文…

仅 CSS 阅读进度条

为了构建一个阅读进度条&#xff0c;即显示用户向下滚动时阅读文章的进度&#xff0c;很难不考虑 JavaScript。但是&#xff0c;事实证明&#xff0c;您也可以使用纯 CSS 构建阅读进度条。 从本质上讲&#xff0c;一个名为 animation-timeline 的新实验性 CSS 属性可以让你指定…

【工具使用-Audition】如何使用Audition频谱分析

一&#xff0c;简介 本文以Audition 2020为例&#xff0c;介绍如何生成频谱分析的图像。 二&#xff0c;操作步骤 使用快捷键“shift D” 三&#xff0c;总结 本文主要介绍如何查看频谱分析&#xff0c;供参考。