une fonction de convolution de Gauss dimensionnelle dans Matlab
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.
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