0
我正在寫一段給定寬度,高度和西格瑪值的java代碼,它將返回一個二維高斯模板,然後我將能夠與另一圖像進行卷積。我的高斯2D模板沒有返回正確的值
這裏是高斯公式2D:
現在我simplyfying這是這樣的。我們可以在2個部分,一個與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);
現在我需要做的就是乘以丕p藝術與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;
}
,現在這是我得到的差= 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);
打印。
按照書上的,我用的0.1西格瑪我應該得到這個以下爲5x5的模板:
什麼是錯在這裏的代碼?
「通常過濾器是從中心計算出來的」,請您詳細說明一下嗎? – user15860
如果檢查此鏈接:http://mathworld.wolfram.com/GaussianFunction.html,點(8),你的意思是使用類似的東西?從-4開始到4? – user15860
確實(0,0)位於中心,達到的最高值 – gpasch