Filtre passe-bas d'image MATLAB
Ce tutoriel discutera de la création d’un filtre passe-bas 2D pour une image à l’aide de la fonction fspecial()
dans MATLAB.
Lisser une image à l’aide du filtre passe-bas dans MATLAB
Deux niveaux de fréquence sont présents dans une image. Les contours et le bruit d’une image représentent les composants haute fréquence, et les zones lisses représentent les composants basse fréquence.
Les composants haute fréquence ont un niveau d’intensité élevé ou un contraste élevé, et les composants basse fréquence ont un niveau d’intensité faible ou un contraste faible.
Supposons qu’une image présente des contours nets ou du bruit et que nous souhaitions le lisser. Dans ce cas, nous devons créer un filtre passe-bas qui permettra aux composants ou pixels basse fréquence de passer et d’arrêter les composants ou pixels haute fréquence, abaissant le niveau d’intensité des pixels dans l’image.
Supposons qu’une image présente des zones lisses ou à faible contraste et que nous souhaitions la rendre plus nette. Dans ce cas, nous devons créer un filtre passe-haut qui permettra aux composants ou pixels haute fréquence de passer et d’arrêter les composants ou pixels basse fréquence, augmentant le niveau d’intensité des pixels dans l’image.
Il existe différents types de filtres que nous pouvons utiliser pour créer un filtre passe-bas ou passe-haut.
La fonction fspecial()
de MATLAB peut être utilisée pour faire un filtre passe-bas ou passe-haut 2D. Après avoir créé un filtre, nous pouvons l’appliquer à l’image donnée en utilisant la fonction imfilter()
ou filter2()
.
La fonction fspecial()
a des syntaxes différentes selon les différents filtres. Les filtres fspecial()
disponibles et leurs syntaxes sont présentés ci-dessous.
Filter_object = fspecial(type)
Filter_object = fspecial('average',hsize)
Filter_object = fspecial('disk',radius)
Filter_object = fspecial('gaussian',hsize,sigma)
Filter_object = fspecial('laplacian',alpha)
Filter_object = fspecial('log',hsize,sigma)
Filter_object = fspecial('motion',len,theta)
Filter_object = fspecial('prewitt')
Filter_object = fspecial('sobel')
La première syntaxe est la syntaxe de base de la fonction fspecial()
, et les six filtres après la première syntaxe sont des filtres passe-bas utilisés pour lisser une image, et les deux derniers filtres sont des filtres passe-haut utilisés pour accentuer les contours présents dans l’image donnée. Nous devons transmettre le type du filtre ou le nom du filtre pour créer un filtre de ce type spécifique.
Certains filtres ont également des arguments optionnels, mais si nous ne transmettons que le nom du filtre, la fonction utilisera les valeurs par défaut pour les arguments optionnels. Nous pouvons également définir les arguments optionnels des filtres en utilisant leur syntaxe spécifique, qui est affichée après la première syntaxe.
Par exemple, dans le cas d’un filtre moyen, nous pouvons définir la taille du filtre, qui peut être un entier positif ou un vecteur de deux éléments, en utilisant la deuxième syntaxe répertoriée ci-dessus.
Si nous définissons le hsize
comme un entier positif ou un scaler, le filtre sera une matrice carrée. Si nous définissons le hsize
comme un vecteur de deux éléments, le premier élément représentera le nombre de lignes et le deuxième élément représentera le nombre de colonnes de la matrice de filtrage.
La troisième syntaxe est utilisée pour créer un filtre de moyenne circulaire ou un filtre de disque en fonction du rayon donné, qui peut être un entier positif, et par défaut, sa valeur est définie sur 5. La quatrième syntaxe est utilisée pour créer un filtre gaussien avec le size hsize
et sigma
, qui représente l’écart-type, et par défaut, sa valeur est fixée à 0.5
.
Nous pouvons également utiliser les fonctions imgaussfilt()
et imgaussfilt3()
dans MATLAB pour créer et appliquer un filtre gaussien à une image donnée. La cinquième syntaxe permet de créer un filtre laplacien
selon alpha
, qui fixe la forme du laplacien, et sa valeur par défaut est 0.2
.
La sixième syntaxe est utilisée pour créer un filtre laplacien de filer gaussien selon la taille du filtre hsize
et sigma
, représentant l’écart type.
La septième syntaxe est utilisée pour créer un filtre de mouvement pour lisser une image qui contient un mouvement linéaire de la caméra en fonction de la longueur du mouvement spécifié par len
, qui a une valeur par défaut de 9, et l’angle de mouvement est en degrés spécifié par theta
. L’angle sera dans le sens antihoraire et sa valeur par défaut est 0.
La huitième syntaxe crée un filtre passe-haut pour améliorer le niveau d’intensité des bords horizontaux à l’aide d’un dégradé vertical. Si nous voulons créer un filtre pour améliorer les bords verticaux, nous pouvons prendre la transposition de la matrice de filtre de sortie.
La dernière syntaxe est la même que l’avant-dernière syntaxe ; la seule différence est que la dernière syntaxe est utilisée pour créer un filtre utilisant l’effet de lissage. Par exemple, utilisons la fonction fspecial()
pour créer le filtre de moyenne afin de supprimer le bruit sel et poivre présent dans une image.
Voir le code ci-dessous.
clc
clear
Input_image = imread('eight.tif');
Noisy_image = imnoise(Input_image,'salt & pepper',0.03);
h = fspecial('average');
Smoothed_image = filter2(h, Input_image);
imshowpair(Noisy_image,Smoothed_image,'montage')
Production:
Dans le code ci-dessus, nous avons utilisé la fonction imnoise()
pour mettre le bruit du sel et du poivre dans l’image donnée, et nous avons utilisé la fonction filter2()
pour appliquer le filtre de moyenne à l’image bruyante. Nous utilisons la fonction imshowpair()
pour afficher les images bruitées et lissées à des fins de comparaison.
Nous pouvons voir dans la sortie ci-dessus que l’image de droite est lissée à l’aide du filtre de moyenne. Nous pouvons appliquer différents filtres à une image pour vérifier le résultat.
On peut aussi utiliser la fonction imfilter()
pour appliquer un filtre sur une image donnée. La différence entre filter2()
et imfilter()
est leur algorithme pour appliquer le filtre sur l’image donnée.
imfilter()
utilise la double précision et l’arithmétique à virgule flottante pour calculer la valeur des pixels de l’image de sortie, et filter2()
prend la convolution 2D de l’image donnée et la matrice de filtre, qui sera tournée de 180 degrés pour trouver les valeurs de pixel de sortie. Nous pouvons essayer ces deux fonctions et comparer leur résultat.
Nous pouvons également définir certaines options de la fonction imfilter()
comme les options de remplissage pour le tableau d’entrée, la taille de la matrice de sortie et les options de convolution. Nous pouvons également définir la forme des données filtrées en sortie dans le cas de la fonction filter2()
, qui est définie sur same
par défaut, mais nous pouvons également la définir sur full
pour des données filtrées 2D complètes et valid
pour les données qui sont calculées sans utiliser les arêtes remplies de zéros.
Consultez ce lien pour plus de détails sur la fonction filter2()
. Consultez ce lien pour plus de détails sur la fonction imfilter()
.