图像去噪极简教程(3)——高斯滤波

高斯滤波和均值滤波的原理一样,不过在均值滤波中像素点的权重都一样,而在高斯滤波中越靠近中心的像素点的权重越大,具体权重值由二维高斯公式生成的矩阵决定,矩阵的阶和扫描的窗口大小一致。

关于二维高斯公式这里不再赘述,不了解的可以看看这篇文章:高斯函数的详细分析。

这里就只给出一个二维高斯分布的产生函数了, 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;
}

你可能感兴趣的:(图像去噪)