2009-12-02 12 views
7

Sto provando a scrivere una funzione che restituisce un unico filtro di gauss. la funzione ha assunto sigma come parametro. Il problema è che la funzione restituisce lo stesso array per tutti i sigma.una funzione di convoluzione gauss dimensionale in Matlab

function gaussFilter=gauss(sigma) 
    width = 3 * sigma; 
    support = (-width :sigma: width); 
    gaussFilter= exp(- (support).^2/(2*sigma^2)); 
    gaussFilter = gaussFilter/ sum(gaussFilter); 

Nota tale matrice sostegno è calcolato correttamente ma il problema si pone quando si applica l'exp.

+0

cosa succede quando si esegue il 'exp' con uno scalare? –

+1

Restituisce e^scalare. – Jacob

risposta

4

L'idea è che il filtro deve essere sufficientemente ampia per rappresentano la funzione gaussiana. La regola generale è quella di utilizzare la dimensione del filtro di almeno 6*sigma.

Dal momento che il supporto deve essere centrato intorno allo zero, che darebbe la gamma di -3*sigma a +3*sigma (per essere più precisi, è -/+ round(6*sigma - 1)/2 per spiegare lo zero al centro). Quindi:

function gaussFilter = gauss(sigma) 
    width = round((6*sigma - 1)/2); 
    support = (-width:width); 
    gaussFilter = exp(-(support).^2 ./ (2*sigma^2)); 
    gaussFilter = gaussFilter/ sum(gaussFilter); 

Esempio: (tutti i seguenti sono equivalenti)

sigma = 1.2; 
width = round((6*sigma - 1)/2); 

gauss(sigma) 

normpdf(-width:width, 0, sigma) 

fspecial('gaussian', [1 2*width+1], sigma) 

h = gausswin(2*width+1)'; 
h = h/sum(h) 
+0

+1 indietro (in realtà ho fatto +1 su questo molto tempo fa!) Molto bello se non si dispone di Image Processing Toolbox. – rayryeng

4

Non c'è niente di sbagliato nei risultati. Il tuo support vettore è essenzialmente,

[-3*sigma -2*sigma -1*sigma 0 1*sigma 2*sigma 3*sigma] 

E se si piazza ogni elemento di sostegno e di moltiplicare per -1, -support.^2

[-9*sigma^2 -4*sigma^2 -1*sigma^2 0 -1*sigma^2 -4*sigma^2 -9*sigma^2] 

Così dividendolo per 2*sigma^2 sarà sempre come risultato lo stesso vettore,

[-9/2 -4/2 -1/2 0 -1/2 -4/2 -9/2] 

O

-4.5000 -2.0000 -0.5000   0 -0.5000 -2.0000 -4.5000 

Quindi è per questo che si ottiene sempre la stessa risposta.

Quindi è necessario controllare l'algoritmo per creare un filtro gaussiano unidimensionale.

EDIT:

tuo codice originale va bene: tranne Non capisco il motivo per cui hai fatto support con -3*sigma:sigma:3*sigma - si dovrebbe cambiare a support = -3:3.

È anche possibile utilizzare:

gaussFilter = fspecial('gaussian',[1 7],sigma) 

EDIT: Partenza Amro's solution per il codice completo e la spiegazione perché support = -3*sigma:3*sigma e non support = -3*sigma:sigma:3*sigma

+0

Grazie mille, ma non voglio fare domanda per il ciclo. Vorrei invece usare un vettore (supporto). Per favore, potresti dirmi come farlo. – Hani

+0

Quello che hai scritto è corretto per sigma = 1, ma 3 * sigma: sigma: 3 * sigma mi darà sei elementi con sigma tra ogni due.grazie per il consiglio speciale, ma non voglio usarne uno incorporato. Ma anche con il supporto = -3: 3 i risultati saranno gli stessi, no? – Hani

+0

I risultati cambieranno rispetto a sigma. 'support' dovrebbe essere indipendente da' sigma', dovrebbe dipendere solo dalla dimensione della finestra, che nel tuo caso sembra essere un vettore 1x7. – Jacob

Problemi correlati