我的 Gaussian 2D 模板没有返回正确的值

My Gaussian 2D template is not returning the correct values

我正在编写一段 java 代码,给定宽度、高度和 sigma 值将 return 一个 2D 高斯模板,然后我将能够与另一个图像进行卷积。

这是二维高斯方程:

现在我只是简单地把它变成这样的东西。我们可以将其分为两部分,Pi 和 E。

所以在我的代码中我有这个:

piProduct = Math.pow(2 * Math.PI * Math.pow(sigma,2), -1);

对于 E 部分,我再次分成两部分(基数和指数):

eulerNumberProductExponent = (Math.pow(x,2) + Math.pow(y,2)) / (2 * Math.pow(sigma,2));

和基数(带指数):

eulerNumberProduct = Math.pow(Math.E, -1*eulerNumberProductExponent);

现在我要做的就是将Pi部分乘以E部分:

coefficient = piProduct * eulerNumberProduct;

完整代码如下:

public double[][] getGaussianTemplate(int width, int height, double sigma){
    double[][] gaussianTemplate = new double [height][width];
    double coefficient;
    double piProduct;
    double eulerNumberProductExponent;
    double eulerNumberProduct;

    piProduct = Math.pow(2 * Math.PI * Math.pow(sigma,2), -1);
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {
            eulerNumberProductExponent = (Math.pow(x,2) + Math.pow(y,2)) / (2 * Math.pow(sigma,2));
            eulerNumberProduct = Math.pow(Math.E, -1*eulerNumberProductExponent);
            coefficient = piProduct * eulerNumberProduct;

            gaussianTemplate[y][x] = coefficient;
            System.out.println("At x: "+x+" and y: "+y+" the coefficient is: "+coefficient);
        }
    }

    printTemplate(gaussianTemplate,width,height);

    return gaussianTemplate;
}

现在这就是我得到的 sigma = 0.1:

 | 15.915494 | 0.000000 | 0.000000 | 0.000000 | 0.000000
 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000
 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000
 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000
 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000

printTemplate(gaussianTemplate,width,height); 打印的内容。

根据我关注的 sigma 为 0.1 的 5x5 模板的书,我应该得到这个:

这里的代码有什么问题?

通常过滤器是从中心向外计算的

for (int x = -width/2; x <= width/2; x++) {
    for (int y = -height/2; y <= height/2; y++) {
        eulerNumberProductExponent = (Math.pow(x,2) + Math.pow(y,2)) / (2 * Math.pow(sigma,2));
        eulerNumberProduct = Math.pow(Math.E, -1*eulerNumberProductExponent);
        coefficient = piProduct * eulerNumberProduct;
//            gaussianTemplate[y][x] = coefficient;
        System.out.println("At x: "+x+" and y: "+y+" the coefficient is: "+coefficient);
    }
}

这将为您提供围绕中心的对称过滤器。书上是怎么说的,是怎么计算的,不得而知。