当前位置: 首页 > news >正文

图像处理基础(3):均值滤波器及其变种

均值滤波器可以归为低通滤波器,是一种线性滤波器,其输出为邻域模板内的像素的简单平均值,主要用于图像的模糊和降噪。
均值滤波器的概念非常的直观,使用滤波器窗口内的像素的平均灰度值代替图像中的像素值,这样的结果就是降低图像中的“尖锐”变化。这就造成,均值滤波器可以降低噪声的同时,也会模糊图像的边缘。均值滤波器的处理结果是过滤掉图像中的“不相关”细节,其中“不相关”细节指的是:与滤波器模板尺寸相比较小的像素区域。

根据均值计算方法的不同,均值滤波器有以下几种:

•算术均值滤波器

•几何均值滤波器

•谐波均值滤波器

•逆谐波均值滤波器

算术均值滤波器 Arithmetic Mean Filter

这是最简单的均值滤波器,可以去除均匀噪声和高斯噪声,但会对图像造成一定程度的模糊。

表示中心点在

处,大小为

的滤波器窗口。算术均值滤波器就是简单的计算窗口区域的像素均值,然后将均值赋值给窗口中心点处的像素:

其中,

表示原始图像,

表示均值滤波后得到的图像。
基于上述公式,可以很容易的得到的算术均值滤波器的窗口模板,下面以3×3为例

在OpenCV中,函数blur表示使用该模板的均值滤波器,其声明如下:

void blur( InputArray src, OutputArray dst,Size ksize, Point anchor = Point(-1,-1),int borderType = BORDER_DEFAULT );

src是输入图像,dst为输出图像;ksize是滤波器模板窗口的大小;后两个参数分别表示,待处理像素在模板窗口的位置,默认值是窗口的中心位置,所以窗口的大小一般为奇数,最后一个参数表示对编解类型的处理,使用默认值即可。其调用示例blur(src,dst,Size(5,5),模板窗口的大小为5×5。

盒状滤波器

当滤波器的模板的所有的系数都相等时称之为盒状滤波器 Box Filter。其使用的模板如下(3×3 为例):

时,盒状滤波器可以很方便的计算图像像素邻域的和,对计算图像的各种积分特性例如图像的协方差矩阵,是很有帮助的。OpenCV中的函数boxFilter就是盒状滤波器,其声明如下:

void boxFilter( InputArray src, OutputArray dst, int ddepth,Size ksize, Point anchor = Point(-1,-1),bool normalize = true,int borderType = BORDER_DEFAULT );

和blur的参数比较类似,所不同的ddepth是滤波后图像的深度,-1表示和原图像的深度相同;参数normalize表示是否有归一化的参数,这是因为在boxFilter使用的模板如下:

其中,

也就是说,当normalize = true时,这也是一个默认值,其就是一个算术均值滤波器;normalize=false,盒状滤波器的作用就是计算模板窗口内的像素的和,然后将值赋给窗口中心位置的像素,主要用来计算邻域像素的和。

加权的均值滤波器

不同于上面的所有像素的系数都是相同的,加权的均值滤波器使用的模板系数,会根据像素和窗口中心像素的距离而取不同的系数。赋予中心点最高的权重,然后随着离中心点的距离增加而减小系数,这样做的目的是在平滑图像的同时尽量降低对图像的模糊。最常用的加权模板如下(3×3)为例:

其他的一些非线性均值滤波器

除了上述算术均值滤波器,根据计算均值方法的不同还有几种均值滤波。

几何均值滤波器 Geometric Mean Filter其公式如下:

滤波后图像的像素由模板窗口内像素的乘积的

幂给出。 和算术均值滤波器相比,几何均值滤波器能够更好的取出高斯噪声,并且能够更多的保留图像的边缘信息。但,其对0值是非常敏感的,在滤波器的窗口内只要有一个像素的灰度值为0,就会造成滤波器的输出结果为0。

谐波均值滤波器 Harmonic Mean Filter 其公式如下:

谐波均值滤波器对盐粒噪声(白噪声)效果较好,不适用于胡椒噪声;比较适合处理高斯噪声。

逆谐波均值滤波器 Contra-Harmonic Mean Filter其公式如下:

其中Q称为滤波器的阶数,该滤波器可以用来消除椒盐噪声。但是需要不同同时处理盐粒噪声和胡椒噪声,当Q为正时,可以消除胡椒噪声;当Q为负时,消除盐粒噪声。当Q=0时,该滤波器退化为算术均值滤波器;Q=-1时,退化为谐波均值滤波器。

均值滤波器 非线性均值滤波器中的一种,其公式如下:

P为负数时可以有效的滤去盐粒(白)噪声,正的异常值;P为正时可以过滤胡椒(黑)噪声,负的异常值。

基于OpenCV的实现

上述滤波器的实现大同小异,只是计算均值的方法不同。

    Mat tmp;copyMakeBorder(m, tmp, ksize / 2, ksize / 2, ksize / 2, ksize / 2, BorderTypes::BORDER_REFLECT); // 扩展边界int rows = tmp.rows - ksize / 2;int cols = (tmp.cols - ksize / 2) * tmp.channels();for (int i = ksize / 2; i < rows - ksize / 2; i++){for (int j = ksize / 2; j < cols - ksize / 2; j++){// 遍历窗口内的像素,计算均值}}Rect rect(ksize / 2, ksize / 2, m.cols, m.rows);m = tmp(rect);

下面就不再贴全的代码,只给出根据不同的公式计算均值的代码。
几何均值滤波器

// 取得窗口像素double mul = 1;for (int a = -ksize / 2; a <= ksize / 2; a++){for (int b = -ksize / 2; b <= ksize / 2; b++){mul *= tmp.at(i + a, j + b);}}auto pixel = pow(mul, 1.0 / (ksize * ksize));if (pixel < 0)pixel = 0;else if (pixel >= 255)pixel = 255;tmp.at(i, j) = static_cast(pixel);

基本就是遍历图像的像素,然后在滤波器的窗口内根据均值的计算方式计算均值;几何滤波器,就是将滤波器窗口内的像素乘积,然后去乘积的

幂。需要说明的是:几何均值滤波器有个致命的缺陷,那就是当窗口内像素只要有一个值为0,则其计算得到的值就是0,这在去去噪时表现的比较明显,例如:

由于噪声的污染比较严重,在使用几何均值滤波器去噪时,会得到一块黑色区域(灰度值为0)。

加权的均值滤波器

            // 取得窗口像素int sum = 0;int weightSum = 0;for (int a = -ksize / 2; a <= ksize / 2; a++){for (int b = -ksize / 2; b <= ksize / 2; b++){auto weight = pow(2, ksize - abs(a) - abs(b) - 1);weightSum += weight;sum += weight * tmp.at(i + a, j + b);}}auto pixel = static_cast<int>(sum / weightSum);if (pixel < 0)pixel = 0;else if (pixel > 255)pixel = 255;tmp.at(i,j) = pixel;

主要是权值系数的计算,可以发现一定的关系,和中心越近的其权值越高,具体公式:

,其中

为和中心在

方向的距离。

加权的均值滤波器去噪效果和均值滤波器相当,但是在保护图像细节方面比均值滤波器效果要好,上图是3×3的滤波器,窗口较小,两者的区别不是较大。
下图是7×7的滤波器,对比就比较明显了。

至于,其他的几种:谐波滤波器、逆谐波滤波器和

均值滤波器,实现都差不多,代码就不再贴出了。

总结

均值滤波器能够去除均匀分布和高斯分布的噪声,但是在过滤掉噪声的同时,会对图像造成一定的模糊,使用的窗口越大,造成的模糊也就越明显。
根据计算均值方法的不同,有多种均值滤波,经常使用的是算术均值滤波器,计算简单,但是对图像造成的模糊交明显;另外,有加权的均值滤波器,给窗口内的像素不同的系数,距离中心越近则系数越大。
使用加权的均值滤波器,去除噪声的能力和算术均值滤波器相当,但是对图像造成的模糊较轻,能够更好的保护图像的细节。(上面已有对比)

几何均值滤波器,在过滤噪声的同时也能更好的保护图像的细节,但是有个缺陷:在滤波的过程中,窗口内的像素只要有一个为0,则其得出的值就是0.

至于余下的几种,在能够去除高斯噪声,并且对椒盐噪声也有一定的作用,具体如下:

•谐波均值滤波器 能过滤盐粒噪声,对胡椒噪声无效

•逆谐波均值滤波器,当阶数Q为正时,可以过滤胡椒噪声;Q为负时可以过滤盐粒噪声。不能同时对椒盐噪声起作用。

• 

均值滤波器, 和逆谐波均值滤波器类似。当P为正时,能够过滤椒盐噪声;P为负时,能够过滤盐粒噪声。

相关文章:

图像处理基础(3):均值滤波器及其变种

均值滤波器可以归为低通滤波器&#xff0c;是一种线性滤波器&#xff0c;其输出为邻域模板内的像素的简单平均值&#xff0c;主要用于图像的模糊和降噪。 均值滤波器的概念非常的直观&#xff0c;使用滤波器窗口内的像素的平均灰度值代替图像中的像素值&#xff0c;这样的结果就…...

力扣刷题心得_JAVA

数学 > 数组 > 链表 > 字符串 > 哈希表 > 双指针 > 递归 > 栈 > 队列 > 树 //一般力扣中传入的参数和新建的对象作为返回值,都不列入空间复杂度中 //但是面试的时候要和面试官商量好,灵活定义空间复杂度 //当然最好是就在传入的对象作为返回值,(在原…...

音乐播放器实现:前端HTML,CSS,JavaScript综合大项目

音乐播放器实现:前端HTML&#xff0c;CSS&#xff0c;JavaScript综合大项目 项目概述项目视图效果一、侧边栏相关代码&#xff08;一&#xff09;HTML代码&#xff08;二&#xff09;css代码 二、登录页面&#xff08;一&#xff09;HTML代码&#xff08;二&#xff09;css代码…...

Unity编辑器缩放设置

Unity默认界面UI字体太小了&#xff0c;可以设置一下缩放 打开首选项&#xff0c; UI Scaling 设置成125%或者更大 &#xff0c;然后重启...

ChatGPT大模型极简应用开发-CH1-初识 GPT-4 和 ChatGPT

文章目录 1.1 LLM 概述1.1.1 语言模型和NLP基础1.1.2 Transformer及在LLM中的作用1.1.3 解密 GPT 模型的标记化和预测步骤 1.2 GPT 模型简史&#xff1a;从 GPT-1 到 GPT-41.2.1 GPT11.2.2 GPT21.2.3 GPT-31.2.4 从 GPT-3 到 InstructGPT1.2.5 GPT-3.5、Codex 和 ChatGPT1.2.6 …...

Golang学习笔记_27——单例模式

Golang学习笔记_24——泛型 Golang学习笔记_25——协程Golang学习笔记_25——协程 Golang学习笔记_26——通道 文章目录 单例模式1. 介绍2. 应用场景3. 实现3.1 饿汉式3.2 懒汉模式 源码 单例模式 1. 介绍 单例模式是一种创建型设计模式&#xff0c;它确保一个类只有一个实例…...

хорошо哈拉少wordpress俄语主题

хорошо哈拉少wordpress俄语主题 wordpress俄文网站模板&#xff0c;推荐做俄罗斯市场的外贸公司建俄语独立站使用。 演示 https://www.jianzhanpress.com/?p7360...

[数据结构与算法]js实现二叉树

DFS 与 BFS dfs 递归 本质通过栈结构 bfs 层序遍历 通过队列结构 function permute(nums) {let res [];let cur []; // 记录当前内容let visted {}; //记录访问过的节点let len nums.length;function dfs(nth) {//递归终止条件if (nth len) {res.push([...cur]);return …...

MySQL程序之:连接到服务器的命令选项

本节介绍大多数MySQL客户端程序支持的选项&#xff0c;这些选项控制客户端程序如何建立与服务器的连接、连接是否加密以及连接是否压缩。这些选项可以在命令行或选项文件中给出。 连接建立的命令选项 本节介绍控制客户端程序如何建立与服务器的连接的选项。 表6.4连接建立选…...

python3GUI--仿崩坏三二次元登录页面(附下载地址) By:PyQt5

文章目录 一&#xff0e;前言二&#xff0e;预览三&#xff0e;实现方案1.实现原理1.PyQt52. 具体实现 2.UI设计1.UI组件化、模块化2.UI设计风格思路 3.项目代码结构4.使用方法3.代码分享1.支持跳转网页的QLabel组件2.三角形ICON按钮 四&#xff0e;总结 大小&#xff1a;33.3 …...

阿里云 Serverless 助力盟主直播:高并发下的稳定性和成本优化

在直播场景中&#xff0c;阿里云 Serverless 应用引擎 SAE 提供的无缝弹性伸缩与极速部署能力&#xff0c;确保直播间高并发时的流畅体验&#xff0c;降低了我们的运营成本&#xff0c;简化了运维流程。结合阿里云云原生数据库 PolarDB 的 Serverless 能力&#xff0c;实现了数…...

Unity 学习指南与资料分享

Unity学习资料 Unity学习资料 Unity学习资料 Unity 作为一款强大的跨平台游戏开发引擎&#xff0c;在游戏开发及实时 3D 内容创作领域占据着重要地位。它功能丰富、易于上手&#xff0c;支持多平台发布&#xff0c;为开发者提供了广阔的创作空间。下面为你带来全面的 Unity 学…...

Android SystemUI——CarSystemBar视图解析(十一)

前面文章我们已经把 CarSystemBar 从启动到构建视图,再到将视图添加到 Window 的流程分析完毕,我们知道默认情况下在车载系统中只显示顶部栏和底部栏视图的。这里我们在前面文章的基础上以顶部栏为例具体解析其视图的结构。 一、顶部栏解析 通过《CarSystemBar车载状态栏》这…...

.NET周刊【1月第1期 2025-01-05】

国内文章 3款.NET开源、功能强大的通讯调试工具&#xff0c;效率提升利器&#xff01; https://www.cnblogs.com/Can-daydayup/p/18631410 本文介绍了三款功能强大的.NET开源通讯调试工具&#xff0c;旨在提高调试效率。这些工具包括LLCOM&#xff0c;提供串口调试和自动化处…...

初识go语言之指针用法

一、环境准备 安装go语言编译环境&#xff0c;官网地址&#xff1a;https://go.dev/dl/ 或者 https://golang.google.cn/dl/ 点击下载按提示安装即可 vscode 安装go语言扩展 测试 package mainimport "fmt"func main() {fmt.Println("Hello, World!") …...

用户中心项目教程(二)---umi3的使用出现的错误

目录 1.情况的说明 2.遇到的问题 1&#xff09;第一个问题-关于npx的使用 2&#xff09;第二个问题--unsupport问题 3&#xff09;第三个收获--nodejs安装问题 4&#xff09;第四个收获---nvm下载问题 5&#xff09;第五个问题--尚未解决的问题 3.个人总结 1.情况的说明…...

Android设备:Linux远程gdb调试

更多内容&#xff1a;XiaoJ的知识星球 目录 1.准备工作1&#xff09;安装Android NDK&#xff1a;2&#xff09;连接Android手机3&#xff09;编译程序 2.启动gdbserver1&#xff09;**推送gdbserver及可执行文件**&#xff1a;**2&#xff09;启动gdbserver**&#xff1a;3&am…...

(十四)WebGL纹理坐标初识

纹理坐标是 WebGL 中将 2D 图像&#xff08;纹理&#xff09;应用到 3D 物体表面的重要概念。在 WebGL 中&#xff0c;纹理坐标通常使用一个二维坐标系&#xff0c;称为 uv 坐标&#xff0c;它们决定了纹理图像如何映射到几何体上。理解纹理坐标的核心就是明白它们如何将二维纹…...

【机器学习】制造业转型:机器学习如何推动工业 4.0 的深度发展

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 引言 在当今科技飞速发展的时代&#xff0c;制造业正经历着前所未有的变革&#xff0c;工业4.0的浪潮席卷而来。工业4.0旨在通过将…...

Nginx安装配置Mac使用Nginx访问前端打包项目

目录 Linux安装环境变量配置 WinMac安装基本配置 Mac使用Nginx访问前端项目常用命令 Linux 官网&#xff1a;https://nginx.org/ 中文官网&#xff1a;https://nginx.p2hp.com/ 安装 http://nginx.org/en/download.html 1). 安装依赖包 由于nginx是基于c语言开发的&#x…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...