2010-03-31 9 views
5

Sto riscontrando problemi nell'implementazione di un kernel LoG. Sto cercando di implementare 9x9 kernal con theta = 1.4 come mostrato in questo link http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm.Laplacian of Gaussian

Tuttavia, ho difficoltà con la formula stessa. Se qualcuno potesse dirmi come calcolare il centro, cioè quali valori x e y usare per ottenere -40 nel kernel 9x9, sarebbe molto apprezzato.

+0

Non è possibile tripla timbro un doppio timbro. – rook

+0

Potete elaborare per favore? – Don

+1

... x e y si riferiscono alle coordinate di un pixel. –

risposta

2

Non è necessario preoccuparsi della formula, che viene utilizzata solo per generare i coefficienti. Hai solo bisogno di applicare quei 9x9 coefficienti alla tua immagine.

Esempio (codice non testato!):

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. Ma sono curioso però, e ossessivo, come è stato generato il kernel 9x9 con sigma = 1.4 usando quella formula? Per la vita di me non riesco a ottenere nessuno di quei valori applicandolo. – Don

+1

Il modo più semplice per controllarlo è guardare il caso in cui y = 0 e osservare i valori per x. Sembra esserci un fattore di scala di circa 483. Quindi se si valuta 483 * LoG (x, y) per y = 0, x = -4 .. + 4 si dovrebbe trovare di ottenere i valori corretti. (Ho appena controllato questo usando un foglio di calcolo e sembra giusto.) Se vuoi andare oltre puoi ovviamente valutare il kernel per y = -4 .. + 4, x = -4 .. + 4, ma lascio che come esercizio per il lettore ... ;-) –

+1

Sì. Hai ragione. L'ho capito solo 5 minuti fa. Il fattore di scala che è. Era fastidioso come nessun altro. Grazie mille Paolo, il tuo aiuto è stato molto apprezzato. – Don

1

Recentemente ho implementato il filtro di registro, l'unica cosa che serve è quella formula e sigma come parametro. Se è necessaria una maschera di dimensioni fisse, è possibile memorizzare i valori della maschera di filtro nella matrice e utilizzarla, o ricalcolarla ogni volta e creare la matrice necessaria. La dimensione del filtro dipende dal valore sigma, se viene utilizzato più di quella dimensione - non rende un senso, poiché la parte restante che è fuori da una dimensione massima viene calcolata su zeri usando quella formula. Così, per esempio, si ha una dimensione del filtro = 9X9 Poi al fine di calcolare il filtro stesso come una matrice, è necessario eseguire la formula attraverso questi valori:

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

Qualcosa del genere. Significa anche che la dimensione del filtro deve essere un valore dispari. Spero che questo aiuti. Nel tuo caso, size = 9 sigma = 1.4 x e cambiamenti y attraverso -4 a 4. usando la formula al punto (0, 0) (è il centro del filtro) si ottiene qualcosa di vicino - 12

Ma se si inserisce il sigma a 0,2986 Otterrete la risposta necessaria vicino a -40. anche io non capisco perché è scritto che il valore sigma è pari a 1,4 maggio ba mi manca qualcosa .. mi corregga se ho commesso un errore si prega di