高斯濾波和均值濾波的原理一樣,在均值濾波中所有的像素點的權重都一樣,而在高斯濾波中則是越靠近中心的像素點權重遠大,權重的分配由二維高斯公式生成的矩陣決定,矩陣的階和掃描的窗口大小一致。
關於二維高斯公式這裏不再贅述,不瞭解的可以看看這篇文章:高斯函數的詳細分析,這裏就只給出一個二維高斯分佈的產生函數了:
//生成高斯核
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;
}