• 10 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 17/12/2019

Apprenez à représenter et afficher des images en langage Python

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Pour la mise en pratique, nous utiliserons le langage Python qui permet une écriture aisée de la gestion d’images numériques, en s’appuyant sur les opérations très utiles des bibliothèques complémentaires comme OpenCV, Numpy et Matplotlib.

Chargez une matrice de pixels

Nous allons faire nos premiers essais avec la photo de Lena (renommée Lenna par les Américains), qui est un classique historique des chercheurs en traitement d’images (téléchargeable sur la page https://en.wikipedia.org/wiki/Lenna et à enregistrer sous le nom  Lena.png).

Tapez le programme suivant, et exécutez-le dans votre environnement Python.

import cv2 as cv
matrice = cv.imread("Lena.png") # charge le fichier dans une matrice de pixels couleur
print(matrice.shape) # affiche les dimensions de la matrice
print(matrice[0,0]) # accède à la valeur du premier pixel

Il doit s’afficher :

(512, 512, 3)

[125 137 226]

En effet, l’image chargée par la fonction  imread  fait 512 lignes sur 512 colonnes, avec chaque pixel stocké sur 3 octets (car c’est une image couleur, en triplets RVB). Ensuite s’affiche la valeur du pixel de la ligne 0 colonne 0 qui est le triplet [125 137 226].

Pour convertir l’image couleur précédente en matrice de pixels en niveaux de gris, on peut ajouter les instructions suivantes :

matG = cv.cvtColor(matrice, cv2.COLOR_BGR2GRAY) # conversion des triplets BVR en gris
print(matG.shape)
print(matG[0,0])

Cette fois, il s’affiche :

(512, 512)

162

La nouvelle matrice fait aussi 512 lignes par 512 colonnes, mais sur de simples octets. Et la couleur RVB du pixel a été convertie en 162, qui correspond à la luminance (cf. formule de la composante Y dans l’espace des couleurs YUV vu précédemment).

matG = cv.imread("Lena.png", 0) # charge le fichier dans une matrice de pixels gris

Enregistrez une matrice de pixels

cv.imwrite("resultat.jpg", matG) # enregistre la matrice dans un fichier du nom indiqué

Cet appel de fonction  imwrite  enregistre un fichier contenant la matrice de pixels, selon le type de matrice (niveaux de gris, ou couleurs) et selon le format indiqué par le nom choisi (ici PNG, mais on pourrait aussi choisir JPEG en terminant le nom du fichier par .jpg).

Visualisez une matrice de pixels

Il serait possible de visualiser l’image enregistrée grâce à un logiciel de traitement d’images (par exemple GIMP qui est un logiciel gratuit de retouche d’images, très réputé, appartenant à la famille des logiciels libres).

Il est cependant aussi possible d’afficher plus sommairement les images directement depuis le programme Python.

cv.imshow("Image de matG", matG) # fenêtre visualisant la matrice et le titre indiqué
cv.waitKey(0) # attend l’appui sur une touche du clavier
cv.destroyAllWindows() # efface toutes les fenêtres ouvertes par imshow

Cet affichage permis par la bibliothèque OpenCV est très sommaire.

Mais il existe dans la bibliothèque Matplotlib une autre fonction d’affichage plus évoluée :

  • Elle dispose d’une loupe si on veut analyser des détails ;

  • Elle attend qu’on ait cliqué sur la fermeture de la fenêtre de visualisation d’image pour continuer la suite du programme.

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
matrice = cv.imread("Lena.png") # charge le fichier dans une matrice de pixels couleur
plt.imshow(matrice[..., ::-1]) # affiche la matrice de triplets RVB
plt.show() # ouvre la fenêtre d’affichage et attend la fin de l’interaction utilisateur

Quelques remarques sur l’affichage par  plt.imshow()  :

plt.imshow(cv.cvtColor(matrice, cv.COLOR_BGR2RGB)) # affiche la matrice de triplets RVB
matG = cv.imread("Lena.png", 0) # charge le fichier dans une matrice de pixels gris
plt.imshow(matG, cmap = 'gray') # affiche la matrice de niveaux de gris
plt.show() # ouvre la fenêtre d’affichage et attend la fin de l’interaction utilisateur

Modifiez une matrice de pixels

Exemple 1 :

Ajoutons une ligne verticale blanche (en colonne 100) sur une image :

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
image = cv.imread("Lena.png") # charge le fichier dans une matrice de pixels couleur
for i in range(0,image.shape[0]): # pour toutes les lignes i de l’image
image[i,100] = [255, 255, 255] # insère du blanc en ligne i colonne 100
plt.imshow(image[..., ::-1])
plt.show()

Exemple 2 :

Modifions les composantes couleurs d’une image : le quart supérieur gauche du haut effacera la première composante de chaque triplet, le quart supérieur droit du haut effacera la deuxième composante de chaque triplet, le quart inférieur gauche du bas effacera la troisième composante, et le quart inférieur droit de l’image restera intact tel quel.

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
image = cv.imread("Lena.png") # charge le fichier dans une matrice de pixels couleur
for i in range(0, image.shape[0]//2): # // est la division entire par 2
for j in range(0, image.shape[1]//2):
image[i,j,0] = 0 # efface la 1re composante, bleue, du triplet BVR
plt.imshow(image[..., ::-1])
plt.show()
for i in range(0, image.shape[0]//2):
for j in range(image.shape[1]//2, image.shape[1]):
image[i,j,1] = 0 # efface la 2e composant, verte, du triplet BVR
plt.imshow(image[..., ::-1])
plt.show()
for i in range(image.shape[0]//2, image.shape[0]):
for j in range(0, image.shape[1]//2):
image[i,j,2] = 0 # efface la 3e composante, rouge, du triplet BVR
plt.imshow(image[..., ::-1])
plt.show()

On constate sur le résultat que les couleurs de la photo originale de Lena contenaient essentiellement des mélanges de rouge et de vert (et très peu de bleu) car :

  • La suppression de la composante bleue ne change pas beaucoup les couleurs ;

  • La suppression du vert fait apparaître une dominante de rouge ;

  • La suppression du rouge faire apparaître une dominante de vert.

Exemple 3 :

Passons d’une photo noir et blanc à son négatif.

Cette opération, dite d’inverse vidéo, renverse l’ordre des niveaux de gris de l’image (le noir devient blanc, le blanc devient noir, etc.).

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
image = cv.imread("Lena.png", 0) # charge le fichier dans une matrice de pixels gris
image = 255 - image
plt.imshow(image, cmap = 'gray')
plt.show()

Exemple de certificat de réussite
Exemple de certificat de réussite