web-dev-qa-db-fra.com

Filtre gaussien dans MATLAB

Le filtre "gaussien" dans MATLAB convole-t-il l'image avec le noyau gaussien? Aussi, comment choisissez-vous les paramètres hsize (taille du filtre) et sigma? Sur quoi vous basez-vous?

30
md86

Vous créez d'abord le filtre avec fspecial puis convoluez l'image avec le filtre en utilisant imfilter (qui fonctionne sur des images multidimensionnelles comme dans l'exemple).

Vous spécifiez sigma et hsize dans fspecial.

Code:

%%# Read an image
I = imread('peppers.png');
%# Create the gaussian filter with hsize = [5 5] and sigma = 2
G = fspecial('gaussian',[5 5],2);
%# Filter it
Ig = imfilter(I,G,'same');
%# Display
imshow(Ig)
55
Jacob

@ Jacob vous a déjà montré comment utiliser le filtre gaussien dans Matlab, donc je ne répéterai pas cela.

Je choisirais une taille de filtre d'environ 3 * sigma dans chaque direction (arrondie à un entier impair). Ainsi, le filtre se désintègre presque à zéro sur les bords et vous n'obtiendrez pas de discontinuités dans l'image filtrée.

Le choix de sigma dépend beaucoup de ce que vous voulez faire. Le lissage gaussien est un filtrage passe-bas, ce qui signifie qu'il supprime les détails haute fréquence (bruit, mais aussi les bords), tout en préservant les parties basse fréquence de l'image (c'est-à-dire celles qui ne varient pas tellement). En d'autres termes, le filtre brouille tout ce qui est plus petit que le filtre.

Si vous cherchez à supprimer le bruit dans une image afin d'améliorer la détection de petites fonctionnalités, par exemple, je suggère de choisir un sigma qui rend le gaussien légèrement plus petit que la fonctionnalité.

21
Jonas

Dans MATLAB R2015a ou plus récent, il n'est plus nécessaire (ou recommandé du point de vue des performances) d'utiliser fspecial suivi de imfilter car il existe une nouvelle fonction appelée imgaussfilt qui effectue cette opération en une seule étape et plus efficacement.

La syntaxe de base:

B = imgaussfilt(A,sigma) filtre l'image A avec un noyau de lissage gaussien 2D avec un écart type spécifié par sigma.

La taille du filtre pour un écart-type gaussien donné (sigam) est choisie automatiquement, mais peut également être spécifiée manuellement:

B = imgaussfilt(A,sigma,'FilterSize',[3 3]);

La valeur par défaut est 2*ceil(2*sigma)+1.

Les fonctionnalités supplémentaires de imgaussfilter sont la possibilité de fonctionner sur gpuArrays, le filtrage dans le domaine fréquentiel ou spatial, et les options avancées de remplissage d'image. Cela ressemble beaucoup à IPP ... hmmm. De plus, il existe une version 3D appelée imgaussfilt3 .

14
chappjc