web-dev-qa-db-fra.com

Filtre gaussien en scipy

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?

21
user2863620

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
27
Warren Weckesser

Après l'excellente réponse précédente:

  1. définir sigma s = 2
  2. définir la taille de la fenêtre w = 5
  3. évaluer la valeur 'tronquée': t = (((w - 1)/2)-0.5)/s
  4. filtrage: filtered_data = scipy.ndimage.filters.gaussian_filter(data, sigma=s, truncate=t)
10
Gustavo Ortiz