简单易懂的高斯滤波

冒泡...十一月中旬啦...周末愉快呐!

高斯滤波

先引入两个问题。
1.图像为什么要滤波?
答:a.消除图像在数字化过程中产生或者混入的噪声。
b.提取图片对象的特征作为图像识别的特征模式。
2.滤波器该如何去理解?
答:滤波器可以想象成一个包含加权系数的窗口或者说一个镜片,当使用滤波器去平滑处理图像的时候,就是把通过这个窗口或者镜片去看这个图像。

滤波器分为很多种,有方框滤波、均值滤波、高斯滤波等。
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声。
所以在讲高斯滤波之前,先解释一下什么是高斯噪声?

高斯噪声

首先,噪声在图像当中常表现为一引起较强视觉效果的孤立像素点或像素块。简单来说,噪声的出现会给图像带来干扰,让图像变得不清楚。
高斯噪声就是它的概率密度函数服从高斯分布(即正态分布)的一类噪声。如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。高斯白噪声的二阶矩不相关,一阶矩为常数,是指先后信号在时间上的相关性。

高斯滤波器是根据高斯函数的形状来选择权值的线性平滑滤波器
所以接下来再讲解一下高斯函数和高斯核。

高斯函数


注:σ的大小决定了高斯函数的宽度。

高斯核

理论上,高斯分布在所有定义域上都有非负值,这就需要一个无限大的卷积核。实际上,仅需要取均值周围3倍标准差内的值,以外部份直接去掉即可。
高斯滤波的重要两步就是先找到高斯模板然后再进行卷积,模板(mask在查阅中有的地方也称作掩膜或者是高斯核)。所以这个时候需要知道它怎么来?又怎么用?
举个栗子:
假定中心点的坐标是(0,0),那么取距离它最近的8个点坐标,为了计算,需要设定σ的值。假定σ=1.5,则模糊半径为1的高斯模板就算如下


这个时候我们我们还要确保这九个点加起来为1(这个是高斯模板的特性),这9个点的权重总和等于0.4787147,因此上面9个值还要分别除以0.4787147,得到最终的高斯模板。

高斯滤波计算

有了高斯模板,那么高斯滤波的计算便顺风顺水了。
举个栗子:
假设现有9个像素点,灰度值(0-255)的高斯滤波计算如下:


参考来源:(https://blog.csdn.net/nima1994/article/details/79776802)

将这9个值加起来,就是中心点的高斯滤波的值。
对所有点重复这个过程,就得到了高斯模糊后的图像。

高斯滤波步骤

综上可以总结一下步骤:

(1)移动相关核的中心元素,使它位于输入图像待处理像素的正上方
(2)将输入图像的像素值作为权重,乘以相关核
(3)将上面各步得到的结果相加做为输出
简单来说就是根据高斯分布得到高斯模板然后做卷积相加的一个过程。

代码实现:

#高斯函数
void GaussianBlur(InputArray src,      //输入图像
            OutputArray dst,    //输出图像
            Size ksize,       //内核的大小
            double sigmaX,     //高斯核函数在X方向的标准偏差  
            double sigmaY=0,    //高斯核函数在Y方向的标准偏差
            intborderType=BORDER_DEFAULT )   
#include <opencv2/opencv.hpp>
using namespace cv; 
int main(int argc,char** argv) {
    //载入原图
    Mat image = imread("Gaussian.jpg");
    //创建窗口
    namedWindow("高斯滤波【原图】");
    namedWindow("高斯滤波【效果图】");
    //进行滤波操作
    Mat out;
    GaussianBlur(image,out,Size(3,3),0,0);
    //显示
    imshow("高斯滤波【原图】", image);
    imshow("高斯滤波【效果图】", out);
    waitKey();
    return(0);
}

参考资料:(https://www.cnblogs.com/qiqibaby/p/5289977.html
(https://blog.csdn.net/guoyunfei123/article/details/81660639)

Ending~水逆来了诶 就希望顺顺利利挺过去吧!干巴爹!