Les bases de Python 3 : Matplotlib

Ce tutoriel présente matplotlib, une bibliothèque Python permettant de tracer des tableaux numpy sous forme d’images. Nous apprendrons à :

Suivez les instructions ci-dessous pour télécharger le tutoriel et l’ouvrir dans l’Environnement de test.

Télécharger le cahier d’exercices

Télécharger le carnet de notes du didacticiel Python basics 3

Téléchargez le fichier image de l’exercice

Pour visualiser ce notebook sur l’Environnement de test, vous devrez d’abord télécharger le notebook et l’image sur votre ordinateur, puis les télécharger tous les deux sur l’Environnement de test. Assurez-vous d’avoir suivi les prérequis de configuration listés dans Python basics 1 : Jupyter, puis suivez ces instructions :

  1. Téléchargez le carnet de notes en cliquant sur le premier lien ci-dessus. Téléchargez l’image en cliquant sur le deuxième lien ci-dessus.

  2. Dans l’Environnement de test, ouvrez le dossier Training.

  3. Cliquez sur le bouton Transférer les fichiers comme indiqué ci-dessous.

Bouton de téléchargement.

  1. Sélectionnez le notebook téléchargé à l’aide du navigateur de fichiers. Cliquez sur OK.

  2. Répétez l’opération pour télécharger le fichier image dans le dossier Training. Le téléchargement peut prendre un certain temps.

  3. Les deux fichiers apparaîtront dans le dossier Training. Double-cliquez sur le cahier de formation pour l’ouvrir et commencer le tutoriel.

Vous pouvez maintenant utiliser le cahier d’exercices comme une version interactive de cette page Web.

Note

Le cahier d’exercices devrait ressembler au texte et au code ci-dessous. Cependant, les sorties du cahier d’exercices sont vides (c’est-à-dire qu’aucun résultat n’apparaît après les cellules de code). Suivez les instructions du cahier pour exécuter les cellules du cahier d’exercices. Reportez-vous à cette page pour vérifier que vos résultats sont similaires.

Introduction à pyplot de matplotlib

Nous allons utiliser une partie de matplotlib appelée pyplot. Nous pouvons importer pyplot en spécifiant qu’il vient de matplotlib. Nous abrégerons pyplot en plt.

[1]:
%matplotlib inline
# Generates plots in the same page instead of opening a new window

import numpy as np
from matplotlib import pyplot as plt

Les images sont des tableaux bidimensionnels contenant des pixels. Par conséquent, nous pouvons utiliser des tableaux bidimensionnels pour représenter des données d’image et les visualiser avec matplotlib.

Dans l’exemple ci-dessous, nous allons utiliser la fonction numpy arange pour générer un tableau à 1 dimension rempli d’éléments de 0 à 99, et ensuite le remodeler en un tableau à 2 dimensions en utilisant reshape.

[2]:
arr = np.arange(100).reshape(10,10)

print(arr)

plt.imshow(arr)
[[ 0  1  2  3  4  5  6  7  8  9]
 [10 11 12 13 14 15 16 17 18 19]
 [20 21 22 23 24 25 26 27 28 29]
 [30 31 32 33 34 35 36 37 38 39]
 [40 41 42 43 44 45 46 47 48 49]
 [50 51 52 53 54 55 56 57 58 59]
 [60 61 62 63 64 65 66 67 68 69]
 [70 71 72 73 74 75 76 77 78 79]
 [80 81 82 83 84 85 86 87 88 89]
 [90 91 92 93 94 95 96 97 98 99]]
[2]:
<matplotlib.image.AxesImage at 0x7f33279840f0>
../_images/python_basics_03_matplotlib_10_2.png

Si vous vous souvenez du dernier tutoriel, nous étions capables d’adresser des régions d’un tableau numpy en utilisant la notation d’indexation par crochets [ ]. Pour les tableaux multidimensionnels, nous pouvons utiliser une virgule , pour distinguer les axes.

[ first dimension, second dimension, third dimension, etc. ]

Comme précédemment, nous utilisons les deux-points : pour désigner [ start : end : stride ]. Nous pouvons le faire pour chaque dimension.

Par exemple, nous pouvons mettre à jour les valeurs de la partie gauche de ce tableau pour qu’elles soient égales à 1.

[3]:
arr = np.arange(100).reshape(10,10)
arr[:, :5] = 1

plt.imshow(arr)
[3]:
<matplotlib.image.AxesImage at 0x7f33274d7198>
../_images/python_basics_03_matplotlib_12_1.png

Les indices entre les crochets de arr[ :, :5] peuvent être décomposés comme suit :

[ 1st dimension start : 1st dimension end, 2nd dimension start : 2nd dimension end ]

Les dimensions sont séparées par la virgule ,. Notre première dimension est l’axe vertical, et la deuxième dimension est l’axe horizontal. Leurs étendues sont marquées par les deux points :. Par conséquent :

[ Vertical start : Vertical end, Horizontal start : Horizontal end ]

Si aucun index n’est saisi, le tableau prendra toutes les valeurs. Cela signifie que [ :, :5] donne :

[ Vertical start : Vertical end, Horizontal start : Horizontal start + 5 ]

L’index du tableau a donc sélectionné les 5 premiers pixels de la largeur, à toutes les valeurs verticales.

Voyons maintenant à quoi cela ressemble sur une image réelle.

Tip : Assurez-vous d’avoir téléchargé le fichier Guinea_Bissau.JPG dans votre dossier Training avec le cahier d’exercices. Nous utiliserons ce fichier dans les prochaines étapes et exercices.

Nous pouvons utiliser la bibliothèque pyplot pour charger une image en utilisant la fonction matplotlib imread. imread lit un fichier image sous la forme d’un tableau numpy tridimensionnel. Cela permet de manipuler facilement le tableau.

Par convention, la première dimension correspond à l’axe vertical, la deuxième à l’axe horizontal et la troisième aux canaux rouge, vert et bleu de l’image. Par convention, les canaux rouge-vert-bleu prennent des valeurs comprises entre 0 et 255.

[4]:
im = np.copy(plt.imread('Guinea_Bissau.JPG'))

# This file path (red text) indicates 'Guinea_Bissau.JPG' is in the
# same folder as the tutorial notebook. If you have moved or
# renamed the file, the file path must be edited to match.

im.shape
[4]:
(590, 602, 3)

Guinea_Bissau.JPG est une image de Rio Baboque en Guinée-Bissau en 2018. Elle a été générée à partir des données du satellite Landsat 8.

Les résultats de la cellule ci-dessus montrent que l’image a une hauteur de 590 pixels, une largeur de 602 pixels et qu’elle possède 3 canaux. Ces trois canaux sont le rouge, le vert et le bleu (dans cet ordre).

Affichons cette image en utilisant la fonction pyplot imshow.

[5]:
plt.imshow(im)
[5]:
<matplotlib.image.AxesImage at 0x7f33273bb400>
../_images/python_basics_03_matplotlib_21_1.png

Exercices

3.1 Utilisons la fonctionnalité d’indexation de numpy pour sélectionner une partie de cette image. Sélectionnez le coin supérieur droit de cette image avec la forme (200,200).

Introduction: Rappelez-vous qu’il y a trois dimensions dans cette image. Les deux points séparent les portées, et les virgules les dimensions.

[ ]:
# We already defined im above, but if you have not,
# you can un-comment and run the next line

# im = np.copy(plt.imread('Guinea_Bissau.JPG'))

# Fill in the question marks with the correct indexes

topright = im[?,?,?]

# Plot your result using imshow

plt.imshow(topright)

Si vous avez choisi le bon coin, il ne devrait pas y avoir beaucoup d’eau !

3.2 Regardons l’un des pixels de cette image. Nous choisissons le coin supérieur gauche avec la position (0,0) et montrons les valeurs de ses canaux RVB.

[ ]:
# Run this cell to see the colour channel values

im[0,0]

La première valeur correspond à la composante rouge, la deuxième à la composante verte et la troisième à la composante bleue. uint8 peut contenir des valeurs dans la plage [0-255] donc le pixel a beaucoup de rouge, un peu de vert, et peu de bleu. Ce pixel est d’une couleur sableuse jaune orangé.

Maintenant, nous allons modifier l’image.

Que se passe-t-il si nous fixons toutes les valeurs représentant le canal bleu à la valeur maximale ?

[ ]:
# Run this cell to set all blue channel values to 255
# We first make a copy to avoid modifying the original image

im2 = np.copy(im)

im2[:,:,2] = 255

plt.imshow(im2)

La notation de l’index [ :,:,2] sélectionne les pixels de toutes les hauteurs et de toutes les largeurs, mais uniquement le troisième canal de couleur.

Pouvez-vous modifier la cellule de code ci-dessus pour fixer toutes les valeurs rouges à la valeur maximale de 255 ?

Conclusion

Nous avons pratiqué avec succès l’indexation de tableaux numpy et le traçage de ces tableaux à l’aide de matplotlib. Nous pouvons maintenant aussi lire un fichier dans Python en utilisant pyplot.imread. La prochaine leçon couvre le nettoyage et le masquage des données.