opencv高斯滤波原理

一.高斯滤波原理

1、一维高斯分布:
在这里插入图片描述
2、二维高斯分布:
在这里插入图片描述
3、高斯滤波一般使用的*二维零均值*的高斯分布函数,通过高斯分布函数求出模板系数,例如一个3*3的模板:以模板的中心位置为坐标原点进行取样,其中模板各个坐标位置如下图,x轴水平向右,y轴垂直向下,(x,y)表示
opencv高斯滤波原理_第1张图片
4、将各个位置的坐标代入二维零均值高斯分布函数,计算出来的模板有两种形式:
整数模板和小数模板,可以使用二维数组来存放计算出的模板系数

①小数模板:
opencv高斯滤波原理_第2张图片
②整数模板:
opencv高斯滤波原理_第3张图片
5.标准差sigma对效果的影响:
sigma越小,高斯分布图越高、窄,模板中心系数就越大,平滑效果就会差,相当于中心点进行点运算;
sigma越大,高斯分布图越扁,宽,模板中心系数和周围系数越接近,会逐渐近似于均值模糊,平滑效果好。
6.生成模板系数代码:

void GaussianBlur_demo(int ksize, double sigmaX, double sigmaY)
{
	double window[][10] = {0};模板各系数可存储在二维数组window里面
    int center = ksize / 2;     //找到模板中心,模板中心坐标为(0,0)
    for(int i = 0; i < ksize; i++)      //求模板各系数,正态分布均值为0
    {
        double x = pow(i - center, 2);		//坐标从(-1,-1)开始计算
        for(int j = 0; j < ksize; j++)
        {
            double y = pow(j - center, 2);
            double m1 = exp(-(x / (2 * sigmaX * sigmaX)));
            double m2 = exp(-(y / (2 * sigmaY * sigmaY)));
            double m = m1 * m2;
            m /= (2 * pi * sigmaX * sigmaY);
            //sum += m;
            window[i][j] = m;
        }
    }
    //整数模板需要归一化,将模板第一个系数换算为1;小数模板不需要归一化
    double k = 1 / window[0][0];    //对左上角系数归一化处理
    double summm = 0;
    cout << endl;
    for(int i = 0; i < ksize; i++)
    {
        for(int j = 0; j < ksize; j++)
        {
            //window[i][j] /= sum;						//小数模板的计算方法
            window[i][j] *= k;
            window[i][j] = floor(window[i][j]);     //模板系数取整数
            summm += window[i][j];				  //用来存放所以系数之和
        }
    }

二、高斯滤波API

void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                double sigmaX, double sigmaY = 0,
                                int borderType = BORDER_DEFAULT );

参数src:可以有任意通道,深度为CV_8U, CV_16U, CV_16S, CV_32F or CV_64F。
参数dst:和原图一样的大小和类型。
参数ksize:宽,高可以不一样,但必须是正、奇数,当为0时由sigma计算出。
参数sigmaX:X方向的标准差
参数sigmaY:Y方向的标准差,如果为0,则将其设置为和sigmaX相等,如果sigmaX,sigmaY均为0,则大小由ksize计算出

参考链接:https://www.cnblogs.com/wangguchangqing/p/6407717.html

你可能感兴趣的:(opencv高斯滤波原理)