高斯滤波及离散化

本博客转载自http://www.cnblogs.com/ping-36/articles/2810203.html请尊重版权,谢谢博主的分享,受益匪浅

预备知识:

      所谓径向基函数 (Radial Basis Function 简称 RBF), 就是某种沿径向对称的标量函数。 通常定义为空间中任一点x到某一中心xc之间欧氏距离的单调函数 , 可记作 k(||x-xc||), 其作用往往是局部的 , 即当x远离xc时函数取值很小。最常用的径向基函数是高斯核函数 ,形式为 k(||x-xc||)=exp{- ||x-xc||^2/(2*σ)^2) } 其中xc为核函数中心,σ为函数的宽度参数 , 控制了函数的径向作用范围。

 

1、高斯滤波原理

     高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器。

     常用的零均值离散高斯滤波器函数:

     g(x)=exp( -x^2/(2 sigma^2)

  其中,高斯分布参数Sigma决定了高斯函数的宽度。对于图像处理来说,常用二维零均值离散高斯函数作平滑滤波器。

   高斯函数具有五个十分重要的性质(这5个性质表明, 高斯平滑滤波器无论在空间域还是在频率域都是十分有效的低通滤波器):

  (1)二维高斯函数具有旋转对称性,即滤波器在各个方向上的平滑程度是相同的.一般来说,一幅图像的边缘方向是事先不知道的,因此,在滤波前是无法确定一个方向上比另一方向上需要更多的平滑.旋转对称性意味着高斯平滑滤波器在后续边缘检测中不会偏向任一方向.

  (2)高斯函数是单值函数.这表明,高斯滤波器用像素邻域的加权均值来代替该点的像素值,而每一邻域像素点权值是随该点与中心点的距离单调增减的.这一性质是很重要的,因为边缘是一种图像局部特征,如果平滑运算对离算子中心很远的像素点仍然有很大作用,则平滑运算会使图像失真.

  (3)高斯函数的付立叶变换频谱是单瓣的.这一性质是高斯函数付立叶变换等于高斯函数本身这一事实的直接推论.图像常被不希望的高频信号所污染(噪声和细纹理).而所希望的图像特征(如边缘),既含有低频分量,又含有高频分量.高斯函数付立叶变换的单瓣意味着平滑图像不会被不需要的高频信号所污染,同时保留了大部分所需信号.

  (4)高斯滤波器宽度(决定着平滑程度)是由参数σ表征的,而且σ和平滑程度的关系是非常简单的.σ越大,高斯滤波器的频带就越宽,平滑程度就越好.通过调节平滑程度参数σ,可在图像特征过分模糊(过平滑)与平滑图像中由于噪声和细纹理所引起的过多的不希望突变量(欠平滑)之间取得折衷.

  (5)由于高斯函数的可分离性,较大尺寸的高斯滤波器可以得以有效地实现.二维高斯函数卷积可以分两步来进行,首先将图像与一维高斯函数进行卷积,然后将卷积结果与方向垂直的相同一维高斯函数卷积.因此,二维高斯滤波的计算量随滤波模板宽度成线性增长而不是成平方增长.

 

     二维高斯函数为:

     前面的常数项是要确保整个平面的积分值是1,但在实际应用中经常被忽略,如下:

   高斯函数各向同性,其曲线是草帽状的对称图,该曲线对整个覆盖面积求积分为1。高斯滤波的思路就是:对高斯函数进行离散化,以离散点上的高斯函数值为权值,对我们采集到的灰度矩阵的每个像素点做一定范围邻域内的加权平均,即可有效消除高斯噪声。

2、高斯滤波离散化

     一个离散的高斯卷积核 H: 2k+1x2k+1 可以用下式计算得到,H(i,j)为

image

其中Sigma为方差,k确定核矩阵的维数。sigma的取值值得注意,太小矩阵中只有一个非零元素,太大的话k也要大,不然周围点的贡献将被忽略。一般是k的一个函数。

    (转自http://www.baisi.net/viewthread.php?tid=219452) 

     高斯函数的最佳逼近由二项式展开的系数决定,换句话说,用杨辉三角形(也称Pascal三角形)的第n行作为高斯滤波器的一个具有n个点的一维逼近,例如,五点逼近为:

1 4 6 4 1

它们对应于Pascal三角形的第5行.这一模板被用来在水平方向上平滑图像.在高斯函数可分离性性质中曾指出,二维高斯滤波器能用两个一维高斯滤波器逐次卷积来实现,一个沿水平方向,一个沿垂直方向.实际中,这种运算可以通过使用单个一维高斯模板,对两次卷积之间的图像和最后卷积的结果图像进行转置来完成. 这一技术在模板尺寸N约为10时的滤波效果极好.对较大的滤波器,二项式展开系数对大多数计算机来说都太多.但是,任意大的高斯滤波器都能通过重复使用小高斯滤波器来实现.高斯滤波器的二项式逼近的σ可用高斯函数拟合二项式系数的最小方差来计算.

  设计高斯滤波器的另一途径是直接从离散高斯分布中计算模板权值。为了计算方便,一般希望滤波器权值是整数。在模板的一个角点处取一个值,并选择一个K使该角点处值为1。通过这个系数可以使滤波器整数化,由于整数化后的模板权值之和不等于1,为了保证图像的均匀灰度区域不受影响,必须对滤波模板进行权值规范化。

 

  高斯滤波器的采样值或者高斯滤波器的二项式展开系数可以形成离散高斯滤波器.当用离散高斯滤波器进行卷积时,其结果是一个更大的高斯离散滤波器.若一幅图像用N*N离散高斯滤波器进行平滑,接着再用M*M离散高斯滤波器平滑的话,那么平滑结果就和用(N+M-1)*(N+M-1)离散高斯滤波器平滑的结果一样.换言之,在杨辉三角形中用第N行和第M行卷积形成了第N+M-1行.

 

 以下对高斯卷积核的矩阵算法进行验证。(转自http://blog.sina.com.cn/s/blog_640577ed0100yz8v.html

  1)在matlab中用以下代码可以产生一个3×3的核。

                                      filter=fspecial('gaussian',3,1);

  所产生的核矩阵为:

                            filter =

                                      0.0751 0.1238 0.0751

                                      0.1238 0.2042 0.1238

                                      0.0751 0.1238 0.0751

  2)同样对于上述的公式,我们取k=1,Sigma=1,即可得到3×3的高斯卷积核如下:

    上文说到,我们进行加权滤波,权系数之和必须为1,上面所求出的高斯滤波核函数同样的必须进行归一化:

    由此可以证明该核函数计算方法的正确性。

OpenCv中cvSmooth函数的用法

  该函数原型为:

            void cvSmooth(const CvArr* src, CvArr* dst,

                        int smoothtype=CV_GAUSSIAN,

                        int param1=3, int param2=0,double param3=0, double param4=0 );

  该函数前三个参数很容易理解,至于后四个参数以下进行分析。

  1) 如果指定param1和param2,则代表核函数的行列,即为滤波窗口的宽度和高度;

  2) Param3:高斯卷积的Sigma值

  3) 如果用户希望采用非对称的高斯核,则引入param4,最后两个参数分别代表水平核以及垂直核维数;

  4) 如果param3没有给出,则有前两个参数param1和param2计算出Sigma。这里的根据是高斯分布的特点(如图所示,数值分布在(μ—3σ,μ+3σ)中的概率为0.9974),如果核矩阵更大,那么相应的Sigma也更大,相反,如果Sigma更大,那么核矩阵覆盖范围也更大。具体到OpenCv下,用如下公式进行计算(根据其源代码显示)。

    5)同样的根据这个公式可知,如果param1和param2为0(或者没有给出),那么滤波窗口的尺寸,则有后两个参数代表的Sigma来确定。

 

猜你喜欢

转载自blog.csdn.net/weixin_36583895/article/details/75346682