Я пишу кусок кода Java, который дал значение ширины, высоты и сигмы, вернет 2D-шаблон Гаусса, который я смогу свернуться с другим изображением.Мой шаблон Gaussian 2D не возвращает правильные значения
Здесь уравнение Gaussian 2D:
Теперь я 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 я должен получить это:
Что плохого в коде здесь?
«Обычно фильтры рассчитываются от центра», не могли бы вы уточнить? – user15860
Если вы посмотрите эту ссылку: http://mathworld.wolfram.com/GaussianFunction.html, point (8), вы имеете в виду использование чего-то подобного подобного? Начинается с -4 до 4? – user15860
Да действительно (0, 0) находится в центре, самое высокое значение, достигнутое там – gpasch