线性滤波

本次教程将介绍几种OpenCV常用的滤波器,将介绍它们详细的原理,图像滤波对于OpenCV图像处理来说是至关重要的一环,它在整个OpenCV中的分量是举足轻重的,我们必须完完全全的掌握它。

图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。

消除图像中的噪声成分叫作图像的平滑化或滤波操作。信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。

图像滤波的目的有两个:

  • 一是抽出对象的特征作为图像识别的特征模式。

  • 另一个是为适应图像处理的要求,消除图像数字化时所混入的噪声。

而对滤波处理的要求也有两条:

  • 一是不能损坏图像的轮廓及边缘等重要信息。

  • 二是使图像清晰视觉效果好。

平滑滤波是低频增强的空间域滤波技术。它的目的有两类:

  • 一类是模糊。

  • 一类是消除噪音。

空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点的平均亮度值。邻域的大小与平滑的效果直接相关,邻域越大平滑的效果越好,但邻域过大,平滑会使边缘信息损失的越大,从而使输出的图像变得模糊,因此需合理选择邻域的大小。

关于滤波器,一种形象的比喻法是:我们可以把滤波器想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像之上,透过这个窗口来看我们得到的图像。

▼ 原理

邻域算子(局部算子)是利用给定像素周围的像素值的决定此像素的最终输出值的一种算子。而线性邻域滤波是一种常用的邻域算子,像素的输出值取决于输入像素的加权和,具体过程如下图:

左边图像与中间图像的卷积产生右边图像。目标图像中蓝色标记的像素是利用原图像中红色标记的像素计算得到的。

邻域算子除了用于局部色调调整以外,还可以用于图像滤波,实现图像的平滑和锐化,图像边缘增强或者图像噪声的去除。本篇文章,我们介绍的主角是线性邻域滤波算子,即用不同的权重去结合一个小邻域内的像素,来得到应有的处理效果。

线性滤波处理的输出像素值是输入像素值的加权和 :

其中的加权和我们称其为“核”,滤波器的加权系数,即滤波器的“滤波系数”。

上面的式子可以简单写作:

其中f表示输入像素值,h表示加权系数“核“,g表示输出像素值

在新版本的OpenCV中,提供了如下三种常用的线性滤波操作,他们分别被封装在单独的函数中,使用起来非常方便:

  • 均值滤波——blur函数

  • 方框滤波——boxblur函数

  • 高斯滤波——GaussianBlur函数

▼ 均值滤波器

均值滤波器是一种低通滤波器,也是线性滤波器。对于一幅图像,我们都知道其像素值在0-255,通常来讲,滤波器所用的一个滤波模板都为奇数,这里我们以3*3为例:

中间黄色部分即为滤波器的模板(卷积核),其将用于与图像进行卷积进而滤波,对于均值滤波器,顾名思义,其像素点为中间九个像素值的均值,从而将整个图像的像素用这个均值像素代替:

函数原型:

dst=cv.blur(src,ksize [,dst [,anchor [,borderType]]])

其中第一个参数为输入的图像,第二个参数为卷积核的大小,后面的我们都采用默认值就可以。

给出示例代码:

import cv2import matplotlib.pyplot as pltimport numpy as npimg = cv2.imread("cat.jpg")blur = cv2.blur(img,(5,5))cv2.imshow("org",img)cv2.imshow("result", blur)cv2.waitKey(0)cv2.destroyAllWindows()

缺陷:均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。特别是椒盐噪声。

▼ 方框滤波器

事实上,方框滤波器与均值滤波器是基本上一样的,我们直接看源码:

import cv2import matplotlib.pyplot as pltimport numpy as npimg = cv2.imread("shu.jpg")blur = cv2.boxFilter(img,-1,(3,3),normalize=False)cv2.imshow("org",img)cv2.imshow("result", blur)cv2.waitKey(0)cv2.destroyAllWindows()

boxFilter则为i方框滤波函数,当

normalize=True

它就完全相当于是一个均值滤波器,滤波像素值计算方法也是均值计算,如图:

但是当

normalize=False

其并非均值,而是卷积核中所有的像素值相加,不除9,那么对于大于255的值,它会全取255进行代替,如图:

▼ 高斯滤波

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值

先来了解一下高斯函数,高斯分布函数指的就是概率论中的正态分布的概率密度函数,均值μ=0时的一维形式和二维形式如下。其中σ为正态分布的标准偏差,其值决定了函数的衰减快慢。

从这两个公式不难看出,二维公式其实等于两个一维函数相乘。从概率论角度看,因为随机变量X,Y是相互独立的,那么他们的联合概率密度就等于边缘概率密度之积。这个特性是非常重要的,现在让我们先看一下高斯函数的图像分布与二维高斯卷积核的样子:

图像上,靠近原点的位置地势高,距离原点越远则地势越低。相应地,卷积核也是中心数值最大,并向四周减小,减小的幅度并不是随意的,而是要求整个卷积核近似高斯函数的图像。由于高斯滤波实质是一种加权平均滤波,为了实现平均,核还带有一个系数,例如上图中的十六分之一、八十四分之一,这些系数等于矩阵中所有数值之和的倒数。

可能有人看不太懂,我简单解释一下高斯滤波的原理,以下面那个数字图为例:

假设中间的204为中心点,高斯滤波的原理就是距离中心点最近其权重系数越大,就类似这样一个图:

那么距离204越近则其权重系数越大,它跟均值滤波还是有很大不同的,均值滤波对于204周围的75和24这两个较小值非常的不友好,会导致误差较大。但是高斯滤波表示,离我近的,吃嘛嘛香,离我远的,说话分量就没有那么重了,不管你值有多大或者多小。我们看一下函数原型:

GaussianBlur(src,ksize,sigmaX [,dst [,sigmaY [,borderType]]])-> dst

  • 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;如果两个sigmas为零,则分别从ksize.width和ksize.height计算得出;为了完全控制结果,而不管将来可能对所有这些语义进行的修改,建议指定所有ksize,sigmaX和sigmaY。

我们来看代码:

import cv2import matplotlib.pyplot as pltimport numpy as npimg = cv2.imread("shu.jpg")blur =  cv2.GaussianBlur(img,(3,3),0)cv2.imshow("org",img)cv2.imshow("result", blur)cv2.waitKey(0)cv2.destroyAllWindows()

我们可以看到,三种线性滤波器都无法很好的去除图片中的椒盐噪声,而要想去除椒盐噪声,我们需要用非线性滤波器,这将在下次介绍。现在我们来总结一下这三种滤波器:

非线性滤波

我们在上个教程中谈到了线性滤波,相比较而言,线性滤波中的高斯滤波最为受欢迎,但是我们也遗留了一个问题,线性滤波对于椒盐噪声的过滤并不是很好,由此我们本次将谈到OpenCV中的非线性滤波。

之前我们说的线性滤波,即两个信号之和的响应和他们各自响应之和相等。换句话说,每个像素的输出值是一些输入像素的加权和,线性滤波器易于构造,并且易于从频率响应角度来进行分析。

其实在很多情况下,使用邻域像素的非线性滤波也许会得到更好的效果。比如在噪声是散粒噪声而不是高斯噪声,即图像偶尔会出现很大的值的时候。在这种情况下,用高斯滤波器对图像进行模糊的话,噪声像素是不会被去除的,它们只是转换为更为柔和但仍然可见的散粒。这就到了中值滤波登场的时候了。

▼ 中值滤波

中值滤波是一种典型的非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,该方法在去除脉冲噪声、椒盐噪声的同时又能保留图像边缘细节。

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,其基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点,对于斑点噪声和椒盐噪声来说尤其有用,因为它不依赖于邻域内那些与典型值差别很大的值。中值滤波器在处理连续图像窗函数时与线性滤波器的工作方式类似,但滤波过程却不再是加权运算。

中值滤波在一定的条件下可以克服常见线性滤波器如最小均方滤波、方框滤波器、均值滤波等带来的图像细节模糊,而且对滤除脉冲干扰及图像扫描噪声非常有效,也常用于保护边缘信息, 保存边缘的特性使它在不希望出现边缘模糊的场合也很有用,是非常经典的平滑噪声处理方法。

顾名思义,中值滤波选择每个像素的邻域像素中的中值作为输出,或者说中值滤波将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。

通俗的来讲,就找中位数嘛,仍然以那个图为例:

我们将值从小到大排列一下:

24 75 78 104 113 121 154 204 235

那么中间值就是113了。

一般采用奇数点的邻域来计算中值,但如果像素点数为偶数时,中值就取排序像素中间两点的平均值。

中值滤波对于去除椒盐噪声特别的有效,我们先来看一下椒盐噪声的定义:

椒盐噪声是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。椒盐噪声是指两种噪声,一种是盐噪声(salt noise)盐=白色(255),另一种是胡椒噪声(pepper noise),椒=黑色(0)。前者是高灰度噪声,后者属于低灰度噪声。一般两种噪声同时出现,呈现在图像上就是黑白杂点。对于彩色图像,则表现为在单个像素BGR三个通道随机出现的255与0,而中值滤波的取值恰恰是中间值,所以会将这些极端值过滤掉,我们来看函数原型:

dst=cv.medianBlur(src,ksize [,dst])

  • dst为输出的图像

  • src为输入的图像

  • ksize为卷积核的大小,它必须为奇数且大于1

代码如下:

import cv2import matplotlib.pyplot as pltimport numpy as npimg = cv2.imread("shu.jpg")blur =  cv2.medianBlur(img,3)cv2.imshow("org",img)cv2.imshow("result", blur)cv2.waitKey(0)cv2.destroyAllWindows()

如图:

可以看到去除椒盐噪声的效果十分明显,我们来总结一下中值滤波的优缺点。

中值滤波器与均值滤波器比较的优势:在均值滤波器中,由于噪声成分被放入平均计算中,所以输出受到了噪声的影响,但是在中值滤波器中,由于噪声成分很难选上,所以几乎不会影响到输出。因此同样用3x3区域进行处理,中值滤波消除的噪声能力更胜一筹。中值滤波无论是在消除噪声还是保存边缘方面都是一个不错的方法。

中值滤波器与均值滤波器比较的劣势:中值滤波花费的时间是均值滤波的5倍以上。

▼ 双边滤波

双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。

双边滤波器的好处是可以做边缘保存,一般过去用的高斯滤波去降噪,都会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。

它的原理大致如图:

为了理解双边滤波的距离和像素差两个影响因素,先说明下面两个概念帮助理解:

空间距离:当前点距离滤波模板中心点的欧式距离。

灰度距离:当前点距离滤波模板中心点的灰度的差值的绝对值。

双边滤波的核函数是空间域核与像素范围域核的综合结果:

  • 1)在图像的平坦区域,像素值变化很小,那么像素差值接近于0,对应的像素范围域权重接近于1,此时空间域权重起主要作用,相当于进行高斯模糊;

  • 2)在图像的边缘区域,像素值变化很大,那么像素差值大,对应的像素范围域权重变大,即使距离远空间域权重小,加上像素域权重总的系数也较大,从而保护了边缘的信息。

我们来看一下函数原型:

cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) → dst

  • src:输入图像

  • d:过滤时周围每个像素领域的直径

  • sigmaColor:在color space中过滤sigma。参数越大,临近像素将会在越远的地方mix

  • sigmaSpace:在coordinate space中过滤sigma。参数越大,那些颜色足够相近的的颜色的影响越大

来看代码:

import cv2import matplotlib.pyplot as pltimport numpy as npimg = cv2.imread("example.png")blur =  cv2.bilateralFilter(img,21,55,55)cv2.imshow("org",img)cv2.imshow("result", blur)cv2.waitKey(0)cv2.destroyAllWindows()

先看原图:

再看一下处理之后的图像:

是不是看到了一种美颜的效果,双边滤波本身就是加强对边缘信息的保留,所以轮廓什么的都会保留下来。

OpenCV中的非线性滤波还有最大值滤波和最小值滤波,但是由于它们原理跟中值滤波一样,并且用到的很少,所以在这里就不过多讲解了。

扫码入群 扫码添加管理员微信

加入“电子产品世界”粉丝交流群

↓↓↓↓点击,查看更多新闻

python高斯噪声怎么去除_【OpenCV+Python】线性滤波amp;非线性滤波相关推荐

  1. python高斯噪声怎么去除_手把手教你如何实现Python手势识别与控制(含代码及动图)...

    Python手势识别与控制 概述 本文中的手势识别与控制功能主要采用 OpenCV 库实现, OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库, 可以运行在Linux, Windows ...

  2. python高斯噪声怎么去除_高斯过程和高斯过程回归

    本文未经允许禁止转载,谢谢合作. 本文我们介绍高斯过程及其在机器学习中应用的一个例子--高斯过程回归. 高斯过程在语音合成中有广泛的应用,我计划在之后的文章中介绍一些应用,但本节我们重点讨论相关的基础 ...

  3. python高斯噪声怎么去除_Python图像处理之Pillow--ImageFilter介绍

    mageFilter:Python中的图像滤波,主要对图像进行平滑.锐化.边界增强等滤波处理. 图像滤波:在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效 ...

  4. python高斯滤波和降噪_高斯滤波原理及python实现

    高斯滤波器时一种线性平滑滤波器,主要适用处理高斯噪声,所以在了解高斯滤波之前,我们首先熟悉一下高斯噪声.噪声在图像中表现的通常是引起视觉效果的孤立像素点和像素块,简单说噪声点就是会给图像带来干扰,让图 ...

  5. python怎么去掉换行符_在Python中,如何去除行末的换行符?

    原标题:在Python中,如何去除行末的换行符? 在python中读取文件时,如何去除行末的换行符?以及在Windows与Linux中的区别? 一.去除换行符 以使用readline进行读取为例: i ...

  6. python高斯噪声_python随机数组,高斯噪声,多项式函数

    在前面的numpy的学习中忽略了这几个重要的知识点,导致今天做作业异常的艰难.现在十分必要将它记录下来. 1.np.random.*必须的是一个非常强的命令啊.不仅可以产生随机数(包括随机整数,实数: ...

  7. python做审计底稿视频_最新Python教学视频,每天自学俩小时,让你offer拿到手软...

    2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...

  8. python文本结构化处理_在Python中标记非结构化文本数据

    python文本结构化处理 Labelled data has been a crucial demand for supervised machine learning leading to a n ...

  9. python做作业没头绪_使用Python做作业

    python做作业没头绪 Applying OpenCV and Tesseract to do your math-homework 应用OpenCV和Tesseract进行数学作业 The pos ...

最新文章

  1. 中科院陆汝钤获吴文俊人工智能最高成就奖,百度王海峰获吴文俊人工智能杰出贡献奖...
  2. Apache Kafka-事务消息的支持与实现(本地事务)
  3. Java 添加播放MIDI音乐
  4. 使你的MFC程序具有win7的透明立体风格
  5. 3.Magento的布局(Layout),块(Block)和模板(Template)
  6. 虚拟串口服务器怎manager,VSPManager虚拟串口管理软件
  7. 03 vsftpd 登录过程的调试
  8. ReportMachine脚本控制背景色
  9. 第十届飞思卡尔杯智能车竞赛规则解读
  10. matlab 稀疏矩阵求 特征值
  11. 2021年金属非金属矿山支柱考试题库及金属非金属矿山支柱找解析
  12. java正则提取字符串中的符号汉字数字字母
  13. 开放集识别之GPD and GEV Classi ers
  14. MySQL数据库基础-----多表查询
  15. 《Real-Time Rendering》第四版学习笔记——Chapter 9 Physically Based Shading(二)
  16. 一份简单的车辆环视全景系统实现
  17. 超级记忆法(4)——第二小时
  18. 上海、广州、北京德国签证申请中心即将重新启动
  19. ChatGPT教你面试阿里P6测试开发岗
  20. cad2016中选择全图字体怎么操作_ps创意字体设计教程:ps怎么做海报漂亮字体

热门文章

  1. PHP判断字符串是否含有特殊字符(亲测有效)
  2. 华为鸿蒙OS正式发布!教你如何升级
  3. python利用浏览器执行js_浏览器如何执行JS
  4. vlc web 登录账号_使用VLC Activex插件做网页版视频播放器
  5. mysql函数 动态语句_自定义函数动态执行SQL语句
  6. 北京遇上西雅图之不二情书
  7. [HNOI2003]激光炸弹(二维前缀和+大坑点)
  8. 传奇关于首饰盒装备系统“十二生肖”“五行八卦”等脚本实例
  9. 2022年打工人转行实录!你后悔转行了吗?
  10. L2/L2+级ADAS市场爆发,国产芯片厂商迎来了关键时刻