Filtrage et détection de contour
Cours
Filtrage linéaire / non linéaire
Filtres linéaires
Produit de convolution : , centré sur
- 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 proche, et taille du support: contrôle de filtrage
Filtres non linéaires
Filtre médian : , : voisinage autour de . Débruitge 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
Mélanger l'influence sptiale et colorimétrique. Pour un pixel , un pixel
si, , si
Interprétation
Si alors I'(p) = \dfrac{\sum \limits_{q \in V(p) I(q)}}{\sum \limits_{q \in V(p)^1}} = \dfrac{\sum \limits_{q \in V(p)} I(q)}{\\#\\{V(p)\\}} c'est à dire un filtre moyenneur
- pondération spatiale, un voisin proche spatialement contribue plus qu'un éloigné
- pondération colorimétrique, un voisin proche en valeur contribue plus qu'un éloigné. La préservation des différentes intensités permet d'indentifier les contours
NL Means
Détection du contour par le passage à zéro de la dérivée seconde. Utilisation du laplacien : . Approximation discrète du Laplcien $$\Delta \Delta I(i,j) = \partial^2_i I(i,j) + \partial^2_j(i,j)$.
Filtre passe bas / haut 2D
C'est un filtre idéal pour une fréquence de coupure .
-
Plus est grand, plus on ne récupère que les contours et le bruit
-
Plus est petit, plus on perd du signal utile (l'image)
-
Filtre de Butterworth :
-
Filtre Gaussien :
-
Filtres rejet / passe bande : 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 de droite et de 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 : si
- Différence centrée : . Les différences finies sont sensibles au bruit. Le bruit peut être vue 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 filter l'image par une Gaussienne de largeur . Le Laplacien de filtré par . Le Laplacien de filtré par devient , cela revient à convoluer directement avec le Laplacien de (LoG). La convolution avec une Gaussienne large rend l'image floue et les contours 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>
Éviter 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 moyenne non locales
- le paramètre
<sigma>
permet de calculer les poids associés aux patchs - les autreus 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 fourrier.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.png
etphase.png
- le programme réaliser un filtrage dans le domaine de Foourier 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.png` afin 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