目录

  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 ~ :随机变量X的取值x_i和其对应的概率值P(X = x_i) 满足正态分布(高斯函数)

2.1 一维高斯分布

概率密度函数(高斯函数):

2.2二维高斯分布

概率密度函数:这里的u、v对应图像坐标系下像素点的坐标

可视化图片为:该图来源于link

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

线性滤波可以说是图像处理最基本的方法,它可以允许我们对图像进行处理,产生很多不同的效果。做法很简单。首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处理的二维图像。然后,对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。这样就完成了滤波过程。

关于卷积核的具体处理实例可在这里查看,便于理解:link
贴一张那篇文章中的实例图:

3.解释1.1的问题

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

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

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

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

那么来看getGaussianKernel:

        这个函数可以根据ksize和sigma求出对应的高斯核,而返回值是一个一维高斯核。
        其中需要注意的是,如果sigma为非正数(负数或0)的话,就会根据ksize来自动计算sigma,计算公式为sigma = 0.3*((ksize-1)*0.5-1)+0.8

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

那我们来看看这个函数是怎么处理这俩个一维高斯核的:

        cv2.sepFilter2D函数传入两个一维kernel,然后对图像的每一行以kernelX为卷积核做卷积,对结果的每一列以kernelY为卷积核做卷积,最后归一化得到的高斯滤波后的图像。

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

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

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

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

权重矩阵:
假设高斯核(3*3),即对中心点领域内8个点进行加权平均,那么原始矩阵如下:

假定在此矩阵中的中心点的坐标是(0,0),那么距离它最近的8个点的坐标如上图所示。

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

为了完成权重矩阵的归一化,我们还需要对上面的各值进行除于他们的总值的计算,目的是让最终的图像通道的权重总值为1,不然使用总值大于1的卷积滤镜会让图像偏亮,小于1的卷积滤镜会让图像偏暗。这九个权重值的总和等于0.4787147,所以我们直接进行除法运算,得到以下的权重矩阵。
这个权重矩阵就是我们最终得到的高斯核!!即滤波器矩阵

假设我们有一个图像矩阵也就是未经过处理的图像矩阵,他们的灰度值如下图所示(如果是彩色RGB图像则需要分别计算3个通道的色值):

高斯模糊后的灰度值矩阵,有效数据是中心点数值

一个图像的所有点都进行如上过程,就能最终得到高斯模糊后的图像。

参考文档:
link1
link2
link3
link4
link5

CV2逐步学习-2:cv2.GaussianBlur()详解相关推荐

  1. java多线程学习-java.util.concurrent详解

    http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...

  2. ELK学习笔记之Logstash详解

    0x00 Logstash概述 官方介绍:Logstash is an open source data collection engine with real-time pipelining cap ...

  3. expect学习笔记及实例详解【转】

    1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示: 1.1 首行加上/usr/bin/expect 1.2 spawn: 后面加上需要执行的shell命令,比如说 ...

  4. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

  5. Python基础学习之 os 模块详解

    Python基础学习之 os 模块详解 文章目录 Python基础学习之 os 模块详解 1. 路径操作 1.1 os.chdir(),切换当前工作目录: 1.2 os.getcwd(),返回工作目录 ...

  6. Activiti工作流学习之流程图应用详解

    Activiti工作流学习之流程图应用详解 1.目的 了解Activiti工作流是怎样应用流程图的. 2.环境准备 2.1.相关软件及版本 jdk版本:Jdk1.7及以上 IDE:eclipse 数据 ...

  7. Quartz学习之Cron表达式详解

    Quartz学习之Cron表达式详解 一.cron表达式结构 **二.各字段的含义** 解释: 注意要点: 三.示例 一.cron表达式结构 cron表达式从左到右(用空格隔开):**秒 分 小时 月 ...

  8. 【强化学习】Sarsa算法详解以及用于二维空间探索【Python实现】

    Sarsa算法 Sarsa算法,是基于Q-Learning算法.改动其实很小. 本文工作基于之前的Q-Learning的项目,如果有疑问可以看下面两个问题: [强化学习]Q-Learning算法详解以 ...

  9. 机器学习,深度学习基础算法原理详解(图的搜索、交叉验证、PAC框架、VC-维(持续更新))

    机器学习,深度学习基础算法原理详解(图的搜索.交叉验证.PAC框架.VC-维.支持向量机.核方法(持续更新)) 机器学习,深度学习基础算法原理详解(数据结构部分(持续更新)) 文章目录 1. 图的搜索 ...

  10. [联邦学习] FedAvg聚合算法详解及代码实现

    该文章首发于若绾 [联邦学习] FedAvg聚合算法详解及代码实现,转载请标注出处. 论文原文:Communication-Efficient Learning of Deep Networks fr ...

最新文章

  1. [JS-JQuery]基础
  2. redis 用setbit(bitmap)统计活跃用户
  3. MATLAB中plot函数的linespec参数
  4. python如何安装torch_PyTorch安装与基本使用详解
  5. python输出结果空格分割_用Python编写固定宽度,以空格分隔的CSV输出
  6. pgsql数据库默认配置事务类型_postgreSql最佳配置详解(connection 申请、回收策略)...
  7. mysql远程访问错误
  8. java : JSR107缓存规范
  9. hadoop2.0初识1.2
  10. Android 去除最上面应用名称及图标
  11. linux zk服务 关闭_linux上安装zookeeper 启动和关闭的教程
  12. mybatis中大于小于号转义字符
  13. 数据库和网页之间的数据交互
  14. 和异性合租是什么样的体验?
  15. NAS - 群晖NAS安装Jenkins
  16. Android投屏到Windows电脑
  17. argc,**argv
  18. 在线广告原理:从橱窗到互联网广告核心交易模式——RTB
  19. PbootCms微信小程序官网模版
  20. 什么是分布式存储?主要应用在哪些方面?

热门文章

  1. GitHub上README.md排版样式教程
  2. java入门-java程序
  3. 网易面试是一种什么体验?
  4. Vim快捷键学习---记性不行了,留这里备查
  5. 昨天我请教了几位大佬,他们告诉我要这样学习编程!
  6. Systrace 基础知识 - 锁竞争解读
  7. javaEE练习(商城练习)
  8. Django admin后台美化(极其简单)
  9. collections.Counter
  10. 【C语言】之实现回文数判断