Upload
others
View
2
Download
1
Embed Size (px)
Citation preview
Master Informatique – Projet Encadré IVI 1
PjE – Projet Encadré IVISemaine 4 : filtrage d'image et
compléments sur OpenCV
Master Informatique : http://www.fil.univ-lille1.frSpécialité IVI : http://master-ivi.univ-lille1.fr
Master Informatique – Projet Encadré IVI 2
Plan du cours
1 – Transformations de voisinage
Principe de la transformation et voisinages
Filtrage par convolution 2D
Filtres de lissage
Filtres morphologiques
2 – Filtrer avec OpenCV
Filtres de convolution
Filtres morphologiques
3 – Compléments sur OpenCV
Histogrammes
Interaction
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
Master Informatique – Projet Encadré IVI 3
Principe des transformations de voisinage (1/2)
Principe
Pour calculer la valeur du pixel de coordonnées (x,y) dans l'image résultat I', on utilise, dans l'image initiale, non seulement la valeur du pixel I(x,y) mais aussi celles des pixels situés dans un voisinage de ce dernier I(V (x,y)).
I' a même taille que I, mais des propriétés plus intéressantes.En chaque pixel P(x,y) considéré, le voisinage V est défini de manière
identique (« forme » identique) mais relativement à lui (V (x,y)).
I x , y t
I ' x , y =t I V x , y x
y
x
y
t
V x , y
I I'
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
Master Informatique – Projet Encadré IVI 4
Principe des transformations de voisinage (2/2)
Principe (détail)
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
Master Informatique – Projet Encadré IVI 5
Notion de voisinage
Voisinage V d'un pixel P(x,y)
HypothèsesV est centré en P ;
les pixels sont disposés selon une maille carrée (treillis).Définition : V (P) est l'ensemble des pixels situés à moins d'une certaine
distance de P.La forme du voisinage (et le nombre de voisins) de P dépendent de la distance considérée.Voisinages les plus usités en traitement d'images :
4-voisinage 8-voisinage ou « voisinage 3x3 » « voisinage 5x5 »
Notations encoordonnées relativessi Q est voisin de P(x,y), alors Q(x+i,y+j) avec i, j entiers relatifs.
Ici ne sont représentées que les coordonnées (i, j)
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
Master Informatique – Projet Encadré IVI 6
Filtrage
Principe
déplacer le filtre sur chacun des pixels (P = pixel d'analyse) de l'image Iremplacer le niveau en P par une valeur dépendant des niveaux de ses voisins
le nombre de voisins considérés dépend de la taille du filtre2 principaux types de filtres : le niveau en P est remplacé par
une combinaison linéaire des niveaux voisins(filtre linéaire, réalisable par convolution)
Image initiale I Filtre H Filtrage de I par H Image résultat I'
une transformation non linéaire des niveaux voisins (filtre non linéaire).
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
Master Informatique – Projet Encadré IVI 7
Filtrage par convolution discrète 2D (1/2)
Principe
L'image I est une fonction de 2 variables discrètes (x et y).Le filtre de convolution H appliqué sur I est lui aussi à 2D (matrice).
H est appelé filtre, masque, noyau ou fenêtre de convolution.
Souvent carré et de taille impaire (3x3, 5x5, ...), pour être centré sans ambiguïté sur le pixel d'analyse.Souvent à valeurs symétriques par rapport àl'élément central : h
-1,-1=h
+1,+1, h
0,-1=h
0,+1, h
+1,-1=h
-1,+1, ...
Souvent à somme unité (normalisé) pour conserver la luminance de l'image.
Formule
L'image I' résultat de la convolution (notée ) de I par H est donnée par :
C'est un filtrage linéaire (somme de multiplications entre les niveaux de gris de l'image initiale I et les coefficients du masque H ).
I ' x , y= I∗H x , y=∑i∑j
I x−i , y− j .H i , j
H =[h−1,−1 h0,−1 h1,−1
h−1,0 h0,0 h0,−1
h−1,1 h0,1 h1,1]
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
Master Informatique – Projet Encadré IVI 8
Filtrage par convolution discrète 2D (2/2)
Calcul pratiqueTourner le masque de 180° autour de son centre (0,0) ;Superposer le masque obtenu à l'image I de sorte qu'il soit centré en (x,y) ;Multiplier chaque coefficient du masque par le niveau du pixel sous-jacent ;Additionner chacun de ces produits pour obtenir I'(x,y).
I ' x , y= I x−1, y−1 .h1,1 I x−1, y .h1,0I x−1, y1 .h1,−1
I x , y−1 .h0,1I x , y .h0,0 I x , y1 .h0,−1
I x1, y−1 .h−1,1 I x1, y .h−1,0 I x1, y1 .h−1,−1
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
Master Informatique – Projet Encadré IVI 9
Filtres de lissage (1/2)
Bruits dans une image
Sources : environnement (poussières), capteur (dérive), quantification, ...Restauration d'image : on tente de retrouver l'image idéale I (obtenue si l'acquisition était parfaite) en éliminant le bruit de l'image réelle I.Modélisation : souvent considéré comme aléatoire
bruit additif : I(x,y) = I(x,y) + b(x,y)bruit multiplicatif : I(x,y) = I(x,y) . b(x,y)
Ex.
Additif gaussien ( = 25) Multiplicatif gaussien « Poivre et sel » (20% de pixels affectés)
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
Master Informatique – Projet Encadré IVI 10
Filtres de lissage (2/2)
Filtres linéaires (exemples)
Filtres moyenneurs+ réduction du bruit - forte atténuation des contours
Filtres gaussiens+ limitent l'effet de flou+ degré de lissage paramétrable ( )
Filtres non linéaires. Exemple : le filtre médian
Le niveau de gris résultat est le ndg médian des pixels voisins.
14 18 20 22 25 25 27 27 211
| 4 valeurs | médiane | 4 valeurs |
I(V (x,y)) Valeurs de I(V (x,y)) triées par ordre croissant I'(x,y)
18 20 25
14 27 211
22 27 25
25
H =19 [1 1 1
1 1 11 1 1] ou
110 [1 1 1
1 2 11 1 1]
H =0,8=1
16 [1 2 12 4 21 2 1 ]
I
moy3x3
méd3x3
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
Master Informatique – Projet Encadré IVI 11
Filtres morphologiques (1/2)
Filtres de rang (ou filtres d'ordre)
Généralisation du filtre médian.Principe : au lieu du niveau médian, on choisit le niveau d'un rang donné.Cas particuliers : on choisit le niveau local minimum (i
min) ou maximum
(imax
) filtres morphologiques.
Filtres morphologiques
Utilisent un élément structurant B
définition du voisinage (ou de la connexité), ex.:
Dilatation : affecte au pixel d'analyse P la valeur maximale de son voisinage : B (I)(P) = sup { I(Q) | Q B (P) }
Érosion : affecte au pixel d'analyse P la valeur minimale de son voisinage :
B (I)(P) = inf { I(Q) | Q B (P) }
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
Master Informatique – Projet Encadré IVI 12
Filtres morphologiques (2/2)
Opérateurs morphologiques sur images binaires
Fermeture (dilatation puis érosion) B [B (I)]
ferme les objets, remplit les trous
Ouverture (érosion puis dilatation) B [B (I)]supprime les objets de largeur inférieure à celle de l'élément structurantsépare les objets fusionnés à tort
mise à 1 par dilatationmise à 0 par érosion
Élément structurant B :
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
Master Informatique – Projet Encadré IVI 13
Filtres classiques sous OpenCV
Filtrages prédéfinis
Filtrage par filtre moyenneur normalisé
blur(src, ksize[, dst[, anchor[, borderType]]]) → dst
Filtrage gaussienGaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) → dst
Filtrage médianmedianBlur(src, ksize, [, dst]) → dst
Filtrage bilatéralbilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) → dst. Rem. : pas de filtrage in-place.
ParamètresTaille du filtre
ksize : entier impair pour medianBlur, tuple (width, height) sinond : diamètre (entier) du voisinage,calculé à partir de sigmaSpace si d ≤ 0
Écart-types sigma* : réelsborderType (constante BORDER_*) : mode d'extrapolation des pixels de bord
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
H = 1ksize .width×ksize .height [1 1 ⋯ 1
1 1 ⋯ 1⋮ ⋮ ⋱ ⋮1 1 ⋯ 1
]
Master Informatique – Projet Encadré IVI 14
Filtres de convolution généraux sous OpenCV
Filtrage défini par l'utilisateur
Fonctionfilter2D(src,ddepth, kernel[,dst[,anchor[,delta[,borderType]]]]) → dst
Paramètresddepth : profondeur de l'image destination dst kernel : masque (ou noyau) de convolution à coefficients réelsanchor : point d'ancrage (par défaut, le centre du masque)delta : valeur ajoutée aux pixels filtrés avant stockage dans dst
Exemple
# Créer un filtre gaussien 3x3
gauss1D = cv2.getGaussianKernel(3, -1)
gauss2D = gauss1D * gauss1D.T
# Appliquer ce filtre à une image synthétique
im = np.array([[50,50,50],[50,100,50],[50,50,50]], dtype=np.uint8)
flt = cv2.filter2D(im, -1, gauss2D, borderType=cv2.BORDER_CONSTANT)
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
50 50 50
50 100 50
50 50 50
31 44 31
44 62 44
31 44 31
im flt
Master Informatique – Projet Encadré IVI 15
Filtres morphologiques sous OpenCV (1/2)
Dilatation et érosion
Fonctionsdilate(src,kernel[,dst[,anchor[,iterations[,borderType[,borderValue]]]]]) → dst
erode(src,kernel[,dst[,anchor[,iterations[,borderType[, borderValue]]]]]) → dst
Paramètreskernel : élément structurant (ex. np.ones( (3,3), np.uint8) )iterations : nombre d'itérations
Définition d'un élément structurantgetStructuringElement(shape, ksize[, anchor]) → retval
Exemplez = np.zeros(10, dtype=np.uint8)im = np.array([z,z,[0,0,0,1,1,1,0,0,0,0], [0,0,0,1,1,1,0,1,0,0], [0,0,1,1,0,0,1,0,0,0], [0,0,0,1,1,1,0,0,0,0],z, [0,0,0,1,1,0,0,0,0,0],z,z], dtype=np.uint8)structel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3,3))flt = cv2.dilate(im, structel)
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
structel
kernel
im flt
Master Informatique – Projet Encadré IVI 16
Filtres morphologiques sous OpenCV (2/2)
Filtres morphologiques avancés
FonctionmorphologyEx(src,op,kernel[,dst[,anchor[,iterations[,borderType[,borderValue]]]]]) → dst
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
op Opérateur Description de dst Utilisation
MORPH_CLOSE Fermeture B [B (src)] Suppression des artefacts de bruit
MORPH_OPEN Ouverture B [B (src)] Connexion des objets proches
MORPH_GRADIENT Gradient B (src) - B (src) Contours des objets
MORPH_TOPHAT Chapeau haut-de-forme
src - B [B (src)] Objets plus clairs que leur voisinage
MORPH_BLACKHAT Chapeau noir B [B (src)] - src Objets plus sombres que leur voisinage
MORPH_HITMISS «Hit and miss» B1
(src)B─1
(srcc) Recherche de motif d'avant-plan (B =1) ou
arrière-plan (B =-1) (src : image binaire)
Master Informatique – Projet Encadré IVI 17
Histogrammes sous OpenCV (1/3)
Histogramme
Possibilité de représenter des histogrammes de toutes dimensions, ex.
CréationcalcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) → his
images : tableau d'images (de type CV_8U ou CV_32F)channels : tableau des canaux dont on souhaite l'histo pour chaque imagemask : masque binaire des pixels dont on souhaite l'histo (None pour tous)histSize : tableau (0..nbChannels-1) du nombre de cellules de chaque canalranges : tableau (0..2*nbChannels-1) des plages définissant les cellules
cellule (bin)
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
Master Informatique – Projet Encadré IVI 18
Histogrammes sous OpenCV (2/3)
Remarques sur calcHist()
Le paramètre channels énumère les indices des canaux souhaités
Premier indice [0, images[0].ndim-1]
Second indice [images[0].ndim, images[0].ndim+images[1].ndim-1]etc.
Le paramètre ranges est un tableau « plat » (pas de tableaux imbriqués)
Histogramme non uniforme : C++ seulement ; utiliser np.histogram
Exemples
Image en niveaux de grishist = cv2.calcHist([im],[0],None,[256],[0,256])
Image couleur (couleur les plus représentées ?)im = cv2.imread('lena.png')
hist = cv2.calcHist([im,im,im],[0,4,8],
None,[256,256,256],[0,256,0,256,0,256])np.nonzero(hist==hist.max()) → (array([60, 79], dtype=int64),
array([18, 67], dtype=int64),
array([ 88, 176], dtype=int64))
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
Master Informatique – Projet Encadré IVI 19
Histogrammes sous OpenCV (3/3)
Autres fonctions
Rétro-projection d'un histogrammecalcBackProject(images, channels, hist, ranges, scale[, dst]) → dst
Paramètre scale : facteur d'échelle des valeurs de cellulesPrincipe : remplace chaque valeur de pixel par sa probabilité d'occurrenceUtilisation : détection (ou suivi) d'un objet caractérisé par son histogramme (sélection de RoI), souvent en utilisant un espace HSV (canal H et/ou S)
Égalisation d'un histogrammeequalizeHist(src[, dst]) → dst
Principe : Calculer l'histogramme cumulé normalisé H'Utiliser H' comme une LUT : dst(x,y)= H'(src(x,y))
Utilisation : augmentation du contraste d'une imageComparaison d'histogrammescompareHist(H1, H2, method) → retval
Retourne la similarité entre les histogrammes H1 et H2 selon la method donnée
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
Master Informatique – Projet Encadré IVI 20
Interaction sous OpenCV
Trackbar
CréationcreateTrackbar(trackbarName, windowName, value, count, onChange) → None
Paramètresvalue : valeur du curseur (slider) à la créationcount : valeur maximale du curseuronChange : nom de la fonction de rappel (callback)
Lecture de la valeur du curseurgetTrackbarPos(trackbarName, windowName) → retval
Fonction de rappelToute fonction python, éventuellement réduite à :def nothing(x): pass # Ne rien faire
Événements souris
Gestion : setMouseCallback(windowName, onMouse, [userdata]) → None
Fonction de rappel : def mouse_callback(events,x,y,flags,params)
Transformations de voisinage Filtrer avec OpenCV Compléments sur OpenCV
Master Informatique – Projet Encadré IVI 21
Webographie
Filtres
Bilatéral : http://en.wikipedia.org/wiki/Bilateral_filter
Morphologique « hit and miss » : https://huit.re/s-q55gm0Histogramme
Non-uniforme : https://github.com/opencv/opencv/issues/8052Rétro-projection : https://huit.re/XCpK0rCB
Numpy
Aide-mémoire : http://www.labri.fr/perso/ramet/algonum/projets/sheet.phpFor Matlab users :http://scipy.github.io/old-wiki/pages/NumPy_for_Matlab_Users
Interaction
Trackbar : https://huit.re/-fbEmdY6Souris : http://docs.opencv.org/trunk/db/d5b/tutorial_py_mouse_handling.html
Analyse des images Transformations d'images Bibliothèque OpenCV