高斯滤波和均值滤波的原理一样,不过在均值滤波中像素点的权重都一样,而在高斯滤波中越靠近中心的像素点的权重越大,具体权重值由二维高斯公式生成的矩阵决定,矩阵的阶和扫描的窗口大小一致。
关于二维高斯公式这里不再赘述,不了解的可以看看这篇文章:高斯函数的详细分析。
这里就只给出一个二维高斯分布的产生函数了, size是矩阵的阶,sigma是高斯函数的方差,一般来说图片的噪声越大,sigma也就越大,在去噪效果不理想时可以尝试调整sigma的值。
//生成高斯核
double* make_kernel(int size, double sigma) {
if (size % 2 == 0) {
cout << "size必须为奇数" << endl;
return NULL;
}
double* kernel = new double[size * size];
double d_sigma_2 = 2 * sigma * sigma;
double c = 1 / (3.141592654 * d_sigma_2);
double sum = 0;
for (int i = 0; i < size; i++) {
for (int k = 0; k < size; k++) {
double x = i - int(size / 2);
double y = k - int(size / 2);
kernel[i*size+k] = exp(-(x * x + y * y) / d_sigma_2) * c;
sum += kernel[i*size + k];
}
}
for (int i = 0; i < size*size; i++) {
kernel[i] = kernel[i] / sum;
}
return kernel;
}