2009-12-02 14 views
7

Estoy tratando de escribir una función que devuelva un filtro de Gauss unidimensional. la función tomó sigma como parámetro. El problema es que la función devuelve la misma matriz para todos los sigmas.una función de convolución gauss Dimensional en Matlab

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

Nota esa matriz de soporte se calcula correctamente pero el problema surge cuando se aplica el exp.

+0

lo que sucede cuando se ejecuta el 'exp' con un escalar? –

+1

Devuelve e^escalar. – Jacob

Respuesta

4

La idea es que el filtro debe ser lo suficientemente amplia como para representar la función gaussiana La regla de oro es usar un tamaño de filtro de al menos 6*sigma.

Dado que el apoyo debe estar centrado en torno a cero, que le daría el rango de -3*sigma a +3*sigma (para ser más exactos, es -/+ round(6*sigma - 1)/2 para dar cuenta del cero en el centro). Por lo tanto:

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

Ejemplo: (todos los siguientes son equivalentes)

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 atrás (en realidad hice +1'de esto hace mucho tiempo!) Muy bien si no tienes la Caja de herramientas de procesamiento de imágenes. – rayryeng

4

No hay nada de malo en los resultados. Su support vector es esencialmente,

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

Y si se eleva al cuadrado cada elemento de apoyo y multiplicar por -1, -support.^2

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

Así dividiéndolo por 2*sigma^2 siempre resultará en el mismo vector,

[-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 

Así que es por eso que siempre obtienes la misma respuesta.

Así que debe verificar su algoritmo para hacer un filtro gaussiano unidimensional.

EDIT:

Su código original está bien: excepto No entiendo por qué usted ha hecho support con -3*sigma:sigma:3*sigma - se debe cambiar a support = -3:3.

También puede utilizar:

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

EDIT: Salida Amro's solution para el código completo y explicación de por qué support = -3*sigma:3*sigma y no support = -3*sigma:sigma:3*sigma

+0

Muchas gracias, pero no quiero solicitar el bucle. Me gustaría utilizar un vector (soporte) en su lugar. Por favor, podría decirme cómo hacerlo. – Hani

+0

Lo que escribió es correcto para sigma = 1, pero 3 * sigma: sigma: 3 * sigma me dará seis elementos con sigma entre cada dos.Gracias por su asesoramiento especial, pero no quiero usar uno integrado. Pero incluso con soporte = -3: 3, los resultados serán los mismos, ¿no? – Hani

+0

Los resultados cambiarán con respecto a sigma. 'support' debe ser independiente de' sigma', solo debe depender del tamaño de la ventana, que en su caso parece ser un vector de 1x7. – Jacob