均值滤波算法及实现

news2024/9/20 19:50:42

均值滤波器的使用场景:

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

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

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

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

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

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

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

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

相关文章

[003-02-10].第10节:Docker环境下搭建Redis主从复制架构

我的博客大纲 我的后端学习大纲 我的Redis学习大纲 1.cluster&#xff08;集群&#xff09;模式-docker版 哈希槽分区进行亿级数据存储 1.1.面试题&#xff1a;1~2亿条数据需要缓存&#xff0c;请问如何设计这个存储案例 1.回答&#xff1a;单机单台100%不可能&#xff0c;肯…

第十届能源材料与电力工程国际学术会议(ICEMEE 2024)

第十届能源材料与电力工程国际学术会议&#xff08;ICEMEE 2024) 2024 10th International Conference on Energy Materials and Electrical Engineering 重要信息 ICEMEE 2024已通过SPIE - The International Society for Optical Engineering (ISSN: 0277-786X)单独出版…

beego框架_golang web框架_使用介绍

beego简介 beego是一个用于快速开发Go应用的http框架&#xff0c;由Go语言方面的技术大牛设计。beego可以用来快速开发API、Web、后端服务等各种应用&#xff0c;是一个RESTful的框架&#xff0c;主要设计灵感来源于tornado、sinatra、flask这三个框架&#xff0c;但结合了Go本…

Postfix+Dovecot+Roundcube开源邮件系统搭建系列5:Roundcube安装配置(含Nginx+PHP部署配置)

1. PHP安装配置 参考wordpress 6.5.2版本安装记录 中关于PHP安装方法&#xff0c;此处不再详述。 修改php-fpm的启动用户和组为vmail&#xff0c;这一步是和nginx配置相呼应。配置文件/etc/opt/remi/php83/php-fpm.d/www.conf 下面几个配置&#xff1a; user vmail group vm…

Typora 1.5.8 版本安装下载教程 (轻量级 Markdown 编辑器),图文步骤详解,免费领取

文章目录 软件介绍软件下载安装步骤激活步骤 软件介绍 Typora是一款基于Markdown语法的轻量级文本编辑器&#xff0c;它的主要目标是为用户提供一个简洁、高效的写作环境。以下是Typora的一些主要特点和功能&#xff1a; 实时预览&#xff1a;Typora支持实时预览功能&#xff0…

CrossKD: Cross-Head Knowledge Distillation for Dense Object Detection

CrossKD&#xff1a;用于密集目标检测的交叉头知识蒸馏 论文链接&#xff1a;https://arxiv.org/abs/2306.11369v2 项目链接&#xff1a;https://github.com/jbwang1997/CrossKD Abstract 知识蒸馏(Knowledge Distillation, KD)是一种有效的学习紧凑目标检测器的模型压缩技术…

微服务:nacos

Nacos 由Alibaba推出的集成于SpringCloudAlibaba中的一款开源注册中心框架 主要功能: 注册中心 配置管理 nacos的安装和部署 nacos默认访问端口8848 docker pull nacos/nacos-server:1.2.0 docker run --env MODEstandalone --name nacos --restartalways -d -p 8848:8…

模型训练中出现loss为NaN怎么办?

文章目录 一、模型训练中出现loss为NaN原因1. 学习率过高2. 梯度消失或爆炸3. 数据不平衡或异常4. 模型不稳定5. 过拟合 二、 针对梯度消失或爆炸的解决方案1. 使用torch.autograd.detect_anomaly()2. 使用 torchviz 可视化计算图3. 检查梯度的数值范围4. 调整梯度剪裁 三、更具…

鸿蒙语言基础类库:【@system.request (上传下载)】

上传下载 说明&#xff1a; 从API Version 6开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.request]。本模块首批接口从API version 4开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import request from system.re…

C语言之指针的奥秘(三)

一、字符指针变量 在指针的类型中&#xff0c;有字符指针char*&#xff0c;一般使用&#xff1a; #include<stdio.h> int main() {char ch w;char* p &ch;*p w;return 0; } 还有一种方式&#xff1a; #include<stdio.h> int main() {const char* p &qu…

Android 10.0 Launcher3拖拽图标进入hotseat自适应布局功能实现一

1.前言 在10.0的系统rom定制化开发中&#xff0c;在对于launcher3的一些开发定制中&#xff0c;在对hotseat的一些开发中&#xff0c;需要实现动态hotseat居中 的功能&#xff0c;就是在拖拽图标进入和拖出hotseat&#xff0c;都可以保持hotseat居中的功能&#xff0c;接下来分…

html2canvas + jspdf 纯前端HTML导出PDF的实现与问题

前言 这几天接到一个需求&#xff0c;富文本编辑器的内容不仅要展示出来&#xff0c;还要实现展示的内容导出pdf文件。一开始导出pdf的功能是由后端来做的&#xff0c;然后发现对于宽度太大的图片&#xff0c;导出的pdf文件里部分图片内容被遮盖了&#xff0c;但在前端是正常显…

S参数入门

一、说明 S参数全称为散射参数&#xff0c;主要用来作为描述线性无源互联结构的一种行为模型&#xff0c;来源于网络分析方法。网络分析法是一种频域方法&#xff0c;在一组离散的频率点上&#xff0c;通过在输入和输出端口得到的参量完全描述线性时不变系统&#xff08;定义参…

园区AR导航系统构建详解:从三维地图构建到AR融合导航的实现

随着现代园区规模的不断扩大与功能的日益复杂&#xff0c;传统的二维地图导航已难以满足访客高效、精准定位的需求。园区内部错综复杂的布局、频繁变更的商户位置常常让访客感到迷茫&#xff0c;造成寻路上的时间浪费。园区AR导航系统以创新的技术手段&#xff0c;破解了私域地…

对redis进行深入学习

目录 1. 什么是redis&#xff1f;1.1 为什么使用redis作为缓存&#xff1f;1.1.0 数据库&#xff08;MySQL&#xff09;与 redis1. 存储介质不同&#xff08;408选手应该都懂hh&#xff09;2. 数据结构优化3. I/O模型差异4. CPU缓存友好性5. 单线程与多线程差异6. 持久化与缓存…

Volatility:分析MS10-061攻击

1、概述 # 1&#xff09;什么是 Volatility Volatility是开源的Windows&#xff0c;Linux&#xff0c;MaC&#xff0c;Android的内存取证分析工具。基于Python开发而成&#xff0c;可以分析内存中的各种数据。Volatility支持对32位或64位Wnidows、Linux、Mac、Android操作系统…

2024算力基础设施安全架构设计与思考(免费下载)

算网安全体系是将数据中心集群、算力枢纽、一体化大数据中心三个层级的安全需求进行工程化解耦&#xff0c;从国家安全角度统筹设计&#xff0c;通过安全 服务化方式&#xff0c;依托威胁情报和指挥协同通道将三层四级安全体系串联贯通&#xff0c;达成一体化大数据安全目标。 …

插画插件:成都亚恒丰创教育科技有限公司

【插画插件&#xff1a;数字创意时代的艺术加速器】 在数字化浪潮汹涌的今天&#xff0c;视觉艺术以其独特的魅力穿梭于互联网的每一个角落&#xff0c;成为连接人心、传递情感与信息的桥梁。而在这股创意洪流中&#xff0c;插画插件以其高效、便捷、个性化的特点&#xff0c;…

1219:马走日

#include<bits/stdc.h> using namespace std; int vis[8][2]{-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1};//构造偏移量数组 int t,n,m,x,y,ans;//棋盘总共由(n)(m)个点 bool st[100][100];//如果st[i][j]0 表示i,j这个坐标没有走过 st[a][b]1表示a,b这个坐标走过 void d…

【05】LLaMA-Factory微调大模型——初尝微调模型

上文【04】LLaMA-Factory微调大模型——数据准备介绍了如何准备指令监督微调数据&#xff0c;为后续的微调模型提供高质量、格式规范的数据支撑。本文将正式进入模型微调阶段&#xff0c;构建法律垂直应用大模型。 一、硬件依赖 LLaMA-Factory框架对硬件和软件的依赖可见以下…