Esto fue algo que me confundió demasiado, y no fue hasta que tuve que hacer lo mismo que por un proyecto uni que entendí lo que eras se supone que tiene que ver con la fórmula!
Puede usar esta fórmula para generar un filtro LoG discreto. Si escribe un poco de código para implementar esa fórmula, puede generar un filtro para usar en la convolución de la imagen. Para generar, digamos una plantilla de 5x5, simplemente llame al código con xey que van de -2 a +2.
Esto generará los valores para usar en una plantilla LoG. Si representa los valores que esta produce debería ver el "sombrero mexicano" forma típica de este filtro, así:
LoG template http://homepages.inf.ed.ac.uk/rbf/HIPR2/figs/logcont.gif
Puede ajustar con precisión la plantilla cambiando lo amplio que es (el tamaño) y el valor de sigma (qué tan ancho es el pico). Cuanto más amplia y amplia sea la plantilla, menos afectado se verá el ruido porque funcionará en un área más amplia.
Una vez que tenga el filtro, puede aplicarlo a la imagen al convolucionar la plantilla con la imagen. Si no has hecho esto antes, mira estos tutoriales. java applet tutorialsmore mathsy.
Básicamente, en cada ubicación de píxel, "coloca" la plantilla de convolución centrada en ese píxel. Luego, multiplica los valores de píxel circundantes por el "píxel" correspondiente en la plantilla y suma el resultado. Este es entonces el nuevo valor de píxel en esa ubicación (por lo general, también debe normalizar (escalar) la salida para devolverla al rango de valores correcto).
El siguiente código proporciona una idea aproximada de cómo puede implementar esto. Por favor perdona cualquier error/error tipográfico, etc. ya que no ha sido probado.
Espero que esto ayude.
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;
}
}
}
El valor de sigma (σ) es constante o debemos tomarlo por nuestra cuenta? –