均值滤波算法及实现

均值滤波器的使用场景:

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

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

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

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

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

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

蓝色曲线为经过均值滤波处理后的数据,虽然整体幅值降低了,但是如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.xdnf.cn/news/1483559.html

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

相关文章

spring是如何解决循环依赖的,为什么不是两级

1. Spring使用三级缓存来解决循环依赖问题 Spring使用三级缓存来解决循环依赖问题&#xff0c;‌而不是使用两级缓存。‌ 在Spring框架中&#xff0c;‌解决循环依赖的关键在于正确地管理Bean的生命周期和依赖关系。‌循环依赖指的是两个或多个Bean相互依赖&#xff0c;‌如果…

【JavaEE】volatile + final + wait-notify + join + park-unpark 相关原理

本文基于jdk8 本文所讲的一些原理都是在多线程中经常使用的内容。 参考&#xff1a;黑马程序员深入学习Java并发编程&#xff0c;JUC并发编程全套教程_哔哩哔哩_bilibili 目录 volatile原理 Java内存模型(JMM) 可见性&有序性 双重检查锁应用 final原理 设置final变量…

Spring-Boot基础--yaml

目录 Spring-Boot配置文件 注意&#xff1a; YAML简介 YAML基础语法 YAML:数据格式 YAML文件读取配置内容 逐个注入 批量注入 ConfigurationProperties 和value的区别 Spring-Boot配置文件 Spring-Boot中不用编写.xml文件&#xff0c;但是spring-Boot中还是存在.prope…

qml 实现一个listview

主要通过qml实现listvie功能&#xff0c;主要包括右键菜单&#xff0c;滚动条&#xff0c;拖动改变内容等&#xff0c;c 与 qml之间的变量和函数的调用。 main.cpp #include <QQuickItem> #include <QQmlContext> #include "testlistmodel.h" int main…

Haproy服务

目录 一.haproxy介绍 1.主要特点和功能 2.haproxy 调度算法 3.haproxy 与nginx 和lvs的区别 二.安装 haproxy 服务 1. yum安装 2.第三方rpm 安装 3.编译安装haproxy 三.配置文件详解 1.官方地址配置文件官方帮助文档 2.HAProxy 的配置文件haproxy.cfg由两大部分组成&…

什么是正则表达式,如何在 Python 中使用?

什么是正则表达式 正则表达式&#xff08;Regular Expression&#xff0c;简称Regex&#xff09;是一种用于匹配字符串中字符模式的工具。它是由普通字符&#xff08;例如字母、数字&#xff09;以及一些特殊字符&#xff08;称为元字符&#xff09;组成的字符序列。这种模式用…

FastAPI 学习之路(六十)打造系统的日志输出

我们要搭建日志系统&#xff0c;可以使用loguru&#xff0c;很不错的一个开源日志系统 pip install loguru 我们在common创建log.py&#xff0c;使用方式也很简单 import os import timefrom loguru import logger# 日志的路径 log_path os.path.join(os.getcwd(), "log…

【electron】 快速启动electron 应用

学无止境&#xff1a; 最近在搞electron项目&#xff0c;最重要的是总结 &#xff0c;写下来总不会忘记&#xff0c;也希望给大家参考一下&#xff0c;有不对的地方希望大家多指点。 快速启动electron 应用 1 克隆示例项目的仓库 git clone https://github.com/electron/ele…

PCB(印制电路板)制造涉及的常规设备

印制电路板&#xff08;PCB&#xff09;的制造涉及多种设备和工艺。从设计、制作原型到批量生产&#xff0c;每个阶段都需要不同的专业设备。以下是一些在PCB制造过程中常见的设备&#xff1a; 1. 计算机辅助设计&#xff08;CAD&#xff09;软件&#xff1a; - 用于设计PC…

又缩水Unity7月闪促限时4折活动模块化角色模板编辑器场景美术插件拖尾怪物3D模型UI载具AI对话TPS飞机RPG和FPS202407

Flash Deals are Coming Back! 限时抢购又回来了&#xff01; July 17, 2024 8:00:00 PT to July 24, 2024 7:59:00 PT 太平洋时间 2024 年 7 月 17 日 8&#xff1a;00&#xff1a;00 至 2024 年 7 月 24 日 7&#xff1a;59&#xff1a;00&#xff08;太平洋时间&#xff09;…

模块化沙箱:解锁数据防泄密的终极密码

在这个数字化时代&#xff0c;数据已经成为企业最宝贵的资产之一。然而&#xff0c;数据泄露的威胁如同暗夜中的幽灵&#xff0c;随时可能侵袭企业的信息安全防线。面对日益复杂的内外部风险&#xff0c;企业亟需一种既高效又灵活的安全解决方案&#xff0c;来保护其核心数据不…

Linux编辑器——vim的使用

目录 vim的基本概念 命令模式 底行模式 插入模式 注释和取消注释 普通用户进行sudo提权 vim配置问题 vim的基本概念 一般使用的vim有三种模式&#xff1a; 命令模式 底行模式和插入模式&#xff0c;可以进行转换&#xff1b; vim filename 打开vim&#xff0c;进入的…

【.NET全栈】ASP.NET开发Web应用——AJAX开发技术

文章目录 前言一、ASP.NET AJAX基础1、AJAX技术简介2、ASP.NET AJAX技术架构 二、ASP.NET AJAX服务器端扩展1、声明ScriptManager控件2、使用ScriptManager分发自定义脚本3、在ScriptManager中注册Web服务4、处理ScriptManager中的异常5、编程控制ScriptManager控件6、使用Upda…

【论文解读】VoxelNeXt: Fully Sparse VoxelNet for 3D Object Detection and Tracking

VoxelNeXt 摘要引言方法Sparse CNN Backbone AdaptationSparse Prediction Head 3D Tracking实验结论 摘要 3D物体检测器通常依赖于手工制作的方法&#xff0c;例如锚点或中心&#xff0c;并将经过充分学习的2D框架转换为3D。因此&#xff0c;稀疏体素特征需要通过密集预测头进…

分布式搜索引擎ES-Elasticsearch进阶

1.head与postman基于索引的操作 引入概念&#xff1a; 集群健康&#xff1a; green 所有的主分片和副本分片都正常运行。你的集群是100%可用 yellow 所有的主分片都正常运行&#xff0c;但不是所有的副本分片都正常运行。 red 有主分片没能正常运行。 查询es集群健康状态&…

Java流的概念及API

流的概念 流&#xff08;Stream)的概念代表的是程序中数据的流通&#xff0c;数据流是一串连续不断的数据的集合。在Java程序中&#xff0c;对于数据的输入/输出操作是以流(Stream)的方式进行的。可以把流分为输入流和输出流两种。程序从输入流读取数据&#xff0c;向输出流写入…

曲轴自动平衡机:提升制造精度与效率的利器

在现代制造业中&#xff0c;曲轴作为发动机的核心部件之一&#xff0c;其质量和性能直接影响着整个发动机的运行效果。而曲轴自动平衡机的出现&#xff0c;为曲轴的生产制造带来了显著的优势。 一、高精度平衡校正 曲轴自动平衡机采用先进的传感技术和精密的测量系统&#xff0…

【TortoiseGitPlink提示输入密码解决方法】

问题&#xff1a;TortoiseGitPlink提示输入密码 解决方案 参考链接&#xff1a;TortoiseGitPlink提示输入密码解决方法 但后半部分和上文不同&#xff0c;点击图中 Load Putty Key 即可。

基于FPGA的多路选择器

目录 一、组合逻辑 二、多路选择器简介&#xff1a; 三、实战演练 摘要&#xff1a;本实验设计并实现了一个简单的多路选择器&#xff0c;文章后附工程代码 一、组合逻辑 组合逻辑是VerilogHDL设计中的一个重要组成部分。从电路本质上讲&#xff0c;组合逻辑电路的特点是输…

MathType加载项被word禁用怎么办 MathType加载到Word不能用

Word中的MathType加载项是指将MathType软件与Word文档进行关联的一项功能。它允许用户在Word中直接使用MathType的功能&#xff0c;方便地输入和编辑数学公式等内容。通过加载项&#xff0c;MathType的强大数学公式编辑能力可以与Word的文档处理功能相结合&#xff0c;提高工作…