2016-02-28 7 views
0

Я пишу кусок кода Java, который дал значение ширины, высоты и сигмы, вернет 2D-шаблон Гаусса, который я смогу свернуться с другим изображением.Мой шаблон Gaussian 2D не возвращает правильные значения

Здесь уравнение Gaussian 2D:

enter image description here

Теперь я simplyfying это что-то вроде этого. Мы можем разделить это на 2 части, один с Pi и Е.

Так что в моем коде у меня есть это:

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

И Е части я снова разделить на 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; 
} 

Теперь это то, что я получаю для сигма = 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); печатает ,

Согласно книге я следующий для шаблона 5х5 с сигма 0,1 я должен получить это:

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, point (8), вы имеете в виду использование чего-то подобного подобного? Начинается с -4 до 4? – user15860

+0

Да действительно (0, 0) находится в центре, самое высокое значение, достигнутое там – gpasch

 Смежные вопросы

  • Нет связанных вопросов^_^