Images numériques Qu'est-ce qu'un fichier image ? Les couleurs primaires Nous avons tous entendu parlé des trois couleurs primaires, dites soustractives, qui en fonction des mélanges peuvent donner toutes les autres teintes. On parle de "soustraction" car la lumière arrivant dessus, une partie de celle-ci est absorbée par la matière colorée.
Cependant les écrans d'ordinateur sont composées de pixels qui émettent de la lumière. On n'a alors besoin là aussi que de trois couleurs primaires, dites additives, pour obtenir toutes les teintes. Les couleurs primaires additives sont le rouge, le vert et le bleu. C'est pour cela qu'au sein d'un pixel se trouve trois leds pouvant émettre diverses intensité de chacune de ces couleurs.
Red 50
Green 50
Blue 50
Les images en informatique Lorsqu'une image s'affiche sur un écran d'ordinateur c'est en fait un grand nombre de pixels qui prennent chacun une certaine couleur au sein d'un rectangle.
Ainsi, pour afficher une image de 100px de large par 100px de haut, l'ordinateur à besoin d'avoir trois informations pour chacun de ces 10 000 pixels. Chacune des ces informations représente le degré de rouge, de vert et de bleu. Généralement, le nombre associé à ce degré est un octet, donc compris entre 0 et 255. Ainsi on a besoin de 24 bits par pixel, soit un total de 24 000 bits pour cette image, ce qui converti donne approximativement 23,44 Kio. Voici trois images, chacune de dimension 200px×200px :
Enregistrer chacune de ces images sur votre ordinateur et regarder leur taille. Comment expliquer ces différences ? 1 -- Vocabulaire Les différents formats Tout fichier image ne contient pas seulement les bits nécessaires pour éclairer les pixels, mais également des données d'entête qui permettent par exemple de sauvegarder sa signature (pour connaître son format), sa taille, le taux de compression, la date de création, les coordonnées GPS etc.
Comme nous avons pu l'apercevoir dans l'exercice précédent, il existe plusieurs formats de fichiers images. Nous allons décrire ici les plus utilisés. Les différents formats de fichiers précédents font partie de la famille des images matricielles : c'est-à-dire que l'image est représentée par un tableau de nombres.
Il existe cependant un autre type de format de fichier image, le vectoriel. Sous ce format l'image est créée à partir d'équations mathématiques, et chaque forme dépend des paramètres hauteur, largeur et rayon donnés à des vecteurs. À l'inverse de l'image matricielle composée de pixels, l'image vectorielle peut être redimensionnée sans pour autant perdre en qualité. Manipulation en Python Il existe plusieurs bibliothèques Python permettant de travailler avec des fichiers images. Nous devrons pour cela importer certains modules dont l'intérêt principal pour nous sera de transformer une image dans un certain type de tableau, ou de transformer ce type de tableau en image.
Pour ceux qui voudront travailler sur leur propre PC, il faudra tout d'abord enregistrer dans un répertoire prévu à cet effet l'image ci-dessous :

Le code de base ressemblera à : import matplotlib.image as mpimg import matplotlib.pyplot as plt import numpy as np js_image = mpimg.imread('nuages.png') On importera les modules matplotlib et numpy en donnant un nom « raccourci » à certaines de leurs fonctions.
On importera la « matrice » associée à notre image dans le tableau js_image. En utilisation l'instruction : print(js_image) on voit que ce tableau est de la forme :
[[[0.2901961  0.28627452 0.4509804 ]
  [0.2901961  0.28627452 0.4509804 ]
  [0.2901961  0.28627452 0.4509804 ]
  ...
  [0.31764707 0.25490198 0.36862746]
  [0.31764707 0.25490198 0.36862746]
  [0.31764707 0.25490198 0.36862746]]

 [[0.28627452 0.28235295 0.44705883]
  [0.2901961  0.28627452 0.4509804 ]
  [0.2901961  0.28627452 0.4509804 ]
  ...
  [0.31764707 0.25490198 0.36862746]
  [0.31764707 0.25490198 0.36862746]
  [0.31764707 0.25490198 0.36862746]]

 [[0.28627452 0.28235295 0.44705883]
  [0.28627452 0.28235295 0.44705883]
  [0.28627452 0.28235295 0.44705883]
  ...
  [0.31764707 0.25490198 0.36862746]
  [0.31764707 0.25490198 0.36862746]
  [0.31764707 0.25490198 0.36862746]]

 ...

 [[0.92156863 0.67058825 0.48235294]
  [0.92156863 0.67058825 0.48235294]
  [0.92156863 0.67058825 0.48235294]
  ...
  [0.8901961  0.5921569  0.39607844]
  [0.89411765 0.5882353  0.39607844]
  [0.8901961  0.5921569  0.39607844]]

 [[0.92156863 0.67058825 0.48235294]
  [0.92156863 0.67058825 0.48235294]
  [0.92156863 0.67058825 0.48235294]
  ...
  [0.8901961  0.5921569  0.39607844]
  [0.8862745  0.5882353  0.39215687]
  [0.8862745  0.5882353  0.39215687]]

 [[0.9254902  0.6745098  0.4862745 ]
  [0.9254902  0.6745098  0.4862745 ]
  [0.92156863 0.67058825 0.48235294]
  ...
  [0.8862745  0.5882353  0.39215687]
  [0.88235295 0.58431375 0.3882353 ]
  [0.88235295 0.58431375 0.3882353 ]]]

En utilisant : print(js_image[0]) on obtient :
[[0.2901961  0.28627452 0.4509804 ]
 [0.2901961  0.28627452 0.4509804 ]
 [0.2901961  0.28627452 0.4509804 ]
 ...
 [0.31764707 0.25490198 0.36862746]
 [0.31764707 0.25490198 0.36862746]
 [0.31764707 0.25490198 0.36862746]]
Ce qui veut dire que chaque élément de notre tableau est un tableau composé de plusieurs tableaux dont les éléments sont à leur tour des tableaux de trois nombres. L'instruction : print(js_image[0][0]) donne :
[0.2901961  0.28627452 0.4509804 ]
Le premier pixel en haut à gauche de l'image a donc sa led rouge éclairée à $29\,\%$, sa verte à $28,6\,\%$ et sa bleue à $45,1\,\%$.

Il est important par ailleurs de connaître la taille de chacun de ces tableaux. Pour cela on peut entrer les instructions suivantes qui affichent 1131 et 1920. import matplotlib.image as mpimg import matplotlib.pyplot as plt import numpy as np js_image = mpimg.imread('nuages.png') n = len(js_image) m = len(js_image[0]) print(n) print(m) Notre image initiale a donc une dimension de 1920 pixels à l'horizontale et 1131 pixels à la verticale (n renvoie le nombres le lignes et m celui de colonnes).
Nous allons utiliser ce tableau pour créer une nouvelle image à partir d'un autre tableau de même dimension.
Notre tableau js_image est en fait un tableau de type numpy composé de $n\times m$ éléments de la forme [r,g,b] où r,g et b sont des nombres compris entre 0 et 1 symbolisant l'intensité du rouge, du vert et du bleu au niveau des pixels. Ces nombres sont ici codés sur 32 bits.
Pour créer une nouvelle image à partir d'un nouveau tableau, il faudra donc dans un premier temps déclarer un tableau du type numpy dont le type de données est encodé en 32 bits. L'instruction correspondante est : new_image = np.zeros((n, m, 3), dtype=np.float32) Ouvrir le lien. Ouvrir le lien. Ouvrir le lien. Ouvrir le lien. Ouvrir le lien.