图像平滑去噪之高斯滤波器enporger

高斯滤波器是根据高斯函数来选择权值的线性平滑滤波器,对随机分布和服从正态分布的噪声有很好地滤除效果。本文从opencv内置的高斯滤波函数入手,深入介绍高斯滤波器的原理与实现。

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

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

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

在实际滤波中,将当前像素作为核中心,利用卷积核对周围邻域像素作加权平均,其值作为当前像素的新值。这个过程实质上也是矩阵的卷积(矩阵卷积要求其中一个矩阵要旋转180度,在图像处理时,卷积核可以认为是已经过旋转的矩阵),因此才有卷积核这样的称呼。对于图像边界点,有多种处理方法,如对图像进行扩展、缩小高斯核等。OpenCV中提供了高斯滤波函数:

src为输入的图像,可以是单通道灰度图像,也可以是三通道RGB图像;ksize是卷积核大小,接受tuple类型;sigmaX是水平方向的标准差,sigmaY是垂直方向的标准差,这两个参数可以设置为0,函数内部会根据ksize自动计算标准差,标准差越大,核就越大,核变化趋势就越缓;borderType是边界的处理方式,采取默认值即可。以下是OpenCV-Python的滤波实例:

滤波前后对比如下图。因为高斯滤波是以空间距离来确定权重大小的,但并没有考虑用颜色距离来确定权重,这样就导致了高斯滤波在去除噪声的同时,也一定程度上模糊了边界。

OpenCV本身就提供了高斯核的生成函数,不过它只能构建一维的核,但是根据上面我们提到过的一维乘积性质,我们可以通过两个一维核向量相乘得到一个二维核,该函数接口和代码如下:

这里sigma是根据经验指定的,实际上更多地是让函数自动计算,标准差的计算公式为:

由于我们需要的是二维核,故可以设置两个标准差,分别表示X方向和Y方向,这两个标准差默认采用公式计算。最终获得的卷积核是小数形式,但是我们像素卷积需要整数,同时为了减小计算开销,我们希望核的值为较小的整数。因此,最常用的做法是将角点化为1,其它点相应乘以相同倍数再四舍五入或者直接去除小数部分,这样使得整个核的值较小,可以加快计算。由于标准差指定可能不同,因此还是会有很多相同大小但值不同的核存在,这并不需要惊讶,因为这些核都符合高斯分布,只是在实际滤波时效果有略微差异罢了。

我们也可以自己构造核,但首先我们要先知道高斯核与高斯函数之间的关系。以核中心为平面中心,则核的每个元素都对应一个坐标(x,y)如下图所示:

将每个元素对应的坐标代入到二维高斯函数中,得到的函数值作为该位置的值,再经归一化和整数化后就可以得到最终所要的卷积核。

首先构造高斯函数,Python中我没找到可以直接用的接口,所以就自定义算了,注意二维可以不用再写一遍公式,可以通过一维高斯获取:

根据高斯核与高斯函数的关系,定义一维高斯核构造函数:

上面的函数就类似于OpenCV的getGaussianKernel。因此二维核也采用相同方法创建即可:

在高斯卷积应用中,可能会用到较大的卷积核,此时程序性能就不太令人满意了。卷积可分离性就是解决这种问题的一种优化手段。对于高斯卷积来说,我们可以将图像先与一维水平卷积核相卷积,再与一维垂直方向的卷积核相卷积,所得结果跟直接用二维核来卷积相同,这就是高斯卷积核的可分离性。利用该分离性,卷积复杂度大大降低,并且我们也不需要生成二维卷积核,而只要生成一维核即可,这也减少了计算量。在实际应用中,甚至还可以直接存储常用维数的高斯核数值来提升性能。

下面谈一谈卷积可分离性的原理,不感兴趣的读者可直接阅读下一节。

假设A为n维列向量,B为n维行向量,则有A*B(卷积)=B*A=A·B。例如n=3时,如下图所示:

A对B的卷积(A作为核)需要注意先将A向量旋转180度,再做加权求和操作,过程如下:

前面说过高斯核Kernel2D=KernelX·KernelY,那么卷积过程就可以表示为:Dst=Src*Kernel2D=(Src*KernelX)*KernelY=(Src*KernelY)*KernelX。一般来说,无论对于何种卷积滤波,只要其卷积核可以拆解为两个行向量与列向量的乘积,那么就算卷积可分离。

THE END
0.晶振的构造及工作原理本节内容先写这么多吧,主要是查阅资料,总结了下晶振构造相关的,对于硬件设计来说,用处不是特别大,不过了解下也没坏处。 至于开篇提的几个问题,本节是一个问题也没回答,也不着急,后面总会说清楚的,我希望是慢慢从0开始,构建属于自己的知识体系,这样无论遇到什么问题,见过的,没见过的,总能有分析问题的思路。jvzquC41yy}/gnuy0eun0ls1|j{bpufp14:6;<;0jvsm
1.《建筑构造原理与设计(第5版)》(樊振和著)简介书评当当网图书频道在线销售正版《建筑构造原理与设计(第5版)》,作者:樊振和 著,出版社:天津大学出版社。最新《建筑构造原理与设计(第5版)》简介、书评、试读、价格、图片等相关信息,尽在DangDang.com,网购《建筑构造原理与设计(第5版)》,就上当当网。jvzq<84rtqjve}3fcpmecwl0eqs04>7533730qyon
2.汽车构造图解及原理(高清晰)汽车构造图解及原理(高清晰) 汽车的总体构造基本上由四部分组成:发动机、底盘、车身、电器。 汽车结构视图构造图解 ▼ 汽车底视图构造图解 ▼ 汽车总成拆分图构造图解 ▼ 发动机是汽车的动力装置,其作用是使进入其中的燃料经过燃烧而变成热能,并转化为动能jvzquC41yy}/{xtlkc4dqv4cum55/:6:88;48=9::9?87B>590nuou
3.刘亚辉:抓住汽车构造的基本原理,厘清科学创新的历史过程大家好,我是车辆与运载学院的刘亚辉,我承担的是本科生的 “汽车构造(2)”课程,也就是汽车底盘构造,以下是我的同行锦囊: 刘亚辉老师 这门课是一个专业核心课,也是车辆工程专业课组中的入门课,着重于让同学们掌握主流汽车底盘各系统和主要部件的功用、基本结构和工作原理等。这门课的特点是知识点繁多、理论难度较jvzquC41yy}/v|npij{b0niw0et0kwkq13<:68<2259/j}r
4.给煤机构造与原理讲解.ppt给煤机构造与原理讲解 我厂采用的给煤机是由沈阳华电电站工程有限公司生产的HD-BSC26型称重式计量给煤机,这种HD-BSC26型称重式计量给煤机是用于燃煤火力发电厂锅炉制粉系统的主要给煤设备。能够实现连续、均匀给煤,并在给煤过程中进行准确的称重计算,而且能够根据锅炉燃烧控制系统需要,自动调 节给煤量,使实际给jvzquC41oc~/dxtm33>/exr1jvsm1;5391633?4;42>12;>0ujzn
5.JavaScript构造函数举例详解javascript技巧构造函数的原理(new之后发生了什么) 构造函数之所以能构造出对象,其实JS帮助我们做了很多骚操作。你以为new之后直接执行函数体代码,其实并不是,事实比我们看到了多了四步 1 自从用new调用函数后,JS引擎就会在内存中创建一个空对象{} 1 const newObj = {}; 2 新对象的__proto__属性指向构造函数的原型对象 (通jvzquC41yy}/lk:30pku1jwvkerf1;=2397/j}r
6.数据结构ZKW线段树详解本文详细介绍了ZKW线段树,一种由清华大学张昆玮提出的非递归实现的线段树结构,以其简洁的代码和高效率著称,支持可持久化。内容包括线段树的基础知识、ZKW线段树的构造原理、基本操作(建树、查询、修改)以及区间查询和修改的实现。此外,还提及了Lazy标记的实现思路,适用于区间修改和查询的优化。 数据结构-ZKW线段树详解 😊 | PjvzquC41dnuh0lxfp0tfv8~cpykjsr6976?9;B831cxuklqg1fkucrqu13787@:39:
7.X射线衍射仪基本原理构造及XRD用于合金结构确定新闻X射线衍射仪基本原理、构造及XRD用于合金结构确定,上海研润光学显微镜是金相显微镜的维护和生产制造单位,上海研润光学显微镜厂提供 www.yrmade.comjvzquC41yy}/{{rcfg4dqv4pgyy`cuq1427829<;344ivvq
8.2019中级安全工程师《建筑施工安全》金亮精讲班考点:起重机械安全技术3.塔式起重机的基本构造及原理 金属结构、工作机构、驱动控制系统和安全防护装置四个部分。 速记:金工驱动安全 例:下列关于塔式起重机的基本构造及原理的描述中正确的是( )。 A.塔式起重机能靠近建筑物,其幅度利用率可达全幅度的90% B.塔式起重机的主参数是最大额定起重量 jvzquC41yy}/4<80eqs0cz4ou|j0lƒ4423?2286233623;:550nuou