均值滤波 附带简易code

news2025/1/15 17:36:58

1.概念介绍
 均值滤波是典型的 线性滤波算法,是指用当前像素点周围nxn个像素值的均值来代替当前像素值。使用该方法遍历处理图像内的每一个像素点,可完成整幅图像的均值滤波。

2.基本原理
 如图2-1,我们对第5行第5列的像素点进行均值滤波时,首先需要考虑需要对周围多少个像素点去取平均值。通常情况下,我们会以该当前像素为中心,对行数和列数相等的一块区域内的所有像素点的像素取平均值
 例如,我们可以以当前像素点的像素周围3x3区域内所有像素点的像素取平均值,也可以对周围5x5区域内所有像素点的像素值取平均值。

在这里插入图片描述

图2-1  一幅图像的像素值示例

 当前像素点的位置为第5行第5列时,我们对其周围5*5区域内的像素值取平均,计算方法如下:
像素点新值=
[(197+25+106+156+159)
(149+40+107+5+71)+
(163+198+226+223+156) +
(222+37+68+193+157)+
(42+72+250+41+75)]/25 = 126


计算得到新值以后,我们将新值作为当前像素点均值滤波后的像素值。我们针对图2-1的每一个像素点计算其周围5x5区域内的像素值均值,并将其作为当前像素点的新值,即可得到当前图像的均值滤波结果。


然而图像的边界并不存在5x5的领域区域。如图2-1的左上角第1行第1列上的像素点,其像素值为23。如果以其为中心点取周围5x5领域,则5x5领域的部分区域位于图像外部。但是图像外部是没有像素点和像素值的,显然是无法计算该点的领域均值的。


因此,针对边缘的像素点,可以只取图像内存在的周围领域点的像素值均值。如图2-2所示,计算左上角的均值滤波结果时,仅取图中灰色背景的33领域内的像素值的平均值。计算方法如下:
像素点新值=
[(23+158+140)+
(238+0+67)+
(199+197+25)]/9
=116

在这里插入图片描述

图2-2  边界点的处理

 除此之外,我们还可以扩展当前图像的周围像素点。例如,可以将当前97大小的图像扩展为13*11大小的图像,如图2-3所示。

在这里插入图片描述

图2-3  扩展边缘


 在完成图像边缘拓展后,我们可以在新增的行列内填充不同的像素值。在此基础上,再针对9x7的原始图像计算其5x5领域内像素点的像素值均值。OpenCV提供了多种边界处理方式,我们可以根据实际需要选用不同的边界处理模式。

 针对第5行第5列的像素点,其运算过程相当于一个额内部值是1/25的55矩阵进行相乘运算,从而得到均值滤波的结果为126。如图2-4所示。

在这里插入图片描述

图2-4  针对第 5 行第 5 列像素点均值滤波的运算示意图

根据上述运算,针对每一个像素点,都是与一个内部值均为1/25的55举证相乘,得到均值滤波的计算结果。示意图如图2-4所示

在这里插入图片描述

图1-4  针对每一个像素点均值滤波的运算示意图

将使用到的5x5矩阵一般化,可以得到如下图2-5的结果。

在这里插入图片描述

图2-5  将矩阵一般化

在Opencv中,将图1-5右侧的矩阵称为卷积核,其一般形式如下图2-6所示。其中M和N分别对应高度和宽度,一般情况下M和N的值是相等的,常用的3x3、5x5和7x7。如果M和N的值越大,参与运算的值就越大,参与运算的像素点的数量就越多,图像失真就越严重。

在这里插入图片描述

图2-6  卷积核

从使用不同大小的卷积核进行均值滤波处理图像可以发现:卷积核越大,图像的失真情况越明显。

卷积核越大,参与到均值运算中的像素就会越多,即当前计算的算的是更多点的像素值的平均值,去噪效果越好,当然花费的计算时间也会越长,同时让图像失真越严重。因此在实际处理中,要在失真和去噪效果之间取得平衡,选取合适大小的卷积核。
 

void MainWindow::on_averagefilter_clicked()
{
    cv::Mat FilterImg;
    QImage Qtemp1,Qtemp2;

    FilterImg = m_noiseimg.clone();

    for(int i = 1 ; i < m_noiseimg.rows - 1 ; i++)
        for(int j = 1 ; j < m_noiseimg.cols - 1 ; j++){
            for(int k = 0 ; k < 3 ; k++){
                FilterImg.at<cv::Vec3b>(i,j)[k] = cv::saturate_cast<uchar>((m_noiseimg.at<cv::Vec3b>(i - 1,j - 1)[k] + m_noiseimg.at<cv::Vec3b>(i - 1,j)[k] + m_noiseimg.at<cv::Vec3b>(i - 1,j + 1)[k]
                                                                        +m_noiseimg.at<cv::Vec3b>(i,j - 1)[k] + m_noiseimg.at<cv::Vec3b>(i,j)[k] + m_noiseimg.at<cv::Vec3b>(i,j + 1)[k]
                                                                        +m_noiseimg.at<cv::Vec3b>(i + 1,j - 1)[k] + m_noiseimg.at<cv::Vec3b>(i + 1,j)[k] + m_noiseimg.at<cv::Vec3b>(i + 1,j + 1)[k])/9);
            }
        }
    Qtemp2 = QImage((const unsigned char*)(FilterImg.data), FilterImg.cols, FilterImg.rows, FilterImg.step, QImage::Format_RGB888);
    ui->Label3->setPixmap(QPixmap::fromImage(Qtemp2));
    Qtemp2 = Qtemp2.scaled(250, 250, Qt::KeepAspectRatio, Qt::SmoothTransformation);
    ui->Label3->setScaledContents(true);
    ui->Label3->resize(Qtemp2.size());
    ui->Label3->show();
}

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

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

相关文章

D. Labyrinth(双端队列BFS)

Problem - D - Codeforces 你正在玩一款电脑游戏。其中一个关卡将你置于一个迷宫中&#xff0c;它由n行构成&#xff0c;每行包含m个单元格。每个单元格要么是空闲的&#xff0c;要么被障碍物占据。起始单元格位于第r行和第c列。在一步中&#xff0c;如果目标单元格没有被障碍物…

Codeforces-Round-826-Div-3-E-Sending-a-Sequence-Over-the-Network

title: Codeforces Round 826 (Div. 3) E. Sending a Sequence Over the Network date: 2023-04-18 20:04:57 categories: AlgorithmCodeforces tags:codeforces动态规划1600 E. Sending a Sequence Over the Network ​ 题目大意 给你一个长度为n的数组&#xff0c;问整个…

【Java 8 Time】Java8时区时间运用详解,2万字助你通关java.time包

目录 前言一、时区与时间1. 世界标准时&#xff1a;UTC、GMT、UT2. 地区时&#xff1a;Asia/Shanghai、UTC83. 时区&#xff1a;ZoneId、TimeZone4. 时间偏移量&#xff1a;ZoneOffset5. 时区简称&#xff1a;CTT、PRC 二、主要时间类1. 重要时间接口&#xff1a;Temporal2. 时…

测试用例覆盖不全面的解决方法

测试用例覆盖不全面的解决方法 问题分析 在测试用例设计过程中&#xff0c;容易出现思维受限或者需求盲区&#xff0c;我们不可能完全覆盖用户使用的所有场景&#xff0c;编写测试用例的时不可能把所有的场景都能想周全&#xff0c;把所有的场景下的情况都写成测试用例去模拟、…

SLAM论文速递:SLAM—— (2023)Amos-SLAM:一种基于视觉和几何的抗动态双阶段SLAM方法—5.05(1)

论文信息 题目&#xff1a; Amos-SLAM:An Anti-Dynamics Two-stage SLAM Approach Amos-SLAM:一种基于视觉和几何的抗动态双阶段SLAM方法论文地址&#xff1a; https://arxiv.org/pdf/2302.11747.pdf发表期刊&#xff1a; Computer Science > Robotics标签 xxxx 摘要 传统…

图神经网络:在KarateClub数据集上动手实现图神经网络

文章说明&#xff1a; 1)参考资料&#xff1a;PYG官方文档。超链。 2)博主水平不高&#xff0c;如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook。超链。提取码8888。 文章目录 文献阅读&#xff1a;代码实操&#xff1a; 文献阅读&#xff1a; 参考文…

基于ArkUI框架开发——图片模糊处理的实现

原文&#xff1a;基于ArkUI框架开发——图片模糊处理的实现&#xff0c;点击链接查看更多技术内容。 现在市面上有很多APP&#xff0c;都或多或少对图片有模糊上的设计&#xff0c;所以&#xff0c;图片模糊效果到底怎么实现的呢&#xff1f; 首先&#xff0c;我们来了解下模糊…

面向万物智联的应用框架的思考和探索(中)

原文&#xff1a;面向万物智联的应用框架的思考和探索&#xff08;中&#xff09;&#xff0c;点击链接查看更多技术内容。 应用框架&#xff0c;是操作系统连接开发者生态&#xff0c;实现用户体验的关键基础设施。其中&#xff0c;开发效率和运行体验是永恒的诉求&#xff0c…

【路径规划】基于麻雀搜索算法的栅格法路径规划 机器人路径规划【Matlab代码#21】

文章目录 1. 原始SSA算法2. 机器人路径规划环境创建3. 路径规划模型建立4. 部分代码展示5. 仿真结果展示6. 资源获取方式 1. 原始SSA算法 2. 机器人路径规划环境创建 对机器人工作空间的进行环境建模是机器人路径规划研究的重要前提。栅格法为环境建模提供了一种简洁有效的方法…

法规标准-GB/T 33577标准解读(2017版)

GB/T 33577是做什么的&#xff1f; GB/T 33577全名为智能交通系统-前方车辆碰撞预警系统(FVCWS)-性能要求和测试步骤&#xff0c;其中主要是对FVCWS系统的功能要求、性能要求及测试步骤进行了介绍。由于ISO 15623-2013内容与本法规内容相同&#xff0c;故可沿用此法规内容 FV…

【谷粒商城之消息队列RabbitMQ】

本笔记内容为尚硅谷谷粒商城消息队列RabbitMQ部分 目录 一、概述 二、简介 三、Docker安装RabbitMQ 四、Springboot整合RabbitMQ 1、引入spring-boot-starter-amqp 2、application.yml配置 3、测试RabbitMQ 1. AmqpAdmin-管理组件 2.RabbitTemplate-消息发送处理组件…

Wikidata实操

1. Wikidata 简介 Wikidata 即维基数据&#xff0c;是维基百科的一个项目。个项目已经在维基百科德国分部开始进行&#xff0c;项目完成之后&#xff0c;将会交给维基百科基金会进行操作和维护。&#xff08;具体百度即可&#xff0c;不多赘述&#xff09; 官网&#xff1a;htt…

操作系统考试复习—第三章 优先级倒置 死锁问题

当前OS广泛采用优先级调度算法和抢占方式&#xff0c;然而在系统中存在着影响进程运行的资源从而可能产生"优先级倒置"现象 具体解释为&#xff1a;在原本的调度算法设计中&#xff0c;高优先级进程可以抢占低优先级的CPU资源&#xff0c;先执行高优先级任务。但是存…

【STM32】在使用STM32Cube.IDE时更改时钟频率后代码跳进异常中断

目录 1、前言2、问题与复现办法3、解决的问题的过程 1、前言 这是在项目中无意发现的问题&#xff0c;其实有同样更复杂的工程可以运行&#xff0c;但是后来发现新建一个简单工程反而运行不了了&#xff0c;但是同样更复杂的工程可以运行说明本来同事原来已经不知道在哪里找到…

Vmware安装Kali

需要准备两个东西&#xff0c;kali镜像和VMware软件 下载kali iso 下载界面有三个可选择的 install是安装版&#xff0c;安装使用&#xff1b; Live版可以直接启动运行&#xff1b; netinstaller是网络安装&#xff0c;需要从网络上下载&#xff0c;文件本身只有引导作用&…

Idea Jrebel 报错:Cannot reactivate, offline seat in use ...

Idea Jrebel 报错&#xff1a;Cannot reactivate, offline seat in use ... 一、问题描述 在使用idea Jrebel续期的时候&#xff0c;修改idea激活服务器地址时&#xff0c;遇到报错&#xff1a;Cannot reactivate, offline seat in use. Click Work online in JRebel configura…

基于aspnet个人博客网站dzkf6606程序

系统使用Visual studio.net2010作为系统开发环境&#xff0c;并采用ASP.NET技术&#xff0c;使用C#语言&#xff0c;以SQL Server为后台数据库。 1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和…

探索卡尔曼滤波在位姿估计中的魅力:无人机与自动驾驶的关键技术揭秘

摘要&#xff1a;在本博客中&#xff0c;我们将探讨卡尔曼滤波在位姿估计领域的应用&#xff0c;特别是在无人机和自动驾驶场景中的重要性。我们将详细介绍卡尔曼滤波的原理、优势及其在无人机、自动驾驶等实际案例中的应用。此外&#xff0c;我们还将关注卡尔曼滤波在其他领域…

【服务器数据恢复】同友存储上的虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 同友存储&#xff0c;底层由数块物理硬盘组建的raid5磁盘阵列&#xff0c;存储池划分若干lun&#xff0c;每个lun下有数台虚拟机。 服务器故障&#xff1a; 未知原因导致存储崩溃&#xff0c;无法启动&#xff0c;虚拟机全部丢失&#xff0c;其…

linux中基础开发工具的使用

1.linux中的软件包管理器 1.1什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很…