Filtrage et détection de contours
Cours
Filtrage linéaire / non linéaire
Filtres linéaires
Produit de convolution : , centré sur (avec , on obtient une corrélation, identique à la convolution pour un noyau symétrique)
- H : représente la fonction à appliquer (Box, Gaussienne, Laplacien)
- Efficacité : utiliser des coefficients entiers + un paramètre de normalisation
- Filtre gaussien : influence des voisins plus ou moins proches ; et la taille du support contrôlent le filtrage
Filtres non linéaires
Filtre médian : , : voisinage autour de . Débruitage et "respect" des principales structures. Élimination des points isolés et des lignes fines, préservation des contours en "marche d'escalier" et lissage des coins.
Filtres min/max :
Filtre bilatéral
Il s'agit de mélanger l'influence spatiale et colorimétrique. Pour un pixel et un pixel :
avec : si , ; si , .
Interprétation
Si , alors , c'est-à-dire un filtre moyenneur.
- : pondération spatiale, un voisin proche spatialement contribue plus qu'un voisin éloigné
- : pondération colorimétrique, un voisin proche en valeur contribue plus qu'un voisin éloigné. Les pixels situés de l'autre côté d'un contour contribuent peu : les contours sont préservés
NL-means
Le filtre par moyennes non locales (non-local means) remplace chaque pixel par une moyenne pondérée des pixels d'une fenêtre de recherche, le poids dépendant de la ressemblance entre les patchs (petits voisinages) centrés en et en : . Des pixels éloignés mais situés dans des structures similaires contribuent ainsi au débruitage, ce qui préserve bien les textures et les contours.
Filtres passe-bas et passe-haut 2D
Les filtres idéaux, pour une fréquence de coupure , s'écrivent :
-
Passe-haut : plus est grand, plus on ne récupère que les contours et le bruit
-
Passe-bas : plus est petit, plus on perd de signal utile (l'image devient floue)
-
Filtre de Butterworth :
-
Filtre gaussien :
-
Filtres réjecteur / passe-bande (Butterworth) : avec le rayon et la largeur de la bande
Dérivées premières et fonctions discrètes
Les contours impliquent des grandes valeurs de la dérivée (opérateurs du 1er ordre). L'approximation des dérivées (pente) utilise des points à droite et à gauche. Plusieurs approximations sont possibles :
- Différence à droite (forward)
- Différence à gauche (backward)
- Différence centrée (moyenne)
Pour une image 2D discrète , le gradient localisé au point est le vecteur :
- Magnitude du gradient (sa norme)
- Direction du gradient :
Différences finies par convolution et moyenneur
- Différence à droite : , noyau
- Différence centrée : , noyau , soit . Les différences finies sont sensibles au bruit : le bruit peut être vu comme un point de contour, il faut donc coupler la différentiation avec un filtrage.
- Détecteur de Prewitt :
- Détecteur de Sobel :
Autres approches : dérivées secondes
Détection du contour par le passage à zéro de la dérivée seconde. Pour cela on utilise le laplacien . Son approximation discrète est .
Amélioration : filtre passe bas
L'idée est de filtrer l'image par une gaussienne de largeur . Le laplacien de filtré par devient : cela revient à convoluer directement avec le Laplacien de (LoG). Attention : la convolution avec une gaussienne trop large rend l'image floue et les contours fins sont perdus.
Schéma classique d'extraction de contours :
- calculer le gradient () ou le Laplacien ()
- localiser les maxima locaux de la norme du gradient ou le passage à zéro du Laplacien
- un seuillage permet d'avoir la carte binaire de contour mais il y a un risque de déconnexion des contours (améliorable via des algorithmes de re-chaînage)
- utilisation des contours dans d'autres applications
Mise en pratique
median-filter <r> <ims> <imd>
Écrire le programme median-filter.cpp
- ce programme permet de charger une image donnée en paramètre
<ims> - l'image source est considérée comme une image en niveaux de gris
- le programme réalise le filtrage médian où la fenêtre de recherche de taille est déterminée par le paramètre
<r> - sauver le résultat dans l'image
<imd> - comparer avec la fonction
medianBlur - visualiser avec pvisu les différents résultats
bilateral <sigma_s> <sigma_g> <ims> <imd>
Écrire le programme bilateral.cpp
- ce programme permet de charger une image donnée en paramètre
<ims> - l'image source est considérée comme une image en niveaux de gris
- le programme réalise le filtrage bilatéral
- le paramètre
<sigma_g>permet de calculer la Gaussienne pour la pondération sur les intensités et<sigma_s>celle pour la pondération des distances. On pourra pré-calculer ces coefficients et seuiller celle sur les distances afin de déterminer la taille du voisinage : , par exemple - le programme sauve l'image
<imd> - comparer les résultats avec la fonction
bilateralFilter - visualiser avec pvisu les différents résultats
nl-means <sigma> <ims> <imd>
Écrire le programme nl-means.cpp
- ce programme permet de charger une image donnée en paramètre
<ims> - l'image source est considérée comme une image en niveaux de gris
- le programme réalise le filtrage par moyennes non locales
- le paramètre
<sigma>permet de calculer les poids associés aux patchs - les auteurs donnent des paramètres empiriques : une fenêtre de recherche de taille et des patchs
- le programme sauve l'image
<imd> - visualiser avec pvisu les différents résultats
fourier <ims> <freq>
Écrire le programme fourier.cpp
- ce programme permet de charger une image donnée en paramètre
<ims> - le programme réalise la transformée de Fourier directe (fonction
dft) - affiche le spectre d'amplitude et de phase (centrés) et la sauve dans les fichiers
magnitude.pngetphase.png - le programme réalise un filtrage dans le domaine de Fourier et annule (de manière symétrique) la fréquence
<freq>donnée en paramètre - sauve le spectre d'amplitude modifié dans un fichier
magnitude-modify.pngafin d'observer l'annulation des fréquences - le programme réalise la transformée de Fourier inverse et sauve le résultat dans le fichier
inverse.png - visualiser avec pvisu les différents résultats