256 shades of grey Stéphane Gonnord 256 shades of grey Du pixel au fichier Pixels Formats de fichiers image Stéphane Gonnord – www.psi945.fr Manipulations avec Python Trois niveaux d’abstraction Du fichier aux pixels Des pixels au fichier Un peu de technique Jeudi 30 avril 2015 Quelques traitements d’image Gestion du contraste Éclaircissement Floutage Détection de contours Plan Du pixel au fichier Pixels Formats de fichiers image 256 shades of grey Stéphane Gonnord Du pixel au fichier Pixels Formats de fichiers image Manipulations avec Python Trois niveaux d’abstraction Du fichier aux pixels Manipulations avec Python Trois niveaux d’abstraction Du fichier aux pixels Des pixels au fichier Un peu de technique Quelques traitements d’image Gestion du contraste Éclaircissement Floutage Détection de contours Des pixels au fichier Un peu de technique Quelques traitements d’image Gestion du contraste Éclaircissement Floutage Détection de contours Qu’est-ce qu’une image ? I I 256 shades of grey Stéphane Gonnord Un rectangle/une matrice de pixels (PICture ELements). Du pixel au fichier Un pixel = nuance de gris (...) entre 0 et 255... ou entre 0 et 1. Manipulations avec Python Pixels Formats de fichiers image Trois niveaux d’abstraction Du fichier aux pixels Des pixels au fichier I I Ou bien (RGB) : trois niveaux Red/Green/Blue de 0 à 255. Stockage dans un fichier : pixel par pixel, ou après compression. I Compression : destructive ou non (avec ou sans perte d’information). I Poids d’un fichier BitMaP (pixel par pixel sans compression) en RGB : 3 × L × H octets ; trois fois moins en noir et blanc ! Un peu de technique Quelques traitements d’image Gestion du contraste Éclaircissement Floutage Détection de contours 256 shades of grey Quelques formats d’image Stéphane Gonnord Du pixel au fichier Chat : image 2048 × 1536 pixels ; poids en kilo-octets. Pixels Formats de fichiers image Manipulations avec Python Trois niveaux d’abstraction Du fichier aux pixels Des pixels au fichier Un peu de technique Quelques traitements d’image Gestion du contraste Éclaircissement Floutage Détection de contours Ext. destr. compr. chat (RGB) chat (N&B) bmp png gif jpg NON NON NON OUI NON OUI OUI OUI 9437 4999 3336 400 3147 1533 3367 366 Trois niveaux d’abstraction I Le fichier, support « physique », sur le disque. I L’objet Python « image » intermédiaire. Contient les informations sur l’encodage... et les données. 256 shades of grey Stéphane Gonnord Du pixel au fichier Pixels Formats de fichiers image Manipulations avec Python Trois niveaux d’abstraction I La matrice des pixels. Du fichier aux pixels Des pixels au fichier Un peu de technique Fichier Objet Python Matrice de pixels ’baroudeur.bmp’ <PIL.BmpImage... ... image mode=RGB ...> <PIL.JpegImage... ... image mode=RGB ...> <PIL.JpegImage... ... image mode=L ...> array([[[ 12, 16, 25], ... [80, 86, 60]]], dtype=uint8) array([[[ 12, 16, 25], ... [80, 86, 60]]], dtype=uint8) array([[14, 15, 15, ..., ... ... 80, 80, 80]], dtype=uint8) ’baroudeur.jpg’ ’baroudeurBW.jpg’ Quelques traitements d’image Gestion du contraste Éclaircissement Floutage Détection de contours Du fichier aux pixels I Image.open : objet image à partir du fichier. I numpy.array : tableau/matrice de pixels à partir de l’objet 256 shades of grey Stéphane Gonnord Du pixel au fichier Pixels Formats de fichiers image image. Manipulations avec Python I Exemple : Trois niveaux d’abstraction Définition de l’objet et de la matrice >>> chat = im.open(’images_out/baroudeurBW.jpg’) >>> pixels_chat = np.array(chat) Du fichier aux pixels Des pixels au fichier Un peu de technique Quelques traitements d’image Gestion du contraste Éclaircissement Résultat Floutage Détection de contours >>> chat <PIL.JpegImagePlugin.JpegImageFile image mode=L size=2048x1536 at 0xB5F911AC> >>> pixels_chat array([[ 14, 15, 15, ..., 208, 212, 215], [ 14, 15, 15, ..., 211, 212, 214], ..., [208, 206, 203, ..., 80, 80, 80]], dtype=uint8) Des pixels au fichier I Image.fromarray : des pixels à l’objet image. I Méthode save des objets image : pour sauver sous différents formats. I Exemple : Que fais-je ? pixels_chat = np.array( im.open(’baroudeurBW.jpg’) ) 256 shades of grey Stéphane Gonnord Du pixel au fichier Pixels Formats de fichiers image Manipulations avec Python Trois niveaux d’abstraction Du fichier aux pixels Des pixels au fichier pixels_chat[ 100:200 , 500:1500 ] = 255*np.ones((100, 1000),dtype=’uint8’) im.fromarray(pixels_chat).save(’mystere.jpg’) Un peu de technique Quelques traitements d’image Gestion du contraste Éclaircissement Floutage Détection de contours Quelques points techniques 256 shades of grey Stéphane Gonnord I Slicing : tableau[ a:b , c:d ] en lecture ou écriture. I numpy.zeros( (a,b) ) et numpy.ones( (a,b) ) attention aux types. Du pixel au fichier I Conversion en niveaux (Levels) de gris : image.open(’image_couleur.jpg’).convert(’L’).save(’image_BW.png’) I Appliquer une fonction aux pixels : deux approches Manipulations avec Python Appliquons f à M : pixels1 = np.array(im.open(’baroudeur.jpg’)) Pixel par pixel ; 48 secondes Pixels Formats de fichiers image Trois niveaux d’abstraction Du fichier aux pixels Des pixels au fichier Un peu de technique Quelques traitements d’image Gestion du contraste (H, L, _) = pixels1.shape # hauteur * largeur * 3 pixels2 = np.copy(pixels1) Éclaircissement Floutage Détection de contours for i in range( H ): for j in range( L ): pixels2[i][j] = contraste( pixels2[i][j] ) Par application d’une fonction « vectorisée » au tableau ; 3 secondes contraste_vecto = np.vectorize( contraste ) pixels2 = contraste_vecto( pixels1 ) # en fait : pixels2 = np.array( ... , dtype=’uint8’) im.fromarray(pixels2).save(’baroudeurBW2.jpg’) 256 shades of grey Fonction de contraste I I Stéphane Gonnord On applique f : {0, 1, ..., 255} → {0, 1, ..., 255} à chaque pixel. Du pixel au fichier Pixels Formats de fichiers image Manipulations avec Python Pour contraster/décontraster : Trois niveaux d’abstraction f1 (x ) = 128 + 2 ×(x − 128) f2 (x ) = 128 +(x − 128)/2 Du fichier aux pixels Des pixels au fichier Un peu de technique On revient à {0, 1, ..., 255} en cas de dépassement ! Gestion du contraste Éclaircissement 255 Floutage y = f1 (x) y = f2 (x) Détection de contours 192 y I Quelques traitements d’image 128 64 0 0 64 128 x 192 255 Que devient le chat ? 256 shades of grey Stéphane Gonnord Du pixel au fichier Pixels Formats de fichiers image Manipulations avec Python Trois niveaux d’abstraction Du fichier aux pixels Des pixels au fichier Un peu de technique Quelques traitements d’image Gestion du contraste Éclaircissement Floutage Détection de contours Un goutte contrastée 5 fois 256 shades of grey Stéphane Gonnord Du pixel au fichier Pixels Formats de fichiers image Manipulations avec Python Trois niveaux d’abstraction Du fichier aux pixels Des pixels au fichier Un peu de technique Quelques traitements d’image Gestion du contraste Éclaircissement Floutage Détection de contours Un autre, aux bords moins nets 256 shades of grey Stéphane Gonnord Du pixel au fichier Pixels Formats de fichiers image Manipulations avec Python Trois niveaux d’abstraction Du fichier aux pixels Des pixels au fichier Un peu de technique Quelques traitements d’image Gestion du contraste Éclaircissement Floutage Détection de contours Éclaircissement ou assombrissement Fonction pour éclaircir/assombrir : 256 shades of grey Stéphane Gonnord Du pixel au fichier Pixels f3 (x ) = 255 − (255 − x )/2 255 f4 (x ) = x /2 Trois niveaux d’abstraction y = f3 (x) y = f4 (x) Du fichier aux pixels Des pixels au fichier 192 y Formats de fichiers image Manipulations avec Python Un peu de technique Quelques traitements d’image 128 Gestion du contraste 64 Éclaircissement 0 0 Floutage 64 128 x 192 255 Détection de contours 256 shades of grey Floutons πR 2 ! Stéphane Gonnord Du pixel au fichier Mi ,j ← 1 9 Pixels (Mi −1,j −1 + · · · + Mi +1,j +1 ) Formats de fichiers image Manipulations avec Python Trois niveaux d’abstraction Du fichier aux pixels Des pixels au fichier Un peu de technique Quelques traitements d’image Gestion du contraste Éclaircissement Floutage Détection de contours 256 shades of grey Détection de contours Stéphane Gonnord On noircit les pixels (i , j ) tels que : Du pixel au fichier Pixels 2 2 (Pi −1,j − Pi +1,j ) + (Pi ,j −1 − Pi ,j +1 ) > s, avec un seuil... à fixer ! On contraste d’abord l’image Formats de fichiers image Manipulations avec Python Trois niveaux d’abstraction Du fichier aux pixels Des pixels au fichier Un peu de technique Quelques traitements d’image Gestion du contraste Éclaircissement Floutage Détection de contours C’est fini ! Merci de votre attention 256 shades of grey Stéphane Gonnord Du pixel au fichier Pixels Formats de fichiers image Manipulations avec Python Trois niveaux d’abstraction Du fichier aux pixels Des pixels au fichier Un peu de technique Quelques traitements d’image Gestion du contraste Éclaircissement Floutage Détection de contours