Je souhaite appliquer un filtre gaussien de dimension 5x5 pixels sur une image de 512x512 pixels. J'ai trouvé une fonction scipy pour le faire:
scipy.ndimage.filters.gaussian_filter(input, sigma, truncate=3.0)
Comment choisir le paramètre de sigma pour m'assurer que ma fenêtre gaussienne fait 5x5 pixels?
Découvrez le code source ici: https://github.com/scipy/scipy/blob/master/scipy/ndimage/filters.py
Vous verrez que gaussian_filter
appels gaussian_filter1d
pour chaque axe. Dans gaussian_filter1d
, la largeur du filtre est déterminée implicitement par les valeurs de sigma
et truncate
. En effet, la largeur w
est
w = 2*int(truncate*sigma + 0.5) + 1
Alors
(w - 1)/2 = int(truncate*sigma + 0.5)
Pour w = 5, le côté gauche est 2. Le côté droit est 2 si
2 <= truncate*sigma + 0.5 < 3
ou
1.5 <= truncate*sigma < 2.5
Si tu choisis truncate = 3
(en remplaçant la valeur par défaut de 4), vous obtenez
0.5 <= sigma < 0.83333...
Nous pouvons vérifier cela en filtrant une entrée qui est tout 0 à l'exception d'un seul 1 (c'est-à-dire trouver la réponse impulsionnelle du filtre) et en comptant le nombre de valeurs non nulles dans la sortie filtrée. (Dans ce qui suit, np
est numpy
.)
Créez d'abord une entrée avec un seul 1:
In [248]: x = np.zeros(9)
In [249]: x[4] = 1
Vérifiez le changement de taille à sigma = 0.5
...
In [250]: np.count_nonzero(gaussian_filter1d(x, 0.49, truncate=3))
Out[250]: 3
In [251]: np.count_nonzero(gaussian_filter1d(x, 0.5, truncate=3))
Out[251]: 5
... et à sigma = 0.8333...
:
In [252]: np.count_nonzero(gaussian_filter1d(x, 0.8333, truncate=3))
Out[252]: 5
In [253]: np.count_nonzero(gaussian_filter1d(x, 0.8334, truncate=3))
Out[253]: 7
s = 2
w = 5
t = (((w - 1)/2)-0.5)/s
filtered_data = scipy.ndimage.filters.gaussian_filter(data, sigma=s, truncate=t)