我的 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);
}
}
这将为您提供围绕中心的对称过滤器。书上是怎么说的,是怎么计算的,不得而知。
我正在编写一段 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);
}
}
这将为您提供围绕中心的对称过滤器。书上是怎么说的,是怎么计算的,不得而知。