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

时间:2016-02-28 16:26:30

标签: java image-processing gaussian

我正在编写一段java代码,给出宽度,高度和西格玛值将返回一个2D高斯模板,然后我将能够与另一个图像进行卷积。

这是高斯二维方程:

enter image description here

现在,我正在简单地将此类似于此。我们可以将它分成两部分,一部分是Pi和E。

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

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

对于E部分,我再分为2部分(基数和指数):

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);打印的内容。

根据我正在关注的5x5模板,西格玛为0.1,我应该得到这个:

enter image description here

这里的代码有什么问题?

1 个答案:

答案 0 :(得分:0)

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

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);
    }
}

这将为您提供围绕中心的对称过滤器。这本书的内容以及计算的内容都是未知的。