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

news2025/1/23 16:45:49

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

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

•算术均值滤波器

•几何均值滤波器

•谐波均值滤波器

•逆谐波均值滤波器

算术均值滤波器 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为负时,能够过滤盐粒噪声。

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

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

相关文章

《2024年度网络安全漏洞威胁态势研究报告》

2024年&#xff0c;全球网络安全领域继续面对日益严峻的挑战。在数字化转型的大背景下&#xff0c;漏洞利用成为网络攻击的重中之重。根据统计&#xff0c;全球新增漏洞数量再创新高&#xff0c;漏洞的复杂性加剧&#xff0c;修复周期也在不断缩短。然而&#xff0c;攻击者的手…

备赛蓝桥杯之第十五届职业院校组省赛第二题:分享点滴

提示&#xff1a;本篇文章仅仅是作者自己目前在备赛蓝桥杯中&#xff0c;自己学习与刷题的学习笔记&#xff0c;写的不好&#xff0c;欢迎大家批评与建议 由于个别题目代码量与题目量偏大&#xff0c;请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题&#xff0…

winfrom项目,引用EPPlus.dll实现将DataTable 中的数据保存到Excel文件

最近研究不安装office也可以保存Excel文件&#xff0c;在网上查询资料找到这个方法。 第一步&#xff1a;下载EPPlus.dll文件&#xff08;自行去网上搜索下载&#xff09; 第二步&#xff1a;引用到需要用的项目中&#xff0c;如图所示&#xff1a; 第三步&#xff1a;写代码…

失业ing

零零碎碎记一下unity相关的东西备忘 渲染&#xff1a; https://github.com/festivities/PrimoToon 仿原神的卡通渲染&#xff0c; 参照这种文档&#xff1a; Unity Built-in Shader转URP Shader 接口查询对照表之类的 自己强行改api到urp可用&#xff0c;改了三四天&…

Linux——多线程的控制

Linux——线程的慨念及控制-CSDN博客 文章目录 目录 文章目录 前言 一、线程函数的认识 1、基本函数的回顾 1、线程的创建pthread_create 2、线程阻塞pthread_join 3、线程退出pthread_exit 2、线程的分离pthread_detach 3、互斥锁初始化函数&#xff1a;pthread_mutex_init 4、…

“AI教学培训信息资源综合管理系统:让教学更精准、更高效

大家好&#xff0c;作为一名资深产品经理&#xff0c;今天我就跟大家聊聊AI教学培训信息资源综合管理系统。在这个信息爆炸的时代&#xff0c;如何高效地管理教学培训信息资源&#xff0c;成为了教育行业的一大痛点。而AI技术的融入&#xff0c;无疑为解决这个问题提供了强有力…

Net Core微服务入门全纪录(三)——Consul-服务注册与发现(下)

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…

vue3+webOffice合集

1、webOffice 初始化 1&#xff09;officeType: 文档位置&#xff1a;https://solution.wps.cn/docs/web/quick-start.html#officetype 2&#xff09;appId: 前端使用appId 后端需要用到AppSecret 3&#xff09;fileId: 由后端返回&#xff0c;前端无法生成&#xff0c;与上传文…

Python - itertools- pairwise函数的详解

前言&#xff1a; 最近在leetcode刷题时用到了重叠对pairwise,这里就讲解一下迭代工具函数pairwise,既介绍给大家&#xff0c;同时也提醒一下自己&#xff0c;这个pairwise其实在刷题中十分有用&#xff0c;相信能帮助到你。 参考官方讲解&#xff1a;itertools --- 为高效循…

【优选算法】5----有效三角形个数

又是一篇算法题&#xff0c;今天早上刚做的热乎的~ 其实我是想写博客但不知道写些什么&#xff08;就水一下啦&#xff09; -------------------------------------begin----------------------------------------- 题目解析: 这道题的题目算是最近几道算法题里面题目最短的&a…

C语言中 指针类型的意义

对于初学者也包括我来说指针不就是来存放地址的吗 应该会有一个疑惑 为什么还有那么多类型char* int*等等不都能存放一个地址无论是整形还是字符 那这个指针类型能有什么意义呢 有的有的兄弟 他的真正意义就在于解引用上面*p 指针类型决定了 指针进行解引用操作时 一次能访问…

easyexcel读取写入excel easyexceldemo

1.新建springboot项目 2.添加pom依赖 <name>excel</name> <description>excelspringboot例子</description><parent> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId&…

数据结构(精讲)----栈 stack

什么是栈 栈是只能在一端进行插入和删除操作的线性表(又称为堆栈)&#xff0c;进行插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。 特点&#xff1a;栈是先进后出FILO(First In Last Out) (LIFO(Last In First Out)) 顺序栈 特性 逻辑结构&#xff1a;线性结构…

Hexo + NexT + Github搭建个人博客

文章目录 一、 安装二、配置相关项NexT config更新主题主题样式本地实时预览常用命令 三、主题设置1.侧边栏2.页脚3.帖子发布字数统计 4.自定义自定义页面Hexo 的默认页面自定义 404 页自定义样式 5.杂项搜索服务 四、第三方插件NexT 自带插件评论系统阅读和访问人数统计 五、部…

I2S是什么通信协议?它如何传输音频数据?它和I2C是什么关系?

首先我们先明确一点&#xff0c;I2S和I2C没有什么关系&#xff0c;如果非要扯点共同点的话那就是它们都是由飞利浦制定的。 I2C我们用的比较多&#xff0c;我们用的大多数的传感器模块用的通信协议就是I2C&#xff0c;SPI&#xff0c;UART这些。 而I2S应用领域比较单一&#…

大模型:LangChain技术讲解

一、什么是LangChain 1、介绍 LangChain是一个用于开发由大型语言模型提供支持的Python框架。它提供了一系列工具和组件&#xff0c;帮助我们将语言模型集成到自己的应用程序中。 有了它之后&#xff0c;我们可以更轻松地实现对话系统、文本生成、文本分类、问答系统等功能。…

【2024 博客之星评选】请继续保持Passion

我尝试复盘自己2024年走的路&#xff0c;希望能给诸君一些借鉴。 文章目录 回头望感想与收获成长与教训今年计划感恩一些体己话 回头望 回望我的2024年&#xff0c;年初拿高绩效&#xff0c;但感觉逐渐被公司一点点剥离出中心&#xff1b;年中一直在学习防患于未然&#xff1b…

Node.js接收文件分片数据并进行合并处理

前言&#xff1a;上一篇文章讲了如何进行文件的分片&#xff1a;Vue3使用多线程处理文件分片任务&#xff0c;那么本篇文章主要看一下后端怎么接收前端上传来的分片并进行合并处理。 目录&#xff1a; 一、文件结构二、主要依赖1. express2. multer3. fs (文件系统模块)4. pat…

【2025小年源码免费送】

&#x1f496;学习知识需费心&#xff0c; &#x1f4d5;整理归纳更费神。 &#x1f389;源码免费人人喜&#xff0c; &#x1f525;码农福利等你领&#xff01; &#x1f496;山高路远坑又深&#xff0c; &#x1f4d5;大军纵横任驰奔&#xff0c; &#x1f389;谁敢横刀立马行…

【JavaSE】(8) String 类

一、String 类常用方法 1、构造方法 常用的这4种构造方法&#xff1a;直接法&#xff0c;或者传参字符串字面量、字符数组、字节数组。 在 JDK1.8 中&#xff0c;String 类的字符串实际存储在 char 数组中&#xff1a; String 类也重写了 toString 方法&#xff0c;所以可以直…