CV2逐步学习-2:cv2.GaussianBlur()详解

这篇具有很好参考价值的文章主要介绍了CV2逐步学习-2:cv2.GaussianBlur()详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

  1. 高斯模糊GaussianBlur()中参数详解
    1.1. 由参数解释产生的问题
  2. 深入理解前的准备:高斯函数、图像滤波处理及卷积核
  3. 解释1.1的问题
  4. 权重矩阵、高斯模糊的流程

摘要

  1. 高斯滤波是一种线性平滑滤波
  2. 高斯滤波是对整幅图像进行加权平均的过程,每一个像素点的值都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
  3. 基于二维高斯函数,构建权重矩阵,进而构建高斯核,最终对每个像素点进行滤波处理(平滑、去噪)

1.高斯模糊GaussianBlur()中参数详解

1)原型:

  • cv2.GaussianBlur( SRC,ksize,sigmaX [,DST [,sigmaY [,borderType ] ] ] ) →DST

2)参数:

  • src –输入图像;图像可以具有任何数量的信道,其独立地处理的,但深度应CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
  • dst –输出与图像大小和类型相同的图像src。
  • ksize –高斯核大小。 ksize.width 并且 ksize.height 可以有所不同,但它们都必须是正数和奇数。或者,它们可以为零,然后从计算 sigma*。
  • sigmaX – X方向上的高斯核标准偏差。
  • sigmaY – Y方向上的高斯核标准差;如果 sigmaY 为零,则将其设置为等于 sigmaX;如果两个西格玛均为零,则分别根据ksize.width 和 进行计算 ksize.height(getGaussianKernel()有关详细信息,请参见 link);完全控制的结果,无论这一切的语义未来可能的修改,建议指定所有的ksize,sigmaX和sigmaY。
    borderType –像素外推方法。
1.1.由参数解释产生的问题

    不知道你初次看到这些参数是否很迷惑,是否能迅速理解其代表的含义和作用,反正我是迷的很,在我们对GaussianBlur()进行简单使用时,很多时候我们并不理解我们所设置的参数的内涵及其背后的处理是怎么样的,在我的学习过程中,我提出了如下的几个问题

  1. 高斯核是什么?ksize作用是什么或者说起到什么效果?
  2. 为什么存在对两个标准差的设置?二维高斯函数不也只有一个标准差吗?
  3. 高斯模糊的具体实现流程

这些问题先放一下,先来看一下必要的准备知识

2.高斯函数、卷积核

首先来看高斯分布(即正态分布):
正态分布:
X ~ CV2逐步学习-2:cv2.GaussianBlur()详解:随机变量X的取值x_i和其对应的概率值P(X = x_i) 满足正态分布(高斯函数)

2.1 一维高斯分布

概率密度函数(高斯函数):CV2逐步学习-2:cv2.GaussianBlur()详解CV2逐步学习-2:cv2.GaussianBlur()详解

2.2二维高斯分布

概率密度函数:这里的u、v对应图像坐标系下像素点的坐标
CV2逐步学习-2:cv2.GaussianBlur()详解
可视化图片为:该图来源于link
CV2逐步学习-2:cv2.GaussianBlur()详解

2.3线性滤波处理及卷积核
线性滤波与卷积的基本概念

        线性滤波可以说是图像处理最基本的方法,它可以允许我们对图像进行处理,产生很多不同的效果。做法很简单。首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处理的二维图像。然后,对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。这样就完成了滤波过程。
CV2逐步学习-2:cv2.GaussianBlur()详解
关于卷积核的具体处理实例可在这里查看,便于理解:link
贴一张那篇文章中的实例图:
CV2逐步学习-2:cv2.GaussianBlur()详解

3.解释1.1的问题

3.1高斯核是什么?ksize作用是什么或者说起到什么效果?
  • 高斯核可看作卷积核,同样为二维滤波器矩阵,不同的是高斯核在普通卷积核的基础上进行了加权处理(后面会讲的权重矩阵)
  • ksize即规定这个二维滤波器矩阵的形状
3.2为什么存在对两个标准差的设置?二维高斯函数不也只有一个标准差吗?

        由cv2.GaussianBlur()原型我们知道,存在两个标准差sigmaX和sigmaY的设置,部分博客中会提到这两个sigma分别是对X,Y方向(也可说u、v方向,都是针对图像坐标系)的标准差,但基本均未给出其处理逻辑、过程,让人很是迷惑。

关于参数的问题,当然要看官方文档/源代码

首先,cv2.GaussianBlur中调用了getGaussianKernel()接口

那么来看getGaussianKernel:
CV2逐步学习-2:cv2.GaussianBlur()详解
        这个函数可以根据ksize和sigma求出对应的高斯核,而返回值是一个一维高斯核。
        其中需要注意的是,如果sigma为非正数(负数或0)的话,就会根据ksize来自动计算sigma,计算公式为sigma = 0.3*((ksize-1)*0.5-1)+0.8

        在官方解释中,我们可以看到:两个这样产生的一维高斯核可以传递给sepFilter2D函数

那我们来看看这个函数是怎么处理这俩个一维高斯核的:
CV2逐步学习-2:cv2.GaussianBlur()详解
        cv2.sepFilter2D函数传入两个一维kernel,然后对图像的每一行以kernelX为卷积核做卷积,对结果的每一列以kernelY为卷积核做卷积,最后归一化得到的高斯滤波后的图像。

对 这 个 问 题 我 们 得 出 结 论 : \color{#FF3030}{对这个问题我们得出结论:} opencv实现的高斯滤波,是对传入的sigmaX,
sigmaY分别产生两个一维卷积核,然后分别再行和列上做卷积,其中sigmaX和sigmaY如果没有传入参数,则由ksize计算得到。

4.权重矩阵、高斯模糊的过程

        高斯模糊或者说高斯滤波(高斯核)对图像进行滤波处理的一大特点就是对中心点邻域像素值进行‘加权平均’后将值赋予中心像素点,这里便用到了权重矩阵,该矩阵就是基于二维高斯函数(概率密度函数)得到的。

偷懒一下,这部分基本未更改,来自link

权重矩阵:
假设高斯核(3*3),即对中心点领域内8个点进行加权平均,那么原始矩阵如下:
CV2逐步学习-2:cv2.GaussianBlur()详解
假定在此矩阵中的中心点的坐标是(0,0),那么距离它最近的8个点的坐标如上图所示。

为了计算权重矩阵,需要自己设定σ模糊半径(指的就是你中心点与周围像素的距离取值后所确定的值)。我们来定σ=1.5,则模糊半径为1.5的权重矩阵如下:
CV2逐步学习-2:cv2.GaussianBlur()详解

为了完成权重矩阵的归一化,我们还需要对上面的各值进行除于他们的总值的计算,目的是让最终的图像通道的权重总值为1,不然使用总值大于1的卷积滤镜会让图像偏亮,小于1的卷积滤镜会让图像偏暗。这九个权重值的总和等于0.4787147,所以我们直接进行除法运算,得到以下的权重矩阵。
这个权重矩阵就是我们最终得到的高斯核!!即滤波器矩阵
CV2逐步学习-2:cv2.GaussianBlur()详解
假设我们有一个图像矩阵也就是未经过处理的图像矩阵,他们的灰度值如下图所示(如果是彩色RGB图像则需要分别计算3个通道的色值):
CV2逐步学习-2:cv2.GaussianBlur()详解
高斯模糊后的灰度值矩阵,有效数据是中心点数值
CV2逐步学习-2:cv2.GaussianBlur()详解
一个图像的所有点都进行如上过程,就能最终得到高斯模糊后的图像。

参考文档:
link1
link2
link3
link4
link5文章来源地址https://www.toymoban.com/news/detail-451616.html

到了这里,关于CV2逐步学习-2:cv2.GaussianBlur()详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • cv2.contourArea函数详解

    问题 :cv2.findContours找到所有的轮廓之后,想取出包含面积最大的轮廓,用cv2.contourArea算一下,但是得到的结果跟实际差别相当大,最大轮廓面积的计算成很小的一个值,而其中一个不太起眼的区域被计算得倒最大的面积。 findContours() 提取轮廓, contourArea() 计算轮廓面积。

    2024年02月11日
    浏览(44)
  • cv2.minAreaRect函数详解

    一、cv2.minAreaRect函数作⽤:返回不规则四边形的最⼩外接矩形 二、opencv4.2版本:         1、输入:多边形轮廓形点         2、输出:最⼩外接矩形的中⼼点坐标x,y,宽⾼w,h,⾓度anlge 三、angle角度解释:         x轴逆时针旋转最先重合的边为w,此时x轴逆时针旋转

    2024年02月13日
    浏览(58)
  • 图片缩放cv2.resize()详解

    resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None) 参数解释 : 参数 解释 src 输入原图像 dsize 输出图像的大小,方式:(宽,高) fx width方向的缩放比例 fy height方向的缩放比例 interpolation 插值方式,默认为双线性插值 scr、dsize是必传参数,fx、fy、interpolation是可选参数。 图片进

    2023年04月19日
    浏览(48)
  • Opencv cv2.putText 函数详解

    具体函数如下: 函数源码如下: 对应的参数如下: 参数 具体表述 image 绘制的图像 text 绘制的文本 org 文本在图像中显示的坐标,用元组表示格式为(X坐标,Y坐标) font 文本字体类型,值可以为 FONT_HERSHEY_SIMPLEX 、 FONT_HERSHEY_PLAIN fontScale 字体比例因子乘以font-specific基本大小 c

    2024年02月09日
    浏览(68)
  • opencv 边缘检测 cv2.Canny()详解

    👨‍💻 个人简介: 深度学习图像领域工作者 🎉 总结链接:              链接中主要是个人工作的总结,每个链接都是一些常用demo,代码直接复制运行即可。包括:                     📌 1.工作中常用深度学习脚本                     📌 2.to

    2024年02月03日
    浏览(57)
  • Python中cv2.Canny() 函数用法详解

    一、Canny算子边缘检测原理及步骤 cv2.Canny() 函数是 OpenCV 中的边缘检测函数之一,用于检测图像的边缘。它的基本原理是通过计算图像中每个像素点的梯度值来检测边缘。具体来说,它的实现步骤如下: 1、对输入图像进行高斯滤波,以平滑图像并去除噪声; 2、计算图像的梯

    2024年02月09日
    浏览(49)
  • opencv-python库 cv2 图形绘制 cv2.line()cv2.rectangle()cv2.circle()cv2.ellipse()cv2.polylines()cv2.putText

    cv2.line() 是 OpenCV 中的一个函数,用于在图像上绘制直线。这个函数需要指定图像、线的起点和终点坐标、线的颜色、线的宽度以及线的类型。 下面是 cv2.line() 函数的详细参数说明: 参数解释: 下面是一个使用 cv2.line() 绘制直线的简单示例: 在这个例子中,我们创建了一个

    2024年04月23日
    浏览(46)
  • 画圆操作——OpenCV中cv2.circle函数详解

    画圆操作——OpenCV中cv2.circle函数详解 在计算机视觉领域,图像处理是最基础的操作,而画圆操作又是其中不可或缺的一部分。在OpenCV中,cv2.circle函数可以实现画圆的功能。 下面是cv2.circle函数的基本格式: 其中各参数含义如下: img:要进行画圆操作的图片。 center:圆心坐

    2024年02月09日
    浏览(55)
  • 【Python/Opencv】图像权重加法函数:cv2.addWeighted()详解

    在OpenCV图像加法cv2.add函数详解详细介绍了图像的加法运算。 除了这种加法外,OpenCV还提供了带权重的加法,即两副图像的像素通道值相加时各自按一定的权重比例取值来相加。 假设有2个图像矩阵src1和src2,在两个图像融合时,各自的权重分别为alpha和beta,则二者融合后的目

    2024年02月15日
    浏览(85)
  • 详解cv2.addWeighted函数【使用 OpenCV 添加(混合)两个图像-Python版本】

    有的时候我们需要将两张图片在alpha通道进行混合,比如深度学习数据集增强方式MixUp。OpenCV的 addWeighted 提供了相关操作,此篇博客将详细介绍这个函数,并给出代码示例。🚀🚀 o u t p u t I m g = s a t u r a t e ( α ∗ i n p u t I m g 1 + β ∗ i n p u t I m g 2 + γ ) rm outputImg=saturate( al

    2024年02月06日
    浏览(91)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包