2010-03-31 7 views
5

J'ai des problèmes pour implémenter un noyau LoG. J'essaye d'implémenter 9x9 kernal avec theta = 1.4 comme montré dans ce lien http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm.Laplacien de Gaussian

Cependant, j'ai de la difficulté avec la formule elle-même. Si quelqu'un pouvait me dire comment calculer le centre, c'est-à-dire quelles valeurs x et y utiliser pour obtenir -40 dans le noyau 9x9 cela serait grandement apprécié.

+0

Vous ne pouvez pas timbre triple double timbre. – rook

+0

Pouvez-vous élaborer s'il vous plaît? – Don

+1

... x et y se réfèrent aux coordonnées d'un pixel. –

Répondre

2

Vous n'avez pas besoin de vous soucier de la formule - c'est juste utilisé pour générer les coefficients. Vous avez juste besoin d'appliquer ces coefficients 9x9 à votre image.

Exemple (code non testé!):

const int K = 9; 
const int K2 = K/2; 
const int NORM = 500; // constant for normalising filter gain 
const int coeffs[K][K] = { ... }; 
int in_image[M][N]; 
int out_image[M][N]; 

for (i = K2; i < M - K2; ++i) 
{ 
    for (j = K2; j < N - K2; ++j) 
    { 
     int term = 0; 
     for (di = -K2; di <= K2; ++di) 
     { 
      for (dj = -K2; dj <= K2; ++dj) 
      { 
       term += in_image[i + di][j + dj] * coeff[K2 + ii][K2 + jj]; 
      } 
     } 
     out_image = term/NORM; 
    } 
} 
+2

Ahhh. Mais je suis curieux cependant, et obsessionnel, comment le noyau 9x9 avec sigma = 1.4 a-t-il été généré en utilisant cette formule? Pour la vie de moi, je ne peux obtenir aucune de ces valeurs qui l'appliquent. – Don

+1

Le moyen le plus simple de le vérifier est de regarder le cas où y = 0 et de regarder les valeurs de x. Il semble y avoir un facteur d'échelle d'environ 483. Donc, si vous évaluez 483 * LoG (x, y) pour y = 0, x = -4 .. + 4 vous devriez trouver que vous obtenez les bonnes valeurs. (Je viens de vérifier cela en utilisant une feuille de calcul et il semble juste.) Si vous voulez aller plus loin, vous pouvez bien sûr évaluer le noyau pour y = -4 .. + 4, x = -4 .. + 4, mais je pars que comme un exercice pour le lecteur ... ;-) –

+1

Oui. Tu as raison. Je l'ai juste compris il y a 5 minutes. Le facteur d'échelle qui est. Ça dérangeait pas comme les autres. Merci beaucoup Paul, votre aide a été grandement appréciée. – Don

1

Récemment, j'ai mis le filtre à bois, la seule chose dont vous avez besoin est que la formule et sigma en tant que paramètre. Si vous avez besoin d'un masque de taille fixe, vous pouvez stocker les valeurs du masque de filtre dans la matrice et l'utiliser, ou recalculez-le à chaque fois et créez la matrice requise. La taille du filtre dépend de la valeur sigma, si plus de cette taille est utilisée - il ne fait pas de différence, car la partie restante qui est hors de la taille maximale est calculée en zéros en utilisant cette formule. Ainsi, par exemple vous avez obtenu une taille de filtre = 9X9 Ensuite, afin de calculer le filtre lui-même comme une matrice, vous devez exécuter la formule par ces valeurs:

int halfsize = size/2;  
for (int x = -halfsize; x < halfsize; ++x) 
    for (int y = -halfsize; y < halfsize; ++y) 
     mask[x][y] = LoGFunction(x, y); 

Quelque chose comme ça. Cela signifie également que la taille du filtre doit être une valeur impaire. J'espère que cela aide. Dans votre cas, size = 9 sigma = 1,4 x et les changements y par 4 à 4. en utilisant la formule au point (0, 0) (il est le centre du filtre) vous obtenez quelque chose près - Mais si vous mettez le sigma à 0.2986 vous obtiendrez la réponse nécessaire près de -40. Je ne comprends pas pourquoi il est écrit que la valeur sigma est égale à 1,4 ba mai je manque quelque chose .. -moi si je fait une erreur s'il vous plaît

Questions connexes