c - 尝试在 C 中实现高斯滤波器

标签 c gaussian

我正在尝试在 C 中实现高斯滤波器。我的输出布局总是出错,我尝试在我的 for 循环中使用行和列,但没有成功。输出布局应如下所示:

0.0161464   0.0294206   0.0359344   0.0294206   0.0161464   
0.0294206   0.0536078   0.0654768   0.0536078   0.0294206   
0.0359344   0.0654768   0.0799735   0.0654768   0.0359344   
0.0294206   0.0536078   0.0654768   0.0536078   0.0294206   
0.0161464   0.0294206   0.0359344   0.0294206   0.0161464 

(这只是高斯滤波器布局的一个示例)。

这是我在程序中得到的输出布局:

0.114986 0.101475 0.069743 0.037331 0.015562
0.101475 0.089551 0.061548 0.032944 0.013733
0.069743 0.061548 0.042301 0.022642 0.009439
0.037331 0.032944 0.022642 0.012119 0.005052 
0.015562 0.013733 0.009439 0.005052 0.002106

这是我的程序的代码段:

for (i = 0; i < smooth_kernel_size; i++) {
    for (j = -0; j < smooth_kernel_size; j++) {
        gauss[i][j] = K * exp(((pow((i), 2) + pow((j), 2)) / ((2 * pow(sigma, 2)))) * (-1));
        sum += gauss[i][j]; 
    }
}
for (i = 0; i < smooth_kernel_size; i++) {
    for (j = 0; j < smooth_kernel_size; j++) {
        gauss[i][j] /= sum;
    }
}
for (i = 0; i < smooth_kernel_size; i++) {
    for (j = 0; j < smooth_kernel_size; j++) {
        printf("%f ", gauss[i][j]);
    }
    printf("\n");
}

将不胜感激任何建议!

最佳答案

您的计算不正确:过滤器应以原点为中心。这是更正后的版本:

#include <math.h>
#include <stdio.h>

#define smooth_kernel_size 5
#define sigma 1.0
#define K  1

int main() {
    double gauss[smooth_kernel_size][smooth_kernel_size];
    double sum = 0;
    int i, j;

    for (i = 0; i < smooth_kernel_size; i++) {
        for (j = 0; j < smooth_kernel_size; j++) {
            double x = i - (smooth_kernel_size - 1) / 2.0;
            double y = j - (smooth_kernel_size - 1) / 2.0;
            gauss[i][j] = K * exp(((pow(x, 2) + pow(y, 2)) / ((2 * pow(sigma, 2)))) * (-1));
            sum += gauss[i][j];
        }
    }
    for (i = 0; i < smooth_kernel_size; i++) {
        for (j = 0; j < smooth_kernel_size; j++) {
            gauss[i][j] /= sum;
        }
    }
    for (i = 0; i < smooth_kernel_size; i++) {
        for (j = 0; j < smooth_kernel_size; j++) {
            printf("%f ", gauss[i][j]);
        }
        printf("\n");
    }
    return 0;
}

输出:

0.002969 0.013306 0.021938 0.013306 0.002969
0.013306 0.059634 0.098320 0.059634 0.013306
0.021938 0.098320 0.162103 0.098320 0.021938
0.013306 0.059634 0.098320 0.059634 0.013306
0.002969 0.013306 0.021938 0.013306 0.002969

另请注意,主表达式可以简化:

    gauss[i][j] = K * exp(-(x * x + y * y) / (2 * sigma * sigma));

关于c - 尝试在 C 中实现高斯滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54614167/

相关文章:

c - 如何修复 'request for member in something not a structure or union'错误?

matlab - Matlab中不同的高斯函数有什么区别?

大量高斯混合模型的MATLAB代码

c++ - 使用 MPI 进行并行编程以使用动态二维数组进行矩阵乘法时如何解决问题?

c - 检查字节中是否设置了第 n 位的函数

html - 在渲染到 Canvas 上之前模糊图像

python - NaiveBayes 分类器在 python 中处理不同的数据类型

c - C中哈希表插入函数的问题

c - 如何在Linux环境下使用C chdir