均值滤波器的原理及实现

2024-09-02 15:38
文章标签 实现 原理 均值 滤波器

本文主要是介绍均值滤波器的原理及实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.均值滤波器

平滑线性空间滤波器的输出是包含在滤波器模板邻域内的像素的简单平均值,也就是均值滤波器。均值滤波器也是低通滤波器,均值滤波器很容易理解,即把邻域内的平均值赋给中心元素。

均值滤波器用来降低噪声,均值滤波器的主要应用是去除图像中的不相关细节,不相关是指与滤波器的模板相比较小的像素区域。模糊图片以便得到感兴趣物体的粗略描述,因此那些较小的物体的灰度就会与背景混合在一起,较大的物体则变的像斑点而易于检测。模板的大小由那些即将融入背景中的物体尺寸决定。

均值滤波器的缺点是存在着边缘模糊的问题。

均值滤波器的模板由标准像素平均和加权平均之分。如下图所示

2 C++实现均值滤波器

#include <iostream>
#include<opencv2/opencv.hpp>void getCount(double *count,int dim)
{int mn=dim*dim;for(int i=0;i<dim*dim;i++){count[i]=1.0/mn;}
}void getCountWeight(double *count,int dim)
{int mn=dim*dim;for(int i=0;i<mn;i++){if(i==mn/2)count[i]=1./2;elsecount[i]=(1/2.)*(1./(mn-1));}
}void meanFilter(cv::Mat &dst,cv::Mat &img,int dim){int channels=img.channels();dst=cv::Mat::zeros(img.size(),img.type());double count[dim*dim]={0};getCountWeight(count,dim);for(int row=0;row<img.rows;row++){for(int col=0;col<img.cols;col++){if(row>=dim/2&&row<img.rows-dim/2&&col>=dim/2&&col<img.cols-dim/2){int c=0;double sum1=0;double sum2=0;double sum3=0;for(int i=row-dim/2;i<=row+dim/2;i++){for(int j=col-dim/2;j<=col+dim/2;j++){if(channels==1){sum1+=count[c]*img.at<uchar>(i,j);}else if(channels==3){sum1+=count[c]*img.at<cv::Vec3b>(i,j)[0];sum2+=count[c]*img.at<cv::Vec3b>(i,j)[1];sum3+=count[c]*img.at<cv::Vec3b>(i,j)[2];}c++;}}if(channels==1){dst.at<uchar>(row,col)=(int)sum1;}else if(channels==3){dst.at<cv::Vec3b>(row,col)[0]=(int)sum1;dst.at<cv::Vec3b>(row,col)[1]=(int)sum2;dst.at<cv::Vec3b>(row,col)[2]=(int)sum3;}}else {if(channels==1)dst.at<uchar>(row, col) = img.at<uchar>(row, col);else if(channels==3){dst.at<cv::Vec3b>(row,col)[0]=img.at<cv::Vec3b>(row,col)[0];dst.at<cv::Vec3b>(row,col)[1]=img.at<cv::Vec3b>(row,col)[1];dst.at<cv::Vec3b>(row,col)[2]=img.at<cv::Vec3b>(row,col)[2];}}}}
}int main() {cv::Mat src=cv::imread("/home/dyf/Documents/数字图像/空间滤波器/Mean-filter/3.png",0);cv::Mat dst,dst1;cv::imshow("src",src);meanFilter(dst,src,3);cv::imshow("dst",dst);cv::blur(src,dst1,cv::Size(3,3));cv::imshow("dst1",dst1);cv::waitKey(0);return 0;
}

3 均值滤波器处理效果

原图像

下图左侧为使用标准均值方法处理的结果,右侧为opencv所带的均值滤波器处理结果

 

原图像:

左侧为带权重均值处理结果(中心位置为0.5,其他的邻域平分0.5)   右侧为标准均值处理结果 

这篇关于均值滤波器的原理及实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1130370

相关文章

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

基于C#实现PDF文件合并工具

《基于C#实现PDF文件合并工具》这篇文章主要为大家详细介绍了如何基于C#实现一个简单的PDF文件合并工具,文中的示例代码简洁易懂,有需要的小伙伴可以跟随小编一起学习一下... 界面主要用于发票PDF文件的合并。经常出差要报销的很有用。代码using System;using System.Col

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Python实现将实体类列表数据导出到Excel文件

《Python实现将实体类列表数据导出到Excel文件》在数据处理和报告生成中,将实体类的列表数据导出到Excel文件是一项常见任务,Python提供了多种库来实现这一目标,下面就来跟随小编一起学习一... 目录一、环境准备二、定义实体类三、创建实体类列表四、将实体类列表转换为DataFrame五、导出Da

Java操作PDF文件实现签订电子合同详细教程

《Java操作PDF文件实现签订电子合同详细教程》:本文主要介绍如何在PDF中加入电子签章与电子签名的过程,包括编写Word文件、生成PDF、为PDF格式做表单、为表单赋值、生成文档以及上传到OB... 目录前言:先看效果:1.编写word文件1.2然后生成PDF格式进行保存1.3我这里是将文件保存到本地后

Python实现数据清洗的18种方法

《Python实现数据清洗的18种方法》本文主要介绍了Python实现数据清洗的18种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录1. 去除字符串两边空格2. 转换数据类型3. 大小写转换4. 移除列表中的重复元素5. 快速统