均值滤波算法及实现

均值滤波器的使用场景:

均值滤波器使用于处理一些如上述蓝色线的高斯噪声场景

红色曲线是经过均值滤波处理后的数据。主要因为均值滤波设置数据缓冲区(也即延时周期),使得测量值经过缓冲不会出现特别大的变化。

黄色曲线为高斯噪声,红色曲线为经过均值滤波处理后的数据。

如果想要更好的滤波效果:

  • 增加滤波和,也即往后多取几帧数据进行累加求和,再处以累加次数;
  • 嵌套使用均值滤波,也即用上一均值滤波输出作为本次滤波输入;

均值滤波不适合处理类似橙色曲线的脉冲噪声的数据

蓝色曲线为经过均值滤波处理后的数据,虽然整体幅值降低了,但是如61-69区间,实际测量只在61附近出现一次突变,但很快下降正常,但经过均值滤波处理,虽然幅值被降低,但其实也没有达到理想,反而将突变脉冲以一个恒定的值持续了9s(累加次数,也即缓冲周期)。

目标脉冲值是0,未经过均值滤波处理在61s出现一较大突变,由于系统本身的阻尼等作用,系统实际不会产生太大的振荡,可能由于来的比较快,系统会微微抖一下就稳定。但如果使用均值滤波处理后,在61s处的尖峰脉冲硬是被拉长了9帧才退出,系统稳定性必定太差。因此脉冲信号噪声不适合用均值滤波,可以考虑使用低通滤波!


均值滤波作用

均值滤波是一种常见的图像处理技术,用于平滑图像中的噪声或细节。它的主要用途包括:

  1. 去除噪声:图像中的噪声是由于图像采集过程中的各种因素引入的不希望的干扰。均值滤波可以通过计算像素周围邻域内像素的平均值来平滑图像,并减少噪声的影响。

  2. 平滑图像:在某些情况下,图像中的细节过多或变化过于剧烈,可能会导致视觉上的不连续或不平滑感觉。均值滤波可以通过平均周围像素的值来减少这些细节,使图像更加平滑。

  3. 降低图像分辨率:在一些应用中,需要降低图像的分辨率以减少计算或存储的需求。均值滤波可以通过对图像进行平滑来实现降低分辨率的效果。

  4. 图像预处理:在某些图像处理任务中,如图像分割或边缘检测,均值滤波可以作为预处理步骤,帮助提取更准确的特征或边缘。

需要注意的是,均值滤波是一种简单且常用的滤波方法,但它可能会导致图像细节的模糊或平滑化。对于某些应用场景,可能需要考虑其他更高级的滤波技术,以在平滑图像的同时保留更多的细节信息。


均值滤波实现:

#include <stdio.h>
#include <stdlib.h>double* weightedMeanFilter(double* input, int length, int windowSize, double* weights) {double* output = (double*)malloc(length * sizeof(double)); // 创建新数组int halfWindowSize = windowSize / 2;for (int i = 0; i < length; i++) {double weightedSum = 0.0;double weightSum = 0.0;for (int j = i - halfWindowSize; j <= i + halfWindowSize; j++) {if (j >= 0 && j < length) {weightedSum += input[j] * weights[j - (i - halfWindowSize)];weightSum += weights[j - (i - halfWindowSize)];}}output[i] = weightedSum / weightSum; // 计算加权平均值}return output;
}int main() {double input[] = {1.2, 2.3, 3.4, 4.5, 5.6};int length = sizeof(input) / sizeof(input[0]);int windowSize = 3;double weights[] = {0.1, 0.6, 0.3}; // 示例权重系数数组double* output = weightedMeanFilter(input, length, windowSize, weights);printf("Input: ");for (int i = 0; i < length; i++) {printf("%.2f ", input[i]);}printf("\nOutput: ");for (int i = 0; i < length; i++) {printf("%.2f ", output[i]);}free(output); // 释放动态分配的内存return 0;
}
/*
Input: 1.20 2.30 3.40 4.50 5.60 
Output: 1.57 2.52 3.62 4.72 5.44
*/

增加权重系数可以使均值滤波更加灵活,以更好地适应不同的应用场景和需求。具体来说,增加权重系数的意义包括:

  1. 强调重要区域:通过调整权重系数,可以使某些像素在计算均值时具有更大的贡献。这样可以使均值滤波更加关注重要的区域,从而保留或突出这些区域的细节。例如,在人脸识别中,可以增加权重系数以突出人脸区域,以便更好地提取人脸特征。

  2. 抑制噪声或异常值:某些像素可能受到噪声或异常值的干扰,导致它们的值与周围像素明显不同。通过降低这些像素的权重系数,可以减少它们对均值的影响,从而抑制噪声或异常值的影响。

  3. 考虑空间相关性:在一些情况下,像素之间的空间关系对滤波结果的影响很大。通过调整权重系数以考虑像素之间的空间相关性,可以更好地保留图像的结构信息。例如,可以使用高斯加权系数来加权计算均值,以便更好地平滑图像并保留边缘。

  4. 自适应滤波:通过根据像素的特征或属性来动态调整权重系数,可以实现自适应滤波。这意味着不同的像素可以具有不同的权重,从而使滤波更加适应图像的局部特征。例如,可以根据像素的梯度值或纹理信息来调整权重系数,以实现更好的平滑效果。

总之,增加权重系数可以提供更多的灵活性和控制力,使均值滤波能够更好地适应不同的图像处理需求,并在平滑图像的同时保留重要的细节。

#include <stdio.h>
#include <stdlib.h>double* weightedMeanFilter(double* input, int length, int windowSize, double* weights) {double* output = (double*)malloc(length * sizeof(double)); // 创建新数组int halfWindowSize = windowSize / 2;for (int i = 0; i < length; i++) {double weightedSum = 0.0;double weightSum = 0.0;for (int j = i - halfWindowSize; j <= i + halfWindowSize; j++) {if (j >= 0 && j < length) {weightedSum += input[j] * weights[j - (i - halfWindowSize)];weightSum += weights[j - (i - halfWindowSize)];}}output[i] = weightedSum / weightSum; // 计算加权平均值}return output;
}int main() {double input[] = {1.2, 2.3, 3.4, 4.5, 5.6};int length = sizeof(input) / sizeof(input[0]);int windowSize = 3;double weights[] = {0.1, 0.6, 0.3}; // 示例权重系数数组double* output = weightedMeanFilter(input, length, windowSize, weights);printf("Input: ");for (int i = 0; i < length; i++) {printf("%.2f ", input[i]);}printf("\nOutput: ");for (int i = 0; i < length; i++) {printf("%.2f ", output[i]);}free(output); // 释放动态分配的内存return 0;
}
/*
Input: 1.20 2.30 3.40 4.50 5.60 
Output: 1.57 2.52 3.62 4.72 5.44
*/


结果对比:


参考:

1、简单的均值滤波讲解(附代码)_哔哩哔哩_bilibili

2、https://www.cnblogs.com/faithlocus/p/17532226.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【iOS】—— 消息传递和消息转发

【iOS】—— 消息传递和消息转发 1. 消息传递SEL选择子IMP快速查找汇编代码查找过程总结消息转送快速查找IMP 慢速查找总结消息传递慢速查找IMP 2. 消息转发动态决议动态解析添加方法 快速转发慢速转发 总结动态决议消息转发消息的三次拯救 1. 消息传递 在iOS中&#xff0c;消…

一、单例模式

文章目录 1 基本介绍2 实现方式2.1 饿汉式2.1.1 代码2.1.2 特性 2.2 懒汉式 ( 线程不安全 )2.2.1 代码2.2.2 特性 2.3 懒汉式 ( 线程安全 )2.3.1 代码2.3.2 特性 2.4 双重检查2.4.1 代码2.4.2 特性 2.5 静态内部类2.5.1 代码2.5.2 特性 2.6 枚举2.6.1 代码2.6.2 特性 3 实现的要…

谷粒商城-全文检索-ElasticSearch

1.简介 一个分布式的开源搜索和分析引擎,可以 秒 级的从海量数据中检索 主要功能:做数据的检索和分析(MySQL专攻于数据的持久化存储与管理CRUD达到百万以上的数据MSQL就会很慢,海量数据的检索和分析还是要用ElasticSearch) 用途:我们电商项目里的所有的检索功能都是由Elasti…

基于X86+FPGA+AI数字化医疗设备:全自动尿沉渣检测仪

助力数字医疗发展&#xff0c;信迈可提供全自动尿沉渣检测仪专用计算机 随着信息技术的不断进步&#xff0c;医疗也进入了一个全新的数字化时代。首先是医疗设备的数字化&#xff0c;大大丰富了医疗信息的内涵和容量&#xff0c;具有广阔的市场发展前景。 数字化医疗设备&…

使用Redis的SETNX命令实现分布式锁

什么是分布式锁 分布式锁是一种用于在分布式系统中控制多个节点对共享资源进行访问的机制。在分布式系统中&#xff0c;由于多个节点可能同时访问和修改同一个资源&#xff0c;因此需要一种方法来确保在任意时刻只有一个节点能够对资源进行操作&#xff0c;以避免数据不一致或…

嵌入式香橙派人工智能AI开发板详细操作与远程聊天实现

大家好&#xff0c;今天给大分享一个OrangePi AIpro&#xff08;20T&#xff09;采用昇腾作为主控芯片的开发板&#xff0c;开箱以及对应功能的详细实现。 第一&#xff1a;板子基本介绍 接通电源给对应的开发板上电&#xff0c;观察其中的现象&#xff0c;如下&#xff1a; 注…

基于HAL库的stm32的OLED显示屏显示(IIC)

OLED OLED&#xff0c;即有机发光二极管( Organic Light Emitting Diode )。OLED由于同时具备自发光&#xff0c;不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性&#xff0c;被认为是下一代的平面显示器…

龙国专利局瑞数6

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(lianxi a…

配置和保护SSH

使用SSH访问远程命令行 描述Secure Shell SSH&#xff08;Secure Shell&#xff09; 是一种网络协议&#xff0c;用于在不安全的网络上安全地进行系统管理和数据传输。它最初由 Tatu Ylnen 于1995年设计&#xff0c;并成为保护网络服务免受攻击的标准。SSH提供了多种功能&…

基于SpringBoot+Vue的广场舞团系统(带1w+文档)

基于SpringBootVue的广场舞团系统(带1w文档) 基于SpringBootVue的广场舞团系统(带1w文档) 广场舞团&#xff0c;为用户随时随地查看广场舞团信息提供了便捷的方法&#xff0c;更重要的是大大的简化了管理员管理广场舞团信息的方式方法&#xff0c;更提供了其他想要了解广场舞团…

基于Trace的类型特化动态语言JIT编译

文章目录 Explain一、简介二、一个跟踪运行的示例三、跟踪树3.1 Traces类型特化&#xff08;Type specialization&#xff09; 3.2 Trace Trees3.3 黑名单&#xff08;Blacklisting&#xff09; 四、嵌套跟踪树4.1 Nesting Algorithm4.2 Blacklisting with Nesting 五、跟踪树优…

【Pytorch】一文向您详细介绍 torch.randn_like()

&#x1f389;&#x1f525;【Pytorch】一文向您详细介绍 torch.randn_like() &#x1f525;&#x1f389; 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; …

滑动窗口题目

题目描述&#xff1a; 计算两个字符串str1和str2在给定的含有n个元素的字符串数组strs中出现的最短距离。 详细解释&#xff1a; 定义整数变量n&#xff0c;用于存储字符串数组strs的长度。定义一个vector<string>类型的变量strs&#xff0c;用于存储输入的字符串。定义…

破解反爬虫策略 /_guard/auto.js(一) 原理

背景 当用代码或者postman访问一个网站的时候&#xff0c;访问他的任何地址都会返回<script src"/_guard/auto.js"></script>&#xff0c;但是从浏览器中访问显示的页面是正常的&#xff0c;这种就是网站做了反爬虫策略。本文就是带大家来破解这种策略&…

4.3 最小二乘近似

一、最小二乘解 A x b A\boldsymbol x\boldsymbol b Axb 经常无解&#xff0c;一般是因为方程太多了。矩阵 A A A 的行比列要多&#xff0c;即方程要多余未知数&#xff08; m > n m>n m>n&#xff09;。 n n n 个列只能张成 m m m 空间的一小部分&#xff0c;除非…

面向铁路、地铁旅客信息系统(PIS)的上架型整机,铁路专用M12网络接口,满足欧洲铁路应用标准

上架型整机 2U 19寸上架型整机&#xff0c;采用高性能低功耗处理器&#xff0c;能应用在宽温环境下&#xff0c;并满足欧洲铁路应用标准EN50155关于电磁兼容性&#xff0c;冲击和振动测试试验的要求&#xff0c;是一款面向铁路、地铁旅客信息系统&#xff08;PIS&#xff09;的…

C# 关于 PaddleOCRSharp OCR识别的疲劳测试

目录 关于 PaddleOCRSharp 应用范例演示 ​范例运行环境 疲劳测试 添加组件库 方法设计 调用示例 小结 关于 PaddleOCRSharp PaddleOCRSharp 是百度飞桨封装的.NET版本 OCR dll 类库&#xff0c;OCR&#xff08;Optical Character Recognition&#xff09;工具可以将…

【Java面向对象】抽象类和接口

文章目录 1.抽象类2.常见的抽象类2.1 Number类2.2 Calendar 和GregorianCalendar 3.接口4.常见接口4.1 Comparable 接口4.2 Cloneable 接口4.3 深浅拷贝 5.类的设计原则 1.抽象类 在继承的层次结构中&#xff0c;每个新的子类都使类变得更加明确和具体。如果从一个子类向父类追…

Unty 崩溃问题(Burst 1.8.2)

错误代码&#xff1a; Assertion failed on expression: exception SCRIPTING_NULL UnityEngine.StackTraceUtility:ExtractStackTrace () Unity.Burst.BurstCompiler:SendRawCommandToCompiler (string Unity版本&#xff1a;2021.3.17F1&#xff0c;Burst 1.8.2 表现&…

python安装talib库教程

【talib介绍】 Talib介绍 Talib&#xff0c;全称“Technical Analysis Library”&#xff0c;即技术分析库&#xff0c;是一个广泛应用于金融量化领域的Python库。该库由C语言编写&#xff0c;支持Python调用&#xff0c;为投资者、交易员和数据分析师提供了强大的技术分析工…