《opencv实用探索·八》图像模糊之均值滤波简单理解

1、前言
什么是噪声?
该像素与周围像素的差别非常大,导致从视觉上就能看出该像素无法与周围像素组成可识别的图像信息,降低了整个图像的质量。这种“格格不入”的像素就被称为图像的噪声。如果图像中的噪声都是随机的纯黑像素或者纯白像素,这样的噪声也被称为“椒盐噪声”或“盐噪声”。

在图像处理中,为了提升图像的整体质量,通常我们需要对图像进行模糊处理,即通过卷积运算对每个像素进行滤波或平滑,减少图像的细节,使得图像噪声削弱,凸显特征明显的区域。图像的卷积运算上一章已介绍,这里不再赘述。

2、均值滤波
把卷积核覆盖在原图上上依次滑过每个像素,计算卷积核覆盖像素值的加权平均并赋值给被核中心覆盖的那个像素值。比如下图原图像是一个5x5图像,现在有个3x3卷积核,放在图像最开始的位置,计算卷积核覆盖的像素值的加权平均:
注意:均值滤波卷积核上的每个权重默认为1
卷积核:
在这里插入图片描述
原图像:
在这里插入图片描述
加权平均计算:

(10+20+15+50+100+35+20+5+50)* 1 / (1+1+1+1+1+1+1+1+1) = 33

核中心像素值,即原图像第二行第二列会被重新赋值为33
下图阴影区域为核中心滑过的区域:
在这里插入图片描述
可以看到原图像5x5,在经过卷积运算后图像变为了3x3,如果想让核中心扫过图像边缘像素,保持图像大小不变,可以在原图像基础上拓展一层边缘,如下图:
在这里插入图片描述

opencv提供了均值滤波接口如下:

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

src:原图
dst:滤波后图像
ksize:卷积核大小,注意卷积核只能是奇数,这样才有核中心,建议使用3x3,5x5和7x7,卷积核越大图像越模糊,卷积时间越长
anchor :表示锚点(anchor)的位置,即被平滑的那个点。默认值Point(-1,-1)表示锚点位于核的中心。
borderType: 边框模式用于推断图像外部的像素(一般默认)

我们现在用5x5卷积核对下列图像做均值滤波,可以看到右边图像已模糊处理:
在这里插入图片描述
由于均值模糊是对窗口中所有像素点求平均值,在图像的边缘或者纹理丰富的地方也会变得模糊。为了尽可能的保留图像中的边缘信息,可以给不同位置的像素点赋以不同的权值。距离中心点越近的像素,权值越大,而远离中心点的像素,权值也逐渐减少,这时候可以采用高斯滤波。

3、高斯滤波

在高斯滤波中卷积核的权重由高斯分布(正态分布)的取值来确定。
我们首先来介绍下高斯函数。

一维高斯函数:
从下图中可以看到高斯分布(正态分布)是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。我们给卷积核分配权重的时候,以曲线中心点为原点分配给核中心,核其他位置的权重按高斯曲线上递减趋势分配。
高斯函数中的参数σ表征着高斯滤波器宽度(决定着平滑程度),当σ越大,高斯滤波器的频带就越宽,平滑程度就越高(越接近均值滤波).通过调节平滑程度参数σ,可调整图像的平滑程度。
在这里插入图片描述
在这里插入图片描述
概率密度函数也为高斯函数。因为该函数只有一个变量x,所以我们也称该函数为一维高斯函数。
在这里插入图片描述
再回到一维高斯函数图中,图中X轴的数值表示标准差的大小,比如0.5表示0.5个标准差大小,对应的高斯曲线上面的数值为0.5sigma,在0-0.5sigma区间内占比为19.1%。当我们取-3sigma-3sigma区间,占比达到99.8%,默认该段分布包含了所有情况。

二维高斯函数:
因为图像是二维空间,涉及XY两个方向,这时候用一维高斯函数进行处理显然不太合适,这时引入二维高斯函数是一个很好的解决方案。
在这里插入图片描述

引入二维高斯函数进行模糊处理:

假设一个高斯函数的卷积和模板是5*5,那么他这25个点的x,y具体取值为:
在这里插入图片描述
此时只需要假定一个sigma值,即可确定一个高斯核,比如:
在这里插入图片描述

但是这个高斯核不完整,因为他求出的5*5的卷积核进行卷积操作时,改变了图像原始的0-255的范围。为解决该问题只需要将卷积核归一化即可,即需要保证权重之和等于1,也就是卷积核中每一个值除以卷积的总和。
具体的高斯核例如:
实际应用:
有个3x3高斯核,内部坐标如下:
在这里插入图片描述
为了计算权重矩阵,需要设定标准差σ的值。假定σ=1.5,带入二阶高斯函数计算结果如下:
在这里插入图片描述
这9个点的权重总和等于0.479,如果只计算这9个点的加权平均,还必须让它们的权重之和等于1,因此上面9个值还要分别除以0.479,得到最终的权重矩阵。
在这里插入图片描述
现在有了高斯核,可以进行图像模糊计算,假设现有9个像素点,灰度值(0-255)如下:
在这里插入图片描述
将高斯核覆盖在图像上,覆盖的每个像素点乘以对应的权重再除以权重之和即可得到高斯核中心覆盖的原图像像素最新的值

(1.326*14 + 1.775*15 + 1.516*16 + 2.84*24 + 3.694*25 + 3.076*26 + 3.221*34 + 4.141*35 + 3.41*36) / 1 = 3.694

如果图像很大,将高斯核依次在图像上的每个像素点滑动,计算核中心的像素值,最后就得到了高斯模糊后的图像。如果是彩色图像可对RGB三通道分别进行高斯模糊计算。

opencv高斯模糊函数调用:

void GaussianBlur(
InputArray src,
OutputArray dst,
Size ksize,
double sigmaX,
double sigmaY = 0,
int borderType = BORDER_DEFAULT
);

src:原图像
dst:高斯滤波后的图像
ksize:滤波核的大小,宽、高必须是奇数,例如(3,3)、(5,5)等。
sigmaX:卷积核水平方向的标准差σ
sigmaY:卷积核垂直方向的标准差σ。修改 sigmaX 或 sigmaY 的值都可以改变卷积核中的权重比例。如果不知道如何设计这两个参数值,就直接把这两个参数的值写成0,方法就会根据滤波核的大小自动计算出合适的权重比例。
boderType:可选参数,边界样式,建议使用默认值。
这里需要注意的是在二维高斯函数中标准差σ只有一种,没有σ1和σ2,如果我们设置sigmaX等于sigmaY,这样拿到的是一个圆形高斯核完全和二维高斯函数生成的一样,如果sigmaX不等于sigmaY我们拿到的是一个椭圆形高斯核,即在X和Y方向调用了分别调用二维高斯函数计算高斯核,因为标准差σ不一样。
在这里插入图片描述

高斯滤波后的图像如下:
在这里插入图片描述

参考文章:【图像处理】高斯模糊、高斯函数、高斯核、高斯卷积操作

在这里插入图片描述

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

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

相关文章

Oracle(2-7)Instance and Media Recovery Structures

文章目录 一、基础知识1、体系结构详解2、Database Files 数据库文件3、Database Other Files 其他数据文件4、Dynamic Views 动态视图5、Large Pool6、DB Buffer Cache,DBWn7、Configuring Tablespaces 配置表空间8、Redo Log Buffer, LGWR9、Database Checkpoints 数据库检查…

wordpress忘记密码怎么办?

有的时候,我们会忘记网站的密码,所以网站的密码要记住,那记不住,怎么样才可以登录后台呢?下面来给大家说一下方法,第一种方法,就是进入数据库里面修改密码,第二种就是从新搭建&#…

Redis--10--Pipeline

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Pipeline举例比较普通模式与 PipeLine 模式小结: Pipeline 前面我们已经说过,Redis客户端执行一条命令分为如下4个部分:1)发送命…

echarts 地图

效果图 业务组件 <template><mapEcharts :itemStyle"mapProps.itemStyle" :emphasisLabelStyle"mapProps.emphasisLabelStyle":emphasisItemStyle"mapProps.emphasisItemStyle" :labelInfo"mapProps.labelInfo":rippleEffec…

LeetCode 2661. 找出叠涂元素:多次映射

【LetMeFly】2661.找出叠涂元素&#xff1a;多次映射 力扣题目链接&#xff1a;https://leetcode.cn/problems/first-completely-painted-row-or-column/ 给你一个下标从 0 开始的整数数组 arr 和一个 m x n 的整数 矩阵 mat 。arr 和 mat 都包含范围 [1&#xff0c;m * n] 内…

.[[backup@waifu.club]].wis勒索病毒数据怎么处理|数据解密恢复

导言&#xff1a; 随着科技的不断发展&#xff0c;网络安全威胁也变得愈发严峻。最近&#xff0c;一种名为.[[backupwaifu.club]].wis的勒索病毒愈演愈烈&#xff0c;给用户的数据安全带来了极大的威胁。本文将深入介绍.[[backupwaifu.club]].wis病毒的特征、如何应对数据加密…

帆软的控件参数-笔记1

1.帆软的控件参数 变量可以通过模板->模板参数定义添加需要给变量赋值的控件&#xff0c;如下拉控件时&#xff0c;将控件名称命名为与模板参数同名帆软就会自行匹配。也可以不添加模板参数&#xff0c;直接给控件名称命名&#xff0c;该命名就是变量名&#xff0c;该变量名…

Vmware17虚拟机安装windows10系统

不要去什么系统之家之类的下载镜像&#xff0c;会不好安装&#xff0c;镜像被魔改过了&#xff0c;适合真实物理机上的系统在PE里安装系统&#xff0c;建议下载原版系统ISO文件 安装vmware17pro 下载地址https://dwangshuo.jb51.net/202211/tools/VMwareplayer17_855676.rar 解…

泊车功能专题介绍 ———— 汽车全景影像监测系统性能要求及试验方法(国标未公布)

文章目录 术语和定义一般要求功能要求故障指示 性能要求响应时间图像时延单视图视野范围平面拼接视图视野平面拼接效果总体要求行列畸变拼接错位及拼接无效区域 试验方法环境条件仪器和设备车辆条件系统响应时间试验图像时延试验单视图视野范围试验平面拼接视图视野试验平面拼接…

Ubuntu 22.04安装Go 1.21.4编译器

lsb_release -r看到操作系统版本是22.04,uname -r看到内核版本是uname -r。 sudo wget https://studygolang.com/dl/golang/go1.21.4.linux-amd64.tar.gz下载编译器。 sudo tar -zxf go1.21.4.linux-amd64.tar.gz -C /goroot将文件解压到/goroot目录下&#xff0c;这个命令…

生成带依赖Jar 包的两种常用方式:IDEA打包工具:Artifacts 和 maven-shade-plugin

文章目录 前言1、IDEA打包工具&#xff1a;Artifacts1.1 创建Artifacts1.2 选择第三方jar文件1.3 打包Artifacts1.4 测试jar包 2、maven-shade-plugin2.1、pom文件添加2.2、打包2.3、测试jar包 总结 前言 当我们编写完Java程序后&#xff0c;为了提高执行效率通常会将应用程序…

vscode配置c++环境

我现在觉得vscode确实很好用&#xff0c;所以python和c都是用的这个。 首先是安装vs&#xff1a; 官网寻找即可&#xff1a;https://code.visualstudio.com/ 安装好后需要装一些插件&#xff1a; 装上这两个插件&#xff0c;c/c&#xff0c;code runner 接着安装c编译器mi…

canvas基础:绘制虚线

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…

Python爬虫教程27:秀啊!用Pandas 也能爬虫??

说到爬虫&#xff0c;大家可能都知道requests、re、scrapy、selenium等等一些工具库。虽然它低调&#xff0c;但功能非常强大&#xff0c;用于抓取Table表格型数据时&#xff0c;简直是个神器&#xff0c;没有必要去F12研究HTML页面结构甚至写正则表达式解析字段。 #我的Pytho…

Python教程78:聊聊exec和eval()函数,有什么用法区别

exec 和 eval 是 Python 中的两个内置函数&#xff0c;它们都可以执行Python代码&#xff0c;但它们的使用方式和目的有所不同。 1.exec()函数用于执行动态的 Python 代码&#xff0c;你可以使用exec来执行存储在字符串或对象代码中的 Python 代码。exec 不会返回任何结果&…

【嵌入式-51单片机】常见位运算和数据类型以及sbit使用

51单片机中 数据类型如下&#xff1a; 位运算符如下&#xff1a; 按位左移<<&#xff1a;低位补零&#xff0c;高位移出 按位右移>>&#xff1a;高位补零&#xff0c;低位移出 按位与&&#xff1a;对应位上的值必须同时为1才为1&#xff0c;可以用来对指定位…

【2023年修正版】哈夫曼编码详解

霍夫曼编码的原理就是根据字符的使用频率&#xff0c;排成二叉树&#xff0c;使用次数少的放到后面&#xff0c;使用次数多的离根节点越近&#xff1b;这样字符的占位也相应的较少。 首先&#xff0c;主要操作是找每次字符中使用频率最低的&#xff08;数最小&#xff09;两个数…

ASEM工控机维修工业电脑控制器维修PB3400

ASEM工控机维修asem工业电脑维修常见型号&#xff1a;PB3400;PB2000;PB3200;PB3600&#xff1b;BM2200等。 ASEM工控机维修常见故障有&#xff1a;开不了机、黑屏、不能启动、电路板故障、主板、开机没反应、显示器没反应、主板故障、蓝屏、卡机、显示器信号灯一直闪、系统不能…

180天Java从小白到就业-Day03-03Java位运算符、赋值运算符、数据交换的三种方式

1. 位运算符 Q&#xff1a;为什么要学习位运算 A&#xff1a;由于其运算效率更高&#xff0c;在JDK源码&#xff08;例如ArrayList、HashMap&#xff09;中大量使用位运算&#xff0c;想要看懂JDK源码必须懂位预算&#xff0c;但是在公司开发业务系统时位运算使用并不多。 Q…

网络虚拟化场景下网络包的发送过程

网络虚拟化有和存储虚拟化类似的地方&#xff0c;例如&#xff0c;它们都是基于 virtio 的&#xff0c;因而在看网络虚拟化的过程中&#xff0c;会看到和存储虚拟化很像的数据结构和原理。但是&#xff0c;网络虚拟化也有自己的特殊性。例如&#xff0c;存储虚拟化是将宿主机上…