CHAPITRE 9 TABLEAUX ET IMAGES AU FORMAT MATRICIEL Pour définir une image à l aide de l outil informatique, une méthode consiste à considérer celleci comme une juxtaposition de points de couleurs, appelés pixels (pour «picture elements»). Ainsi, on représente une image sous la forme d un tableau (ou matrice) donnant la couleur de chaque pixel : ce format d image est appelé bitmap signifiant «carte de points». 1 Gestion de tableaux en python 1.1 Tableau donné par la liste de ses lignes Pour définir un tableau en python, on le donne sous la forme de la liste de ses lignes, chaque ligne étant elle-même une liste. Exemple. On souhaite définir le tableau suivant avec python : 2 5 8 1 4 9 0 3 7 6 4 1 0 2 5 3 7 9 6 8 2 8 3 9 1 7 6 0 4 5 On écrira donc tableau=[[2,5,8,1,4,9,0,3,7,6],[4,1,0,2,5,3,7,9,6,8],[2,8,3,9,1,7,6,0,4,5]] Pour une meilleure lisibilité, on pourra présenter celui-ci de la manière suivante : tableau=[[2,5,8,1,4,9,0,3,7,6], [4,1,0,2,5,3,7,9,6,8], [2,8,3,9,1,7,6,0,4,5]] Ce tableau étant une liste, on pourra réaliser les opérations suivantes usuelles sur les listes. Attention : comme toujours, la numérotation commence à 0. Accéder à une ligne : tableau[i] renvoie la ligne numéro i. Accéder à un élément (cases) : tableau[i][j] renvoie l élément situé en ligne i et colonne j. Sous-tableau contenant les lignes allant de i à k : tableau[i:k+1] Nombre de lignes : len(tableau) Nombre de colonnes : len(tableau[0]) (nombre d éléments dans la première ligne) Extraire une colonne : il est moins facile d extraire une colonne. Pour cela (par exemple la colonne 3), on pourra extraire l élément numéro 3 de toutes les lignes puis en former une liste. Méthode la plus courte : colonne3=[ligne[3] for ligne in tableau] Attention : problème de la duplication d une liste On souhaiterait dupliquer une liste L. La méthode intuitive consiste à écrire : L=[1,2,3,4] L1=L Cepandant, dans ce cas, toute modification de L1 modifiera aussi la liste de départ. Cela crée simplement deux variables L et L1 pointant vers la même adresse mémoire. Essayons d autres méthodes. L2=L[:] L3=[i for i in L] Cette fois-ci les listes L3 et L4 sont dissociées de L : on peut les modifier sans incidence sur L Problème supplémentaire dans le cas des tableaux Un tableau est une liste de listes, donc les méthodes 2 et 3 vont encore poser problème car elles dupliquent naivement chaque ligne du tableau. Méthode possible : tableau2=[ligne[:] for ligne in tableau] 1
1.2 Utilisation de la bibliothèque numpy La bibliothèque numpy permet entre autre de manipuler des des tableaux/matrices et de réaliser des calculs sur ceux-ci. Pour charger la bibliothèque : import numpy. Les commandes spécifiques à numpy seront alors de la forme numpy.commande. Remarque : pour raccourcir les noms de commandes, on peut écrire, par exemple, import numpy as np et alors numpy sera abrégé en np. Les commandes seront donc de la forme np.commande. Commandes principales, avec l abbréviation np. Attention : la numérotation commence toujours à 0. Définition d un tableau/matrice : tableau=np.array(ligne1,ligne2,...), chaque ligne étant elle-même une liste. Accéder à un élément (cases) : tableau[i][j] ou tableau[i,j] renvoie l élément situé en ligne i et colonne j. Accéder à une ligne : tableau[i] ou tableau[i,:] renvoie la ligne numéro i. Accéder à une colonne : tableau[:,j] renvoie la colonne numéro j. Sous-tableau : tableau[a:b,c:d] renvoie le sous-tableau contenant les éléments entre les lignes a et b 1 et les colonnes c et d 1. Taille de la matrice : np.shape(m) renvoie (nombre de lignes, nombre de colonnes). Copie d un tableau : np.copy(tableau) Opérations terme à terme : A+B, A*B réalise la somme et le produit terme à terme. Pour le produit matriciel, utiliser np.dot(a,b) ou A.dot(B). Somme des éléments : np.sum(tableau) renvoie la somme de tous les éléments. np.sum(tableau,axis=0) renvoie un tableau avec la somme de chaque colonne. np.sum(tableau,axis=1) renvoie un tableau avec la somme de chaque ligne. Exemple. Le tableau suivant donne les résultats à un devoir de trois élèves. Question 1 2 3 4 5 6 7 8 9 10 Élève 1 2 5 8 1 4 9 0 3 7 6 Élève 2 4 1 0 2 5 3 7 9 6 8 Élève 3 2 8 3 9 1 7 6 0 4 5 Chaque question a été notée sur 10. On souhaite maintenant appliquer un coefficient à celles-ci pour obtenir la note sur 20. Voici la liste des coefficients. Question 1 2 3 4 5 6 7 8 9 10 Coefficient 0,2 0,1 0,25 0,2 0,15 0,3 0,2 0,1 0,2 0,3 Il s agit de calculer la note de chaque élève. import numpy as np notes=np.array([[2,5,8,1,4,9,0,3,7,6], [4,1,0,2,5,3,7,9,6,8], [2,8,3,9,1,7,6,0,4,5]]) coeffs=np.array([[0.2,0.1,0.25,0.2,0.15,0.3,0.2,0.1,0.2,0.3]]) 2
2 Images au format bitmap 2.1 Le format PBM Le format PBM (portable bitmap file format) est un format d images bitmap en noir et blanc. On peut très facilement définir une image au format PBM dans un fichier texte. Un tel fichier comprend : le préambule de l image dans lequel figurent : le nombre magique P1 : il indique le format (PBM ici). Il est suivi d un retour à la ligne ; la largeur de l image en pixels (en base 10) suivie d un espace ; la hauteur de l image en pixels (en base 10) suivie d un retour à la ligne. la trame de l image : celle-ci est décrite ligne par ligne, chaque pixel de la trame étant représenté par le caractère 0 (pour blanc) ou 1 (pour noir). Exemple. P1 # Un exemple bitmap de la lettre B 7 9 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 Remarque. Les espaces et les retours à la ligne figurant dans la trame ne sont pas pris en compte dans la construction de l image. On peut aussi faire des commentaires qui sont alors précédés d un # : ceux-ci ne seront pas, non plus, lus dans l image. Aucune ligne ne doit dépasser 70 caractères. 2.2 Le format PGM Le format PGM (portable graymap file format) est utilisé pour des images en niveaux de gris. La définition d une image au format PGM peut également se faire dans un fichier texte, qui contient : le préambule de l image dans lequel figurent : le nombre magique P2 indiquant le formet (ici PGM), suivi d un retour à la ligne ; la largeur de l image en pixels (en base 10) suivie d un espace ; la hauteur de l image en pixels (en base 10) suivie d un retour à la ligne ; la valeur maximale utilisée pour coder le gris (entre 0 et 255). la trame de l image : celle-ci est décrite ligne par ligne, chaque pixel de la trame étant représenté par un caractère compris entre 0 (pixel noir) et la valeur maximale précédemment indiquée (pixel blanc). Chaque niveau de gris est codé par une valeur entre ces deux extrêmes, proportionnellement à son intensité. Remarque. Le codage des différents pixels pouvant se faire à l aide de nombres s écrivant avec plus de deux chiffres, un caractère d espacement devra séparer deux valeurs de pixels. Les autres «particularités» du codage au format PBM restent valables en PGM : possibilité d écrire des commentaires, retour à la ligne non pris en compte, taille maximale d une ligne. 3
Exemple. P2 16 16 15 # niveaux de gris de 00( noir ) à 15( blanc ) 15 15 15 15 15 06 06 06 06 06 15 15 15 15 15 15 15 15 15 15 06 06 06 06 06 06 06 06 06 15 15 15 15 15 15 15 04 04 04 12 12 02 12 15 15 15 15 15 15 15 15 04 12 04 12 12 12 02 12 12 12 15 15 15 15 15 15 04 12 04 04 12 12 12 02 12 12 12 15 15 15 15 15 15 04 12 12 12 12 02 02 02 02 15 15 15 15 15 15 15 15 12 12 12 12 12 12 15 15 15 15 15 15 15 15 15 06 06 00 06 06 00 06 06 15 15 15 15 15 15 15 06 06 06 00 06 06 00 06 06 06 15 15 15 15 15 06 06 06 06 00 00 00 00 06 06 06 06 15 15 15 15 12 12 06 00 15 00 00 15 00 06 12 12 15 15 15 15 12 12 12 00 00 00 00 00 00 12 12 12 15 15 15 15 12 12 00 00 00 00 00 00 00 00 12 12 15 15 15 15 15 15 00 00 00 15 15 00 00 00 15 15 15 15 15 15 15 04 04 04 15 15 15 15 04 04 04 15 15 15 15 15 04 04 04 04 15 15 15 15 04 04 04 04 15 15 2.3 Format PPM Le format PPM (portable pixmap file format) est utilisé pour des images couleur. La définition d une image au format PPM se fait dans un fichier texte, qui contient : le préambule de l image dans lequel figurent : le nombre magique P3 indiquant le formet (ici PPM), suivi d un retour à la ligne ; la largeur de l image en pixels (en base 10) suivie d un espace ; la hauteur de l image en pixels (en base 10) suivie d un retour à la ligne ; la valeur maximale m utilisée pour coder les couleurs (entre 0 et 255). la trame de l image : celle-ci est décrite ligne par ligne, la couleur de chaque pixel est donnée en format RGB (rouge, vert, bleu) par trois nombres. Par exemple, 0 0 0 est un pixel noir, m 0 0 est un pixel rouge, 0 m 0 est un pixel vert, 0 0 m est un pixel bleu et m m m est un pixel blanc. 4
Exemple. P3 16 16 # taille de l image 255 # couleurs nuanc ées de 000 à 255 # ici, chaque ligne du fichier contient les informations de 4 pixels 255 255 255 255 000 000 255 000 000 255 000 000 255 000 000 255 000 000 255 255 255 255 255 255 255 000 000 255 000 000 255 000 000 255 000 000 255 000 000 255 000 000 255 000 000 255 000 000 255 000 000 255 255 255 255 255 255 255 255 255 070 035 000 070 035 000 070 035 000 254 203 125 254 203 125 000 000 000 254 203 125 255 255 255 255 255 255 255 255 255 255 255 255 070 035 000 254 203 125 070 035 000 254 203 125 254 203 125 254 203 125 000 000 000 254 203 125 254 203 125 254 203 125 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 070 035 000 254 203 125 070 035 000 070 035 000 254 203 125 254 203 125 254 203 125 070 035 000 254 203 125 070 035 000 254 203 125 254 203 125 254 203 125 254 203 125 070 035 000 070 035 000 070 035 000 070 035 000 255 255 255 255 255 255 255 255 255 255 255 255 254 203 125 254 203 125 254 203 125 254 203 125 254 203 125 254 203 125 255 255 255 255 000 000 255 000 000 000 000 255 255 000 000 255 000 000 000 000 255 255 000 000 255 000 000 255 255 255 255 255 255 255 255 255 255 000 000 255 000 000 255 000 000 000 000 255 255 000 000 255 000 000 000 000 255 255 000 000 255 000 000 255 000 000 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 000 000 255 000 000 255 000 000 255 000 000 000 000 255 000 000 255 000 000 255 000 000 255 255 000 000 255 000 000 255 000 000 255 000 000 255 255 255 255 255 255 255 255 255 255 255 255 254 203 125 254 203 125 255 000 000 000 000 255 255 194 014 000 000 255 000 000 255 255 194 014 000 000 255 255 000 000 255 255 255 255 255 255 254 203 125 254 203 125 254 203 125 000 000 255 000 000 255 000 000 255 000 000 255 000 000 255 000 000 255 254 203 125 255 255 255 255 255 255 254 203 125 254 203 125 000 000 255 000 000 255 000 000 255 000 000 255 000 000 255 000 000 255 000 000 255 000 000 255 000 000 255 000 000 255 000 000 255 255 255 255 255 255 255 000 000 255 000 000 255 000 000 255 255 255 255 255 255 255 255 255 255 070 035 000 070 035 000 070 035 000 255 255 255 255 255 255 255 255 255 255 255 255 070 035 000 070 035 000 070 035 000 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 070 035 000 070 035 000 070 035 000 070 035 000 255 255 255 255 255 255 255 255 255 255 255 255 070 035 000 070 035 000 070 035 000 070 035 000 255 255 255 255 255 255 5
3 Exercices d application (début du TP8) 1. Négatif d une image : À l aide de python (a) Ouvrir le fichier cercle.pbm en mode lecture. (b) Créer un nouveau fichier cercle_negatif.pbm dans lequel les pixels noirs seront devenus blancs et inversement. (c) Ouvrir la nouvelle image directement pour vérifier le résultat. 2. Définir un dégradé : À l aide de python (a) Créer un fichier degradé.pgm (b) Compléter le fichier pour qu il affiche un carré de 256 pixels de côté, chaque ligne étant d un niveau de gris variant progressivement (de 0 à 255). (c) Ouvrir l image directement pour vérifier le résultat. 3. Agrandir une image : comment pourrait-on créer l image de Mario (en noir et blanc) en 400x400 pixels (chaque pixel devvenant donc un carré de 25x25)? 6