今天突然想要去试一试opencv里面的高斯模糊怎么实现,虽然以前已经写过很多次关于高斯核的函数了,但是有个好奇点,那就是一般不填sigma这个参数的时候,opencv是怎么计算的。

关于具体的高斯函数的讲解,已经有人写的很详细了,我就不赘述了,所以给大家个链接有兴趣的可以去看看。

http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html

我这里想做的实验是到底opencv中的高斯模糊函数GaussianBlur使用的高斯核是什么。

但是直接获取这个二维的高斯核貌似是不可行的,opencv提供了一维高斯核获取的函数。

具体参考以下页面

https://docs.opencv.org/2.4.13.2/modules/imgproc/doc/filtering.html#void sepFilter2D(InputArray src, OutputArray dst, int ddepth, InputArray kernelX, InputArray kernelY, Point anchor, double delta, int borderType)

那么此处问题就出来了,如何通过一维高斯核生成二维高斯核。

先获取两个一维高斯核,而后对后一个高斯核进行转置,而后第一个高斯核核第二个高斯核通过矩阵相乘就可以得到一个二维高斯核了。

下面是测试代码

def gaussian_kernel_2d_opencv(kernel_size = 3,sigma = 0):kx = cv2.getGaussianKernel(kernel_size,sigma)ky = cv2.getGaussianKernel(kernel_size,sigma)return np.multiply(kx,np.transpose(ky))

然后我需要的是自己写一个二维高斯核函数,此处写法有很多版本,但是我是参考了刚才上面给出的参考链接中的计算方式,同时参考了opencv的源码。

两个地方不一样,一个是opencv当中在计算高斯模版的时候并没有在最后计算除以pi2(sigma**2),而是将每次计算后的数值加起来,最后用1/总和,然后输出的时候将刚才计算的数值乘上本身的像素值。

本来此处写一下公式会比较好理解,但是这里稍微偷懒一下就不给出具体的公式了,大家自行看我下面的代码就OK了。

#kernel_size set (n,n) default
def gaussian_2d_kernel(kernel_size = 3,sigma = 0):kernel = np.zeros([kernel_size,kernel_size])center = kernel_size//2if sigma == 0:sigma = ((kernel_size-1)*0.5 - 1)*0.3 + 0.8s = 2*(sigma**2)sum_val = 0for i in range(0,kernel_size):for j in range(0,kernel_size):x = i-centery = j-centerkernel[i,j] = np.exp(-(x**2+y**2) / s)sum_val += kernel[i,j]#/(np.pi * s)sum_val = 1/sum_valreturn kernel*sum_val

这个计算结果和通过opencv获取一维高斯核通过计算转换为二维高斯核的结果完全一致。此处实验成功。

但是!!通过这个高斯核和图像进行卷积操作的结果和直接通过opencv调用GaussianBlur计算的结果是有所不同的。虽然单纯从数值上来讲,基本都只是差1的大小,但是这说明此函数并不是直接和这个卷积核进行卷积的,而是还做了一点修改。那么具体是什么,我暂时没画时间去查源码,如有了解者希望能够告知我,感激不尽。

最后一个小注意点,上面忘记书写了,卷积核大小在小于等于7的情况下结果是和我自己写的那个函数计算不完全一致的。原因在于opencv源码当中小于等于7的高斯核并不是通过计算给出而是直接给出了结果,所以在小数上有一定差距,估计是效率问题才这么做的。

20190115 修正(源自评论“临京雪月”)

opencv源码当中小于等于7的高斯核并不是通过计算给出而是直接给出了结果。这句话不对,当小于等于7且sigma<=0时候才会使用内置的模板,其余情况同样是计算出来的结果

二维高斯核函数(python)相关推荐

  1. EM算法估计GMM (二维高斯混合模型)参数 python 2.7(西瓜书版)

    #!/usr/bin/python # coding:utf-8 # 19-5-23 上午10:07 # @File : EM.py import numpy as np import math im ...

  2. Matlab绘制三维曲面(以二维高斯函数为例)

    原文地址为: Matlab绘制三维曲面(以二维高斯函数为例) 寒假学习了一下Python下的NumPy和pymatlab,感觉不是很容易上手.来学校之后,决定继续看完数字图像处理一书.还是想按照上学期 ...

  3. matlab画三维向量的曲面,Matlab绘制三维曲面(以二维高斯函数为例)

    寒假学习了一下Python下的NumPy和pymatlab,感觉不是很容易上手.来学校之后,决定继续看完数字图像处理一书.还是想按照上学期的模式,边看边实现书中的算法.上学期看的时候,是用C语言实现的 ...

  4. 使用二维高斯函数模糊图片

    这篇文章以通俗易懂的语言和方式解释了如何使用高斯函数模糊一张图片. 1.一维高斯函数: a表示得到曲线的高度,b是指曲线在x轴的中心,c指width(与半峰全宽有关),图形如下: 2.根据一维高斯函数 ...

  5. python键盘输入数组_python 二维数组切割Python读取键盘输入的2种方法

    Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘.如下: 1.raw_input 2.input raw_input函数raw_input() 函数从标准输入读取一个行,并返 ...

  6. ITK:二维高斯混合模型期望最大化

    ITK:二维高斯混合模型期望最大化 内容提要 输出结果 C++实现代码 内容提要 二维高斯混合模型期望最大值 输出结果 Cluster[0]Parameters:[101.40933830302448 ...

  7. 二维高斯曲面拟合法求取光斑中心及算法的C++实现

    (1)二维高斯去曲面拟合推导 一个二维高斯方程可以写成如下形式: 其中,G为高斯分布的幅值,,为x,y方向上的标准差,对式(1)两边取对数,并展开平方项,整理后为: 假如参与拟合的数据点有N个,则将这 ...

  8. 二维高斯滤波器(gauss filter)的实现

    我们以一个二维矩阵表示二元高斯滤波器,显然此二维矩阵的具体形式仅于其形状(shape)有关: def gauss_filter(kernel_shape): 为实现二维高斯滤波器,需要首先定义二元高斯 ...

  9. 高斯低通滤波 matlab_一维和二维高斯函数及其一阶和二阶导数

    二维高斯函数 高斯函数在图像滤波.边缘检测等中发挥着重要的作用.高斯滤波是典型的低通滤波,对图像有平滑作用.同时,高斯函数的一阶.二阶导数也可以用于高通滤波,比如canny算子中用到的是高斯函数的一阶 ...

最新文章

  1. 独家 | 6种让Python程序变慢的坏习惯
  2. oracle统计事务,统计Oracle 查询事务数的方法
  3. php调用restful接口_jzq_sdk_php
  4. Git 2.5增加了工作树、改进了三角工作流、性能等诸多方面
  5. NYOJ 714 Card Trick
  6. 【Linux】一步一步学Linux——zipinfo命令(69)
  7. Log4j Bug –减慢您的应用程序
  8. 【转】阿里技术专家详解DDD系列 第二讲 - 应用架构
  9. 判断表达式值是否为空_如何在 Python 中判断列表是否为空
  10. java单例模式双重检查
  11. [Selenium] CSS3 选择器
  12. 这家中国企业和星巴克对着干 年亏16亿却成为全球最快上市公司
  13. linux系统下/proc深度解析
  14. zufeoj_1257: 神风堂人数 VIJOS-P1041
  15. 元宇宙火了!终于有人把虚拟现实(AR/VR/MR)讲明白了
  16. 红山区智慧城管系统正式上线运行
  17. ArcGis空间分析学习:超市选址分析
  18. 云e办学习笔记(四)SpringSecurity学习(二)
  19. 绎维软件F-One获得B轮融资,华创资本领投,齐银基金跟投...
  20. 最新版 智能电脑键盘屏幕全记录 免费下载

热门文章

  1. MySQL---查看数据表结构
  2. 常用的PostMethod及getMethod请求
  3. c++编程拼图小游戏
  4. 2012最新网络电台mms地址
  5. 【Swift】监听耳机插入拔出的通知
  6. WIN键 锁定、解锁
  7. STEM课程经典 | 美国小学标准教材1-5级套装,超过40州使用,让孩子在小学掌握科学思维...
  8. git克隆时出现not fount问题
  9. Mysql优化(一)—Sql语句
  10. 「 JVM基础 」Java双亲委派机制