Question

Je suis en train d'écrire une fonction qui retourne un filtre dimentionnelle gauss. la fonction a sigma comme paramètre. Le problème est que la fonction retourne le même tableau pour tous les sigmas.

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

Notez que matrice de support est calculé correctement mais le problème se pose lors de l'application exp.

Était-ce utile?

La solution

L'idée est que le filtre doit être suffisamment large pour représenter la fonction gaussienne. Le principe de base consiste à utiliser la taille de filtre d'au moins 6*sigma.

Étant donné que le soutien doit être centré autour de zéro, qui vous donne la gamme de -3*sigma à +3*sigma (pour être plus précis, il est -/+ round(6*sigma - 1)/2 pour tenir compte du zéro au milieu). Par conséquent:

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

Exemple : (toutes les conditions suivantes sont équivalentes)

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)

Autres conseils

Il n'y a rien de mal avec les résultats. Votre vecteur support est essentiellement,

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

Et si vous carrés chacun élément de soutien et multiplier par -1, -support.^2

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

divisant par 2*sigma^2 entraînera toujours le même vecteur,

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

ou

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

c'est pourquoi vous obtenez toujours la même réponse.

Vous devez vérifier votre algorithme pour faire un filtre gaussienne unidimensionnelle.

EDIT:

Votre code d'origine est très bien. sauf Je ne comprends pas pourquoi vous avez fait support avec -3*sigma:sigma:3*sigma - vous devez le changer à support = -3:3

Vous pouvez également utiliser:

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

EDIT: Consultez solution Amro pour le code complet et l'explication pourquoi support = -3*sigma:3*sigma et non support = -3*sigma:sigma:3*sigma

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top