高斯模糊是一种常见的模糊技术,相关知识点有:高斯函数、二维卷积。

更多优质文章可以关注微信公众号【kelly学挖掘】,欢迎访问

(一)一维高斯分布函数

一维(连续变量)高斯函数形式如下,高斯函数又称“正态分布函数”:

μ是分布函数的均值(或者期望),sigma是标准差。

一维高斯分布函数的图形:

从图可知,以x=0为中心,x取值距离中心越近,概率密度函数值越大,距离中心越远,密度函数值越小。

(二)二维高斯分布函数

二维高斯分布函数的形式:

特别说明,当变量x和y相互独立时,则相关系数ρ=0,二维高斯分布函数可以简化为:

二维高斯分布函数的图形:

对于一维高斯分布,函数中心是平面上的一个点;而对于二维高斯分布,函数中心是一个三维立体空间上的一个点,即上图中山峰的最顶端处的点。

(三)高斯模糊

高斯模糊本质上一种数据平滑技术,可以用于一维、二维甚至多维空间。数据经高斯模糊处理之后,数据会趋向于周边邻近的其他数据,导致各个数据“趋同”。

在图像领域,各个位置的像素值使用“周边邻居像素点加权平均”重新赋值。对于每个像素点,由于计算时均以当前像素点为中心,所以均值μ=0。使用时有2个超参数需要设置:高斯核大小和高斯函数标准差σ。高斯核大小表示“影响当前点的最大邻域范围”,而标准差表示“邻域中的其他像素点对当前点的影响力”。

从下而上观察下图各个函数图像,各个函数的均值相同,而方差逐步减小。

方差衡量数据的分散程度,方差越大,数据越分散,图形就越扁平,数据的集中趋势越弱,应用到高斯模糊中方差越大图形越模糊。

高斯模糊涉及到2个关键技术点:

(1)如何计算高斯卷积核

3×3大小的高斯卷积核的计算示意图

直接计算二维高斯函数值后,卷积核的各个位置取值(截图自pycharm的debug):

卷积核归一化后的各个位置取值(截图自pycharm的debug):

高斯卷积核的python代码:

def gaussian_kernel(self):kernel = np.zeros(shape=(self.kernel_size, self.kernel_size), dtype=np.float)radius = self.kernel_size//2for y in range(-radius, radius + 1):  # [-r, r]for x in range(-radius, radius + 1):# 二维高斯函数v = 1.0 / (2 * np.pi * self.sigma ** 2) * np.exp(-1.0 / (2 * self.sigma ** 2) * (x ** 2 + y ** 2))kernel[y + radius, x + radius] = v  # 高斯函数的x和y值 vs 高斯核的下标值kernel2 = kernel / np.sum(kernel)return kernel2

(2)如何在二维图像上进行卷积

对于二维矩阵,卷积时卷积核从左向右、从上而下的滑动,对应位置求加权和。一般图像是RGB三通道,需要逐个通道卷积,每个通道是一个二维矩阵。灰度图只有一个通道,直接卷积即可。

自行实现的二维离散卷积的python代码:

def my_conv2d(inputs: np.ndarray, kernel: np.ndarray):# 计算需要填充的行列数目,这里假定mode为“same”# 一般卷积核的hw都是奇数,这里实现方式也是基于奇数尺寸的卷积核h, w = inputs.shapekernel = kernel[::-1, ...][..., ::-1]  # 卷积的定义,必须旋转180度h1, w1 = kernel.shapeh_pad = (h1 - 1) // 2w_pad = (w1 - 1) // 2inputs = np.pad(inputs, pad_width=[(h_pad, h_pad), (w_pad, w_pad)], mode="constant", constant_values=0)outputs = np.zeros(shape=(h, w))for i in range(h):  # 行号for j in range(w):  # 列号outputs[i, j] = np.sum(np.multiply(inputs[i: i + h1, j: j + w1], kernel))return outputs

scipy中已经提供二维卷积函数scipy.signal.convolve2d,可以直接调用,下图是和自行实现的对比效果。

运行之后结果一致,验证自行实现的二维卷积正确。

补充:scipy.signal.convolve2d的参数说明

  • in1:输入矩阵

  • in2:卷积核

  • mode:指示输出矩阵的尺寸,full代表完全离散线性卷积, valid代表输出尺寸等于输入尺寸-卷积核+1, same代表输出尺寸与输入尺寸一致。

  • boundary:需要填充时边界填充方式,fill代表使用常量值填充, wrap代表循环方式填充, symm代表以四周边为对称轴对称填充。

  • fillvalue:常量填充时的填充值

(四)完整代码和运行效果

完整的python代码​​​​​​


class GaussianBlur(object):def __init__(self, kernel_size=3, sigma=1.5):self.kernel_size = kernel_sizeself.sigma = sigmaself.kernel = self.gaussian_kernel()def gaussian_kernel(self):kernel = np.zeros(shape=(self.kernel_size, self.kernel_size), dtype=np.float)radius = self.kernel_size//2for y in range(-radius, radius + 1):  # [-r, r]for x in range(-radius, radius + 1):# 二维高斯函数v = 1.0 / (2 * np.pi * self.sigma ** 2) * np.exp(-1.0 / (2 * self.sigma ** 2) * (x ** 2 + y ** 2))kernel[y + radius, x + radius] = v  # 高斯函数的x和y值 vs 高斯核的下标值kernel2 = kernel / np.sum(kernel)return kernel2def filter(self, img: Image.Image):img_arr = np.array(img)if len(img_arr.shape) == 2:new_arr = signal.convolve2d(img_arr, self.kernel, mode="same", boundary="symm")else:h, w, c = img_arr.shapenew_arr = np.zeros(shape=(h, w, c), dtype=np.float)for i in range(c):new_arr[..., i] = signal.convolve2d(img_arr[..., i], self.kernel, mode="same", boundary="symm")new_arr = np.array(new_arr, dtype=np.uint8)return Image.fromarray(new_arr)def main():img = Image.open("Jeep-cd.jpg").convert("RGB")img2 = GaussianBlur(sigma=2.5).filter(img)plt.subplot(1, 2, 1)plt.imshow(img)plt.subplot(1, 2, 2)plt.imshow(img2)# dpi参数维持图片的清晰度plt.savefig("gaussian.jpg", dpi=500)plt.show()pass

代码运行效果,发现经高斯模糊处理之后,图片发生明显模糊。

更多优质文章可以关注微信公众号【kelly学挖掘】,欢迎访问

-- over --

高斯模糊原理和python实现相关推荐

  1. 单链表反转的原理和python代码实现

    链表是一种基础的数据结构,也是算法学习的重中之重.其中单链表反转是一个经常会被考察到的知识点. 单链表反转是将一个给定顺序的单链表通过算法转为逆序排列,尽管听起来很简单,但要通过算法实现也并不是非常容 ...

  2. 机器学习笔记——2 简单线性模型及局部加权线性模型的基本原理和python实现(参数估计的两个基本角度:几何直观和概率直观。函数最值问题的两大基本算法:梯度方法与迭代方法)

    简单线性模型及局部加权线性模型的基本原理和python实现(参数估计的两个基本角度:几何直观和概率直观.函数最值问题的两大基本算法:梯度方法与迭代方法) 线性模型是什么? 线性模型是监督学习的各类学习 ...

  3. 【图像处理】——图像质量评价指标信噪比(PSNR)和结构相似性(SSIM)(含原理和Python代码)

    目录 一.信噪比(PSNR) 1.信噪比的原理与计算公式 2.Python常规代码实现PSNR计算 3.TensorFlow实现PSNR计算 4.skimage实现PSNR计算 5.三种方法计算的结果 ...

  4. 浅谈特征选择的原理和Python实现

    0.引言 在现实世界中,我们总是倾向于收集尽可能多的特征来描述一个事物,以期能够更加全面准确的对其进行刻画.然而,我们了解事物的目的是变化着的,所以并非每一次对事物的刻画都需要所有特征.例如在机器学习 ...

  5. 线性插值法的原理和python代码实现

    假设我们已知坐标 (x0, y0) 与 (x1, y1),要得到 [x0, x1] 区间内某一位置 x 在直线上的值.根据图中所示,我们得到 由于 x 值已知,所以可以从公式得到 y 的值 已知 y  ...

  6. 回归分析---线性回归原理和Python实现

    2019独角兽企业重金招聘Python工程师标准>>> 本文主要运用Python进行简单的线性回归,首先是介绍了线性回归的基本理论,然后是运用一些网络爬虫数据进行回归分析. 1 2 ...

  7. Dixon 检验法判断正态分布离群值——原理和 Python 实现

    文章目录 Dixon 检验--单侧检验 原理步骤 Python 实现 Dixon 检验--双侧检验 小案例 本文主要根据 GB/T 4883-2008 的 7.3 条款写成. 记样本为 x1,x2,⋯ ...

  8. EM算法原理和python简单实现

    目录 第一章最大似然估计    1 第二章最大似然估计到EM    2 第三章 EM算法推导    3 第四章 EM例子和python代码    7 参考文献    8 最大似然估计 这篇文章主要是在 ...

  9. python 隐马尔科夫_隐马尔可夫模型原理和python实现

    隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程.其难点是从可观察的参数中确定该过程的隐含参数. 隐马尔可夫模型注意包含以下参数 ...

最新文章

  1. 三层交换机原理:01路由器如何隔离广播域?
  2. ios 设备方向判断
  3. python删除类方法_python中向类中动态添加新特性及删除属性方法
  4. 学习node js 之微信公众帐号接口开发 准备工作之三
  5. java log 配置,java日志系统--log4j配置解析过程,源码分析
  6. 【Linux】一步一步学Linux——halt命令(196)
  7. 学习官方示例 - System.Frac: 返回小数部分
  8. 多个线程访问统一对象的不同方法_不会多线程还想进BAT?精选19道多线程面试题,有答案边看边学...
  9. 判断一个字符串是否为回文-链队(新建,进队,出队),链栈(新建,进栈,出栈)...
  10. oracle重置口令是什么意思,Oracle重置数据库命令
  11. BT656与BT1120的区别
  12. 网付快讯:华为拿下支付牌照!移动支付行业迎来三足鼎立盛况
  13. 1218. 最长定差子序列【我亦无他唯手熟尔】
  14. 微信小程序之文件上传PHP后台接收
  15. 2022年淘宝618活动时间和天猫618有什么优惠活动
  16. LSTM最好理解文章
  17. tflite模型测试
  18. 推荐一个大佬,文章适合偷偷读!
  19. 习题(3-3) 计算(a+b)*c的值
  20. 如何创建synonyms同义词

热门文章

  1. MOOC数据结构 第8周测验
  2. PHP将图片验证码转换成base64格式
  3. 阿里云dataworks/maxcomputer和自建集群的对比
  4. 虚拟机RedHatEenterpriseLinux5安装及Oracle10.2.0安装手记收藏
  5. 大型企业使用树莓派进行弱网测试通用流程
  6. 公众号文章、底部菜单栏关键词自动回复投票、报名、预约、查询等链接?
  7. 通达信dll接口什么意思?
  8. Docker + PostgreSQL 主从环境搭建
  9. 一文了解SAAS开发、模板定制开发、全定制开发
  10. arctic数据库使用教程(1)---为啥要用arctic以及arctic的简单应用