To było coś, co mylić mnie też, i to nie było aż musiałem zrobić to samo co ty na projekt uni, że rozumiem, co pan ma to zrobić z formułą!
Możesz użyć tej formuły, aby wygenerować dyskretny filtr LoG. Jeśli napiszesz trochę kodu, aby zaimplementować tę formułę, możesz wtedy wygenerować filtr do użycia w splotach obrazu. Aby wygenerować, powiedzmy szablon 5x5, po prostu wywołaj kod z xiy od -2 do +2.
Spowoduje to wygenerowanie wartości do użycia w szablonie LoG. Jeśli wykres wartości tego produkuje powinieneś zobaczyć „Mexican Hat” kształt typowy dla tego filtra, tak jak poniżej:
LoG template http://homepages.inf.ed.ac.uk/rbf/HIPR2/figs/logcont.gif
można dostroić szablonu zmieniając jak szeroki jest (rozmiar) i wartość sigma (jak szeroki jest szczyt). Im szerszy i szerszy szablon, tym mniejszy wpływ hałasu będzie skutkować tym, że będzie działał na szerszym obszarze.
Po zastosowaniu filtra można zastosować go do obrazu, tworząc szablon z obrazem. Jeśli jeszcze tego nie zrobiłeś, sprawdź kilka tutoriali. java applet tutorialsmore mathsy.
Zasadniczo, w każdym miejscu w pikselach "umieszczasz" swój szablon splotu, wyśrodkowany na tym pikselu. Następnie mnożymy otaczające wartości pikseli przez odpowiedni "piksel" w szablonie i sumujemy wynik. Jest to wtedy nowa wartość pikseli w tej lokalizacji (zazwyczaj musisz również znormalizować (skalować) dane wyjściowe, aby przywrócić je do prawidłowego zakresu wartości).
Poniższy kod przedstawia przybliżony sposób implementacji tego. Proszę wybaczyć wszelkie błędy/literówki itp., Ponieważ nie zostało to przetestowane.
Mam nadzieję, że to pomoże.
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;
}
}
}
Wartość sigma (σ) jest stała lub musimy ją przyjąć samodzielnie? –