Это было что-то, что меня смутило тоже, и это не было, пока я не должен был сделать то же самое, как вы для проекта универ, что я понял, что ты Предполагалось сделать с формулой!
Вы можете использовать эту формулу для , генерируя дискретный фильтр LoG. Если вы пишете немного кода для реализации этой формулы, вы можете затем создать фильтр для использования в свертке изображений. Чтобы создать, скажем, шаблон 5x5, просто вызовите код с x и y в диапазоне от -2 до +2.
Это будет генерировать значения, используемые в шаблоне LoG. Если график значения этого производит вы должны увидеть «мексиканская шляпа» форму, характерную для этого фильтра, например так:
LoG template http://homepages.inf.ed.ac.uk/rbf/HIPR2/figs/logcont.gif
Вы можете настроить шаблон, изменяя, насколько широко она (размер) и значение сигмы (насколько широкий пик). Чем шире и шире шаблон, тем меньше влияние шума будет результатом, потому что он будет работать на более широкой территории.
Как только у вас есть фильтр, вы можете применить его к изображению, свернув шаблон с изображением. Если вы этого еще не сделали, ознакомьтесь с этими несколькими учебниками. java applet tutorialsmore mathsy.
По существу, в каждом месте пикселя вы «размещаете» свой шаблон свертки, центрированный на этом пикселе. Затем вы умножаете значения окружающего пикселя на соответствующий «пиксель» в шаблоне и добавляете результат. Это то новое значение пикселя в этом месте (как правило, вам также необходимо нормализовать (масштабировать) выход, чтобы вернуть его в правильный диапазон значений).
В приведенном ниже коде представлено приблизительное представление о том, как вы можете это реализовать. Пожалуйста, простите любые ошибки/опечатки и т. Д., Поскольку он не был протестирован.
Надеюсь, это поможет.
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;
}
}
}
Значение sigma (σ) постоянное, или мы должны взять его по собственному усмотрению? –