21
Master Informatique – Projet Encadré IVI 1 PjE – Projet Encadré IVI Semaine 4 : filtrage d'image et compléments sur OpenCV Master Informatique : http://www.fil.univ-lille1.fr Spécialité IVI : http://master-ivi.univ-lille1.fr

PjE – Projet Encadré IVI Semaine 4 : filtrage d'image et ...master-ivi.univ-lille1.fr › fichiers › Cours › pje-semaine-4-filtrage.pdf · structel = cv2.getStructuringElement(cv2.MORPH_CROSS,

  • 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