《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方向调用了分别调用二维高斯函数计算高斯核,因为标准差σ不一样。
在这里插入图片描述
sigmaX和sigmaY该怎么取值?
如果 sigmaX 和 sigmaY 都设置为相同的值,那么高斯核将是一个圆形的,产生各向同性的模糊。这通常在需要保持图像各向同性的情况下使用,比如去除噪声或者平滑图像。
如果 sigmaX 和 sigmaY 设置为不同的值,高斯核将呈椭圆形状,产生各向异性的模糊。这可以在需要在图像的不同方向上应用不同程度的模糊时使用。
具体的 sigmaX 和 sigmaY 的值可以根据图像的特性来选择。如果图像中有较大的细节结构,可能需要较小的标准差来保留这些细节。相反,如果图像中的结构比较平坦,可以使用较大的标准差进行更强烈的模糊。

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

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

在这里插入图片描述

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

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

相关文章

Fiddler抓包模拟器(雷电模拟器)

Fiddler设置 List item 打开fiddler,的options 点击OK,重启fiddler 模拟器 更改网络设置 IP可以在电脑上终端上查看 然后在模拟器浏览器中输入IP:端口 安装证书

[二分查找双指针]LeetCode881: 救生艇

救生艇 作者推荐 [二分查找]LeetCode2040:两个有序数组的第 K 小乘积 本文涉及的基础知识点 二分查找算法合集 题目 给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人&am…

[足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-5Laplace Transform of Convolution卷积的拉普拉斯变换

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-数学基础Ch0-5Laplace Transform of Convolution卷积的拉普拉斯变换 Laplace Transform : X ( s ) L [ x ( t ) ] ∫ 0 ∞ x ( t ) e − s t d t X\left( s \right) \mathcal{L} \left[ x\lef…

QT作业2

使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是否为…

【Flink系列三】数据流图和任务链计算方式

上文介绍了如何计算并行度和slot的数量,本文介绍Flink代码提交后,如何生成计算的DAG数据流图。 程序和数据流图 所有的Flink程序都是由三部分组成的:Source、Transformation和Sink。Source负责读取数据源,Transformation利用各种…

Linux各目录结构说明

文章目录 目录说明源码放哪里?拓展:Linux里面安装软件是装在home目录还是opt目录还是/usr/local好? bin boot dev etc home lib lib64 lostfound media mnt opt proc root run sbin srv sys tmp usr var 目录说明 bin 存放二进制可执行文件&…

《Spring Cloud Alibaba 从入门到实战》分布式配置

分布式配置 1、简介 Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。 Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,在特殊的 bootstrap 阶段,…

2023.12.4 关于 Spring Boot 统一异常处理

目录 引言 统一异常处理 异常全部监测 引言 将异常处理逻辑集中到一个地方,可以避免在每个控制器或业务逻辑中都编写相似的异常处理代码,这降低了代码的冗余,提高了代码的可维护性统一的异常处理使得调试和维护变得更加容易,通…

机器学习之无监督学习:九大聚类算法

今天,和大家分享一下机器学习之无监督学习中的常见的聚类方法。 今天,和大家分享一下机器学习之无监督学习中的常见的聚类方法。 在无监督学习中,我们的数据并不带有任何标签,因此在无监督学习中要做的就是将这一系列无标签的数…

Python实现PDF-Excel

轻松解决PDF格式转Excel(使用python实现) 实现思路: 要将PDF转换为Excel,可以使用以下步骤: 解析PDF内容:首先,需要使用Python中的第三方库(如PyPDF2、pdfminer等)来解…

Ribbon 饥饿加载

Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载: 一、懒加载 Ribbon 默认为懒加载即在首次启动Application…

数据结构之插入排序

目录 前言 插入排序 直接插入排序 插入排序的时间复杂度 希尔排序 前言 在日常生活中,我们不经意间会遇到很多排序的场景,比如在某宝,某东上买东西,我们可以自己自定义价格是由高到低还是由低到高,再比如在王者某…

修改移远提供的GobiNet、quectel-CM源码,使其支持有方N720 4G模块

最近在研究imx6ull linux下4G模块驱动的移植,参考的移远ec20的移植方法,添加了GobiNet驱动,编译了quectel-CM工具,并且可以正常拨号,分配到ip,如下: ping外网也没有压力,如下…

Qt12.8

使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是否为…

使用Pytorch实现Grad-CAM并绘制热力图

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 看一下这个main cnn.py的文件 那这里我为了方便 就直接从官方的torch vision这个库当中导入一些我们常用的model 比如说我这里的例子是采用的mobile net v3 large这个模型 然后这里我将pretrain设…

openEuler 20.03 (LTS-SP2) aarch64 cephadm 部署ceph18.2.0【1】离线部署 准备基础环境

准备3台虚拟机服务器(均可访问公网) 10.2.1.176 (作为操作机) 10.2.1.191 10.2.1.219 安装基础工具 yum install -y vim 配置hosts 编辑/etc/hosts,添加 10.2.1.176 ceph-176 10.2.1.191 ceph-191 10.2.1.219 ceph-219 配置免密登录…

JVM 执行引擎篇

机器码、指令、汇编语言 机器码 各种用二进制编码方式表示的指令,叫做机器指令码。开始,人们就用它采编写程序,这就是机器语言。机器语言虽然能够被计算机理解和接受,但和人们的语言差别太大,不易被人们理解和记忆&a…

【MySQL语言汇总[DQL,DDL,DCL,DML]以及使用python连接数据库进行其他操作】

MySQL语言汇总[DQL,DDL,DCL,DML] SQL分类1.DDL:操作数据库,表创建 删除 查询 修改对数据库的操作对表的操作复制表(重点)!!!!! 2.DML:增删改表中数据3.DQL:查询表中的记录…

HLS实现图像膨胀和腐蚀运算--xf_dilation和xf_erosion

一、图像膨胀和图像腐蚀概念 我们先定义,需要处理的图片为二值化图像A。图片的背景色为黑色,即像素值为0。图片的目标色为白色,即像素值为1。 再定义一个结构元S,结构元范围内所有的像素为白色,像素值为1。 1、图像的…

RedHat9中安装Mysql8.0+出现“错误:GPG 检查失败“的处理

近期通过VM安装了RedHat9,之后在RedHat9中安装Mysql8.0的时候出现了个问题:“错误:GPG 检查失败”,如图所示: 解决方案:重新导入新的秘钥即可,如下所示: rpm --import https://rep…