Activité 1 :

Les images numériques

Presque comme Snapchat !

Les réseaux sociaux tels que Snapchat proposent des filtres permettant entre autre de modifier les visages en y ajoutant des accessoires ou des effets. Comment peut-on faire ce type de traitements en utilisant le langage Python ?


I. Comprendre les images numériques

Que se passe-t-il si on zoome sur une image ? Les points qui composent une image sont appelés pixels. On dit que l’image est matricielle car en mathématiques une matrice désigne un tableau de nombres.

Remarque : On parle aussi de « carte de points » (de l'anglais « bitmap »)

Le principe physique

Voici l'agrandissement de l'image d'un écran LCD (Liquid Cristal Display). On peut distinguer les pixels qui la composent. Si on agrandit encore l’image, on peut voir que chaque pixel est subdivisé en 3 rectangles (un rouge, un vert et un bleu) : ce sont les sous-pixels (ou luminophores).

L’œil et le cerveau réalisent une synthèse additive des couleurs. Toute lumière colorée peut être reproduite en superposant, dans certaines proportions, trois faisceaux lumineux de couleurs rouge, verte et bleue (nos yeux ne sont sensibles qu’à ces trois couleurs).

Codage des couleurs

Chaque pixel est codé par trois valeurs, une pour la composante rouge, une autre pour la composante verte et une troisième pour la composante bleue. On parle de code RVB. Chacune de ces trois couleurs peut prendre 256 valeurs différentes (de 0 à 255).

Pour pouvoir coder un nombre jusqu'à la valeur 255, il faut 8 bits soit un octet. L'octet 00000000 correspond à la valeur décimale 0 tandis que l'octet 11111111 correspond à la valeur décimale 255. Ainsi pour coder les trois couleurs d'un pixel, il faut 3 octets soit 24 bits.


Voir l'application en ligne : http://www.proftnj.com/RGB3.htm


II. Traiter les images avec le langage Python

Ouverture et définition de l'image

Description des lignes du programme ci-dessus :

  • Ligne 1 : Importe la bibliothèque PIL (ou Pillow) permettant de traiter les images.

  • Ligne 2 : Ouvre le fichier image "sernin.jpg" et l'affecte à la variable img.

  • Ligne 3 : Crée les variables dont le nom est assez explicite : largeur et hauteur.

  • Ligne 4 et 5 : Affiche du texte dans la console (partie sombre de l'éditeur).

À vous de jouer :

  1. Cliquer sur RUN (bouton vert en haut de l'éditeur) pour observer le résultat.

  2. Modifier le code pour afficher les dimensions de l'autre image disponible nommée "chat.jpg". (Il est possible de visualiser les fichiers disponibles en cliquant sur l'icône "Files" en haut à gauche de l'éditeur.)

  3. La définition de l'image est le nombre de pixels qui la compose. Modifier le code afin de calculer la définition de l'image.

Modification des pixels de l'image

En python, le pixel de coordonnée (0, 0) est en haut à gauche.

Description des lignes du programme ci-dessus :

  • Ligne 1 : Importe la bibliothèque PIL (ou Pillow) permettant de traiter les images.

  • Ligne 2 : Ouvre le fichier image "couleur.png" et l'affecte à la variable img.

  • Ligne 3 : Extraction des valeurs des trois composantes du pixel (0, 0) soit le pixel de la 1re colonne et de la 1re ligne.

  • Ligne 4 : Affiche le résultat dans la console.

À vous de jouer :

  1. Vérifier que le pixel de coordonnée (0, 0) est bien en haut à gauche.

  2. Modifier le code afin de retrouver le code RVB des 5 autres zones de couleurs de l'image.

couleur.png

image de 30x30 pixels

Description des lignes du programme ci-dessus :

  • Ligne 4 : Création d'une image en mode RVB (RGB en anglais) de 200 pixels de largeur et 100 pixels de hauteur.

  • Ligne 7 : Pour y allant de 0 à 99 (=hauteur). C'est une boucle FOR permettant un balayage de toutes les lignes de l'image.

  • Ligne 8 : Pour x allant de 0 à 199 (=largeur). C'est une boucle FOR permettant un balayage de toutes les colonnes de l'image.

  • Les deux boucles sont imbriquées l'une dans l'autre permettant de balayer tous les pixels de l'image.

  • Ligne 9 : Coloration du pixel de coordonnée (x, y) avec les valeurs RVB (255, 0, 0).

À vous de jouer :

  1. Modifier le code pour créer une image bleue.

  2. Modifier le code pour créer une image jaune.

  3. Modifier le code pour colorer en rouge seulement la moitié supérieure de l'image. (Pour obtenir la division entière d'un nombre en python, il faut utiliser le double-slash //)

Application : Conversion en niveaux de gris

Une technique pour convertir une image en niveau de gris est de réaliser la moyenne des trois composantes RVB du pixel et d'affecter cette moyenne aux trois composantes RVB.

Attention : Les composantes doivent être des nombres entiers. Pour cela il y a toujours le double-slash // pour réaliser la division entière ou bien la fonction int() qui renvoie la partie entière de ce qui lui ait donné en argument.


À vous de jouer :

  1. Modifier les lignes 7, 8 et 9 du code ci-dessous afin de convertir l'image colorée en image en niveau de gris.

  2. Modifier les lignes 7, 8 et 9 du code ci-dessous pour réaliser d'autres effets sur l'image.

Application : Presque comme Snapchat !

Pour faire presque comme Snapchat, programmer son propre filtre Snapchat permettant d'ajouter une auréole sur la tête du chat.

Pour cela il faut :

  • ouvrir les deux images "aureole.jpg" et "chat.jpg". Ces deux images ont la même définition de 300x366 pixels.

  • copier les 61 premières lignes de pixels de l'image aureole.jpg (soit 1/6 de sa hauteur) sur l'image chat.jpg.

Remarque : Il est possible de visualiser les fichiers mis à disposition dans l'éditeur ci-dessous en cliquant sur l'icône "Files" située en haut à gauche.


À vous de jouer :

III. Comment les images sont-elles capturées ?

Le capteur de l'appareil photo

Les appareils photo numérique sont équipés de capteurs photographiques composés d’une matrice d’éléments qui réagissent à la quantité de lumière qu’ils reçoivent. Ce sont les photosites.

Le filtre de Bayer fait en sorte qu’un photosite ne reçoive qu’une seule couleur primaire. Il y a deux fois plus de photosites exposés au vert pour être adapté à l'œil humain qui est plus sensibles au vert qu’au rouge ou au bleu.

Le capteur est recouvert d'un filtre de Bayer.

Les photosites

Lorsqu’on photographie un rectangle blanc tous les photosites sont activés.

Pour un rectangle vert seuls les photosites sensibles au vert sont activés.

Pour un rectangle rouge seuls ceux sensibles au rouge sont activés.

Pour un bleu seuls les bleus sont activés.

Photosite ≠ Pixel

Un photosite ne correspond pas à un pixel car il ne contient l’information que d'une seule couleur (Rouge ou Verte ou Bleue) alors qu'un pixel est codé avec trois valeurs. Le processeur d'image traite les données des photosites pour compléter l'image. En effet, pour chaque photosite, deux canaux colorés sont manquants. Une des techniques utilisées est de calculer la moyenne des valeurs obtenues par les photosites adjacents pour extrapoler les valeurs des deux canaux manquants.

En utilisant les informations des photosites rouges et bleus à proximité d’un photosite vert, le processeur compose un pixel, avec ses trois couleurs. L'image brute ainsi obtenue en sortie du capteur est souvent au format RAW.

En lumière faible, il est souvent nécessaire d'utiliser plus de photosites pour recomposer un seul pixel ce qui conduit à une perte de définition de l'image.

Détermination des valeurs R0, V0 et B0 du pixel central à partir des valeurs adjacentes.