Это меня тоже смутило, и только когда мне пришлось сделать то же самое, что и вы для универ-проекта, я понял, что вы должны делать с формулой!
Вы можете использовать эту формулу для генерации дискретного фильтра LoG. Если вы напишете немного кода для реализации этой формулы, вы сможете создать фильтр для использования в свертке изображений. Для генерации, скажем, шаблона 5x5, просто вызовите код с x и y в диапазоне от -2 до +2.
Это сгенерирует значения для использования в шаблоне LoG. Если вы отобразите полученные значения, вы должны увидеть форму «Мексиканская шляпа», типичную для этого фильтра, например:
Шаблон LoG http://homepages.inf.ed.ac.uk/rbf/HIPR2/figs/logcont.gif
Вы можете точно настроить шаблон, изменив его ширину (размер) и значение сигмы (насколько широк пик). Чем шире и шире шаблон, тем меньше будет шума, потому что он будет работать в более широкой области.
Если у вас есть фильтр, вы можете применить его к изображению, свернув шаблон с изображением. Если вы еще этого не сделали, ознакомьтесь с этими несколькими уроками.
учебники по Java-апплетам больше математики .
По сути, в каждом месте расположения пикселя вы «размещаете» свой шаблон свертки с центром в этом пикселе. Затем вы умножаете значения окружающих пикселей на соответствующий «пиксель» в шаблоне и суммируете результат. Тогда это новое значение пикселя в этом месте (обычно вам также нужно нормализовать (масштабировать) вывод, чтобы вернуть его в правильный диапазон значений).
Код ниже дает приблизительное представление о том, как вы могли бы реализовать это. Пожалуйста, прости любые ошибки / опечатки и т. Д., Поскольку это не было проверено.
Надеюсь, это поможет.
private float LoG(float x, float y, float sigma)
{
// implement formula here
return (1 / (Math.PI * sigma*sigma*sigma*sigma)) * //etc etc - also, can't remember the code for "to the power of" off hand
}
private void GenerateTemplate(int templateSize, float sigma)
{
// Make sure it's an odd number for convenience
if(templateSize % 2 == 1)
{
// Create the data array
float[][] template = new float[templateSize][templatesize];
// Work out the "min and max" values. Log is centered around 0, 0
// so, for a size 5 template (say) we want to get the values from
// -2 to +2, ie: -2, -1, 0, +1, +2 and feed those into the formula.
int min = Math.Ceil(-templateSize / 2) - 1;
int max = Math.Floor(templateSize / 2) + 1;
// We also need a count to index into the data array...
int xCount = 0;
int yCount = 0;
for(int x = min; x <= max; ++x)
{
for(int y = min; y <= max; ++y)
{
// Get the LoG value for this (x,y) pair
template[xCount][yCount] = LoG(x, y, sigma);
++yCount;
}
++xCount;
}
}
}