C++实现一维数组的高斯滤波(Gaussian Filter)
高斯滤波(Gaussian filter)实质上是一种信号的滤波器,其用途为信号的平滑处理。对一个数进行高斯滤波(模糊)可以理解成将该数取附近矩形窗口所有值的加权平均值,距离处理数越近的点权重越大,距离处理点越远的点权重越小。因此如果取的矩形窗口越大,那么对处理点的模糊效果越强烈。因为数值和图像都是连续的,越靠近待处理点的点关系越密切,越远离待处理点的点关系越疏远,直接使用简单平均是不合理的,用加权平均更合理,即距离越近的点权重越大,距离越远的点权重越小。之所以把这种滤波方式叫做高斯滤波,是因为权重值是由高斯函数决定。
一维高斯分布函数:
G
(
x
)
=
1
2
π
σ
e
−
x
2
2
σ
2
G(x)=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{x^2}{2\sigma^2}}
G(x)=2πσ1e−2σ2x2
C++完整代码为:
#include<iostream>
#include <iomanip>
#include<math.h>
using namespace std;
int main()
{
int i = 0, j = 0;
double temp = 0.0;
double data[] = {1, 2.2, 3, 4, 5.1, 6, 7, 8, 8.9, 10,
11, 12, 13.2, 14, 15, 16, 17.1, 17.9, 19, 20};
double data_temp[] = {1, 2.2, 3, 4, 5.1, 6, 7, 8, 8.9, 10,
11, 12, 13.2, 14, 15, 16, 17.1, 17.9, 19, 20};
int size = sizeof(data)/sizeof(data[0]);
int len = 3;
double sigma = 1;
// 计算高斯核
double* kernel = new double[len];
int halfSize = len / 2;
double sum = 0.0;
for (i = -halfSize; i <= halfSize; ++i)
{
double x = i;
double value = exp(-(x * x) / (2 * sigma * sigma)) / (sqrt(2 * PAI) * sigma);
kernel[i + halfSize] = value;
sum += value;
}
for(i=0; i<len; i++) // 归一化权重
kernel[i] /= sum;
// 滤波
// for (i=(len-1)/2; i<(size-(len-1)/2); i++)
for(i=0; i<size; ++i)
{
sum = 0.0;
for(j=-halfSize; j<=halfSize; ++j)
{
int idx = i+j;
if(idx >= 0 && idx < size)
sum += data_temp[idx] * kernel[j+halfSize];
}
data[i] = sum;
}
for(i=0; i<size; i++)
cout << data[i] << endl;
return 0;
}