高斯滤波器时一种线性平滑滤波器,主要适用处理高斯噪声,所以在了解高斯滤波之前,我们首先熟悉一下高斯噪声。噪声在图像中表现的通常是引起视觉效果的孤立像素点和像素块,简单说噪声点就是会给图像带来干扰,让图像变的不清楚。而高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。

高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。由于图像都是二维的,所以在图像处理中我们需要的是二维高斯函数。高斯函数的一维形式是:

$$

f(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}}

$$

其中μ是x的均值,δ是x的方差。当中心点为原点时,u为0,此时的公式如下:

$$

f(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{x^2}{2\sigma{^2}}}

$$

根据一维高斯函数,可以推导出二维高斯函数(中心为原点):

$$

f(x)=\frac{1}{2\pi\sigma{^2}}e^{-\frac{x^2+y^2}{2\sigma{^2}}}

$$

通过上述两个维度的高斯滤波器函数可以得到下图的函数图像。其中$\delta$的大小决定了高斯函数的宽度, σ越大函数图像跨幅越宽,反之则越窄。

在图像处理中,高斯滤波一般有两种实现方式,一是用离散化窗口滑窗卷积,另一种通过傅里叶变换。最常见的就是第一种滑窗实现,只有当离散化的窗口非常大,用滑窗计算量非常大(即使用可分离滤波器的实现)的情况下,可能会考虑基于傅里叶变化的实现方法。

高斯滤波也是一个非常典型的图像卷积例子,本质上,高斯滤波就是将(灰度)图像 和一个高斯核进行卷积操作,具体的方式和上面的两个滤波方法相似,只是卷积核存在差别。理论上,高斯分布在所有定义域上都有非负值,这就需要一个无限大的卷积核。在实际的计算过程中,卷积核是固定大小的,只需要将待计算的“中心点”作为原点,将周围的点按照正态分布函数分配权重,计算加权平均值,得到最终的值,这个过程就是二维高斯核的卷积过程。

具体过程如下图所示,假定中心点坐标为(0,0),当设定卷积核为3时,只需计算距离它最近的8个点,如图中的第一个矩阵所示。以此矩阵中的坐标,带入到公式2-14中,并且取σ=1.5,则半径为1的权重矩阵如图中第二个矩阵所示。因为需要利用该权重矩阵做加权平均,故需要对原始的矩阵做归一化。具体操作方式是求出第二个矩阵的总和为0.4783,然后再将该矩阵的9个值分别除以0.4783,得到最终的卷积核(权重矩阵)。

通过上述步骤计算出高斯核,基于该高斯核便可进行高斯滤波操作。假设现有9个像素点,灰度值(0-255)如下图中第一个卷积核所示,计算图中中心点的滤波后的值。每个像素点乘以相对应的权重值,得到最终的分布值。将这9个像素的值相加得到的结果,就是中心位置图像滤波后的值。对所有点重复这个过程,就得到了高斯滤波后的图像。如果原图是彩色图片,可以对RGB三个通道分别做高斯滤波。

讲解完卷积核的过程,通过代码具体的实现高斯滤波。由于高斯滤波主要针对高斯噪声表现的比较好,所有gasuss_noise在原始图片中添加随机噪声,其中的参数mean和var对应二维高斯核函数的 和 。调用了opencv的GaussianBlur函数,针对下面代码中的(3,3)是高斯矩阵的长和宽,0是高斯核的标准差是0,具体代码如下:

def gasuss_noise(img, mean=0, var=0.005):

'''

添加高斯噪声

mean : 均值

var : 方差

'''

image = img.copy()

image = np.array(image/255, dtype=float)

noise = np.random.normal(mean, var ** 0.5, image.shape)

out = image + noise

if out.min() < 0:

low_clip = -1.

else:

low_clip = 0.

out = np.clip(out, low_clip, 1.0)

out = np.uint8(out*255)

return out

#读取图片

gasuss_noise_img = gasuss_noise(img)

#均值滤波

gasuss_filter_img = cv2.GaussianBlur(img, (3, 3), 1.1)

gasuss_filter_img1 = cv2.GaussianBlur(gasuss_noise_img, (3, 3), 1.1)

gasuss_filter_img2 = cv2.GaussianBlur(gasuss_noise_img, (9, 9), 1.1)

## 显示

plt.figure(figsize=(15, 10))

plt.subplot(2, 2, 1), plt.imshow(img)

plt.axis('off'); plt.title('原图')

plt.subplot(2, 2, 2), plt.imshow(gasuss_noise_img)

plt.axis('off'); plt.title('添加随机高斯噪声')

plt.subplot(2, 2, 3), plt.imshow(gasuss_filter_img1)

plt.axis('off'); plt.title('高斯核为3')

plt.subplot(2, 2, 4), plt.imshow(gasuss_filter_img2)

plt.axis('off'); plt.title('高斯核为9')

plt.show()

运行代码得到,通过matplotlib函数可以得到下图所示的图像。从结果图中可以看出卷积核越大,高斯噪声过滤的效果越好,但是最终的结果图也就越模糊,清晰度越差。具体过滤需要结果过滤效果和图像清晰度综合选取滤波卷积核尺寸半径。

python高斯滤波和降噪_高斯滤波原理及python实现相关推荐

  1. 滑动平均滤波c语言_常用滤波算法及C语言程序实现

    1.限幅滤波法(又称程序判断滤波法) A.方法: 根据经验判断,确定两次采样允许的最大偏差值(设为A) 每次检测到新值时判断: 如果本次值与上次值之差<=A,则本次值有效 如果本次值与上次值之差 ...

  2. python如何实现图片工具_常用的十大 python 图像处理工具

    本文为 AI 研习社编译的技术博客,原标题 : 10 Python image manipulation tools. 作者 | Parul Pandey 翻译 | 安其罗•乔尔.JimmyHua 编 ...

  3. python 结构体数组 定义_一篇文章弄懂Python中所有数组数据类型

    前言 数组类型是各种编程语言中基本的数组结构了,本文来盘点下Python中各种"数组"类型的实现. list tuple array.array str bytes bytearr ...

  4. python实现守护进程_守护进程原理及Python实现

    守护进程原理及Python实现 守护进程,不依赖于终端,在后台运行的程序,通常称为daemon(ˈdiːmən或ˈdeɪmən). 一些常见的Linux软件通常都是已守护进程的方式运行,比如: ngi ...

  5. python学好了能干啥_新手该如何学python怎么学好python?_python学好了能干什么

    1)学好python的第一步,就是马上到www.python.org网站上下载一个python版本.我建议初学者,不要下载具有IDE功能的集成开发环境,比如Eclipse插件等. 2)下载完毕后,就可 ...

  6. python中年大叔学编程_中年大叔学编程-Python简单操作文件

    原标题:中年大叔学编程-Python简单操作文件 在计算机中,经常打交道的就是各种文档,用得比较多的软件就是office和记事本来操作文件,那么我们试试用Python来简单读写文件. Open函数的用 ...

  7. python实现逻辑回归的流程_逻辑回归原理及其python实现

    September 28, 2018 7 min to read 逻辑回归原理及其python实现 原理 逻辑回归模型: $h_{\theta}(x)=\frac{1}{1+e^{-{\theta}^ ...

  8. python从基础到进阶_无需编程基础,Python从入门到进阶大法

    deffactorial(n): ifn==0: return1 else: returnn * factorial(n-1) 13. 框架与栈调用 Python代码载入框架,框架位于栈中. 函数与参 ...

  9. python做自动化测试的优点_乐搏讲自动化测试-python语言特点及优缺点(5)

    相信小伙伴们都知道,随着软件测试行业的发展和进步自动化测试已经成为必然.在竞争日益激烈的市场环境中也是你升职加薪的利器. 所以,小编决定从今天起!将要系统.连续.高质量的持续更新「整套自动化测试」文章 ...

最新文章

  1. 大前端开发者需要了解的基础编译原理和语言知识
  2. js实现旋转木马轮播图
  3. 又臭又长!流着泪我也要把它给改完!
  4. 接口api全局挂载_第 6 篇:分页接口
  5. 特征图注意力_向往的GAT(图注意力模型)
  6. Django从理论到实战(part3)--创建一个Django项目
  7. 深度学习之递归神经网络(Recurrent Neural Network,RNN)
  8. 使用vim的find命令快速打开文件
  9. openwrt x86 登录不上_求助,关于OpenWRT外接硬盘不识别的问题
  10. Python中抽象类和接口的区别
  11. oracle行相减,oracle两张表满足某个条件时,表中满足条件的那一行的某列相减
  12. java反序列化为空_Java序列化/反序列化,提供空对象引用
  13. OTSU 获取最佳阈值,及opencv二值化
  14. 常见的几类矩阵(正交矩阵、酉矩阵、正规矩阵等)
  15. CString和LPVOID的转换(线程参数传递)
  16. android 论坛_Android 应用多开对抗实践
  17. 元宇宙中值得关注的7个前沿游戏,谁会是下一个Axie Infinity?
  18. 机器指令与微指令之间的关系
  19. 计算机主板提示ahci,win7系统amd计算机主板开ahci.docx
  20. Android获取通讯录联系人,右侧字母滑动索引

热门文章

  1. 计算机二级C语言辅导j机构,全国计算机二级C语言公基础知识辅导.pptx
  2. linux文件系统pdf_一篇文章理解Ext4文件系统的目录
  3. c语言农夫过河游戏代码解释,农夫过河C++代码
  4. python语言基础与应用章节七_专技天下Python语言基础与应用章节测试答案
  5. mysql过程异常处理_mysql数据库存储过程异常处理
  6. Python 空值与非空值
  7. python文件和目录操作方法大全(含实例)
  8. python模块初始与time、datetime及random
  9. C语言strchr()函数(字符串中查找子字符)
  10. python PyQt5 slot插槽(pyqtSignal、pyqtSlot)