Aller au contenu

TP Image numérique⚓︎

1. Tableau de pixels⚓︎

Les caractéristiques d'une image

Une image numérique se présente sous la forme d’un quadrillage - ou d'un tableau - dont chaque case est un pixel d’une couleur donnée. On peut donc repérer chaque pixel par sa ligne et sa colonne dans ce tableau (ou à l'aide de coordonnées en partant du coin en haut à gauche1).

La définition de l’image est le nombre total de pixels qui la composent. Celle-ci n’est pas forcément égale à la définition du capteur.

On l'obtient donc en multipliant sa largeur par sa hauteur. Par exemple, une image de 1920 pixels de largeur sur 1080 pixels de hauteur a une définition de 1920 x 1080 = 2073600 pixels soit à peu près 2 millions de pixels.

La résolution de l’image, c’est-à-dire le nombre de pixels par unité de longueur, détermine sa qualité à l’impression ou sur un écran.

Par exemple, la résolution standard pour affichage sur le web est de 72 ppp (pixels par pouce) alors qu'une résolution de 300 ppp est recommandée pour l'impression.

Le codage des pixels (couleurs)

Chaque pixel correspond à un triplet de trois nombres entiers, soit les valeurs de rouge (Red), de vert (Green) et de bleu (Blue) afin de reconstituer la couleur. Chaque valeur est codée sur un octet, soit entre 0 et 255 (ou en pourcentages, ou en hexadécimal, voir ici). On parle de code RGB (RVB in french).

À noter:

  • une couleur dont les 3 composantes sont identiques correspond à un niveau de gris;
  • selon les formats, une quatrième composante peut s'ajouter: le canal alpha. Cette valeur (sur un octet également) indique le niveau de transparence du pixel.

Sites incontournables

Pour visualiser les couleurs au format RGB, et convertir en hexadécimal :

2. Les modules⚓︎

Pour manipuler les images, nous allons avoir besoin du module imageio. Ce module nécessite d'utiliser également le module numpy pour créer des tableaux d'entiers non signés sur 8 bits (un octet).

imageio

  • Ouvrir et charger une image existante (ada.png par exemple) dans une variable (img par exemple):
img = imageio.imread("ada.png")

Accès à l'image

L'image doit être dans le dossier courant de travail, a fortiori le même que le fichier .py. Si ce n'est pas le cas, il faudra le modifier.

  • La taille de l'image est accessible dans le triplet (hauteur, largeur, nombre de composantes) donné par:
img.shape
  • Lire/modifier un pixel: il s'agit tout simplement de travailler sur le tableau, par indices et par réaffectation.
print(img[2][10])       # pour afficher le pixel ligne 2, colonne 10
img[2][10] = [0, 0, 0]  # pour le mettre en noir
  • Sauvegarder une image contenue dans une variable img:
imageio.imsave("monimage.png", img)

numpy

Le module numpy est un module de calcul scientifique orienté vers les matrices, qui sont des objets mathématiques bien pratiques... En gros ce sont des tableaux. On se servira uniquement de ce module pour créer des tableaux vides, au format que le module imageio exige pour pouvoir ensuite sauvegarder l'image (et donc la visualiser).

On utilise la fonction zeros du module numpy qui prend en paramètres un triplet (hauteur, largeur, nombre de composantes) et le type des valeurs, ici donc des entiers non signés sur 8 bits.

Par exemple pour une image de 100 pixels (de haut) sur 256 pixels (de large), avec 3 composantes (pas de canal alpha):

img_vide = numpy.zeros([100,256,3], dtype=np.uint8)

3. Exercices⚓︎

Exercice 1

  1. Télécharger l'image ada.png ci-dessus (simple clic-gauche), puis la charger dans un programme avec le module imageio.
  2. Trouver ses dimensions et son nombre de composantes.
  3. Faire un crime de lèse-majesté et tracer une ligne horizontale rouge au niveau du front.

Exercice 2

De combien de pixels (non verts) ce dessin de Pikachu est-il composé?

Exercice 3

Cette image est-elle vraiment composée de pixels tous noirs?

Exercice 4

Incruster Vincent Vega (John Travolta) devant le lycée.

Si vous avez le temps, essayez d'incruster Pikachu... Ou Vincent Vega sur une image de votre choix, de plus grande définition que celle-ci.


  1. en fait cela dépend de l'outil (module) utilisé pour lire et écrire des images.