2016-02-28 58 views
0

我正在寫一段給定寬度,高度和西格瑪值的java代碼,它將返回一個二維高斯模板,然後我將能夠與另一圖像進行卷積。我的高斯2D模板沒有返回正確的值

這裏是高斯公式2D:

enter image description here

現在我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的模板:

enter image description here

什麼是錯在這裏的代碼?

回答

1

通常過濾器由中心向外

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

這會給你圍繞中心對稱的過濾器來計算。這本書說什麼和計算什麼是未知的。

+0

「通常過濾器是從中心計算出來的」,請您詳細說明一下嗎? – user15860

+0

如果檢查此鏈接:http://mathworld.wolfram.com/GaussianFunction.html,點(8),你的意思是使用類似的東西?從-4開始到4? – user15860

+0

確實(0,0)位於中心,達到的最高值 – gpasch