Géométrie de l’espace des couleurs

Au programme de SNT, on peut lire parmi les capacités attendues :

Traiter par programme une image pour la transformer en agissant sur les trois composantes de ses points.

Or puisque les points (pixels en fait) d’une photo ont trois composantes, c’est que les couleurs sont placées dans un espace de dimension 3, en prenant

  • pour abscisse le niveau de rouge (de 0 à 255),
  • pour ordonnée le niveau de vert (de 0 à 255),
  • pour hauteur le niveau de bleu (de 0 à 255).

Changer les couleurs d’une photo (par exemple pour la désaturer) peut donc se faire par des transformations de l’espace de dimension 3. Bouger des points (y compris par des rotations dans l’espace) peut se faire avec Css, mais ici, c’est bien dans l’espace des couleurs qu’on va effectuer ces transformations (symétries, rotations, homothéties, projections) et ce sont des couleurs qu’on va changer. Et, comme par ailleurs, le programme de SNT précise aussi :

Au moment de la conception de ce programme, le langage choisi est Python version 3 (ou supérieure).

C’est donc en Python qu’on va programmer ces filtres photo, avec le module PIL :

from PIL import Image
img = Image.open('CamphrierTampon2.jpg')
(largeur,hauteur) = img.size

On constate que les dimensions de la photo forment un couple (largeur,hauteur). Les élèves sont censés retoucher leurs propres photos mais au cas où, il a été choisi cette photo sous licence Creative Commons, extraite de l’article sur Le Tampon :

On remarque qu’il y a une voiture bleue tout à gauche, et, à côté de celle-ci, une voiture rouge. Cela va changer si on inverse les composantes rouge et bleue :

Symétrie

On effectue une symétrie par rapport au plan vert (les composantes rouge et bleue sont égales) en parcourant l’image pixel par pixel, et en lisant les couleurs du pixel, puis en modifiant celui-ci avec (b,g,r) au lieu de (r,g,b) :

for x in range(largeur):
    for y in range(hauteur):
        (r,g,b) = img.getpixel((x,y))
        img.putpixel((x,y),(b,g,r))

Sans surprise, la voiture rouge est devenue bleue, et vice-versa :

Pour voir la photo retouchée, on peut faire

img.show()

mais il faut attendre quelques secondes pour que le script Python ait parcouru tous les pixels de l’image…

Rotations

On tourne autour de l’axe des gris, de 120°, d’abord dans un sens avec img.putpixel((x,y),(g,b,r)) :

puis dans l’autre avec img.putpixel((x,y),(b,r,g)) :

Projections

Pour projeter sur le plan des images sans rouge, on fait img.putpixel((x,y),(0,g,b)), ce qui donne une image sans rouge :

et pour projeter sur le plan sans bleu, on fait img.putpixel((x,y),(r,g,0)), ce qui donne une image sans bleu (ce qui imite certaines formes de daltonisme) :

On peut aussi projeter sur une droite comme celle des gris (r=g=b), avec img.putpixel((x,y),(g,g,g)), ce qui donne une image en niveaux de gris :

Géométrie de l’espace des couleurs

Homothéties

Comme on veut éviter de dépasser 255 comme valeur de rouge, vert ou bleu, on choisit un rapport d’homothétie inférieur à 1, par exemple 1/2. On va donc remplacer chaque composante par sa moitié entière avec img.putpixel((x,y),(r//2,g//2,b//2)) ce qui donne une image plu sombre :

Solarisation

On peut faire des choses plus riches, par exemple en donnant à chaque pixel une teinte en arc-en-ciel, qui évoque une solarisation, avec la formule img.putpixel((x,y),(255-g,255-abs(g-128),g)) :

Géolocalisation

L’arbre photographie ci-dessus se trouve aux coordonnées (-21.281207 , 55.521736) ce qui permet de le voir d’un autre angle sur photos satellite, par exemple sur Géoportail :

ou sur maps :

Le « gigantesque pied de bois » est en fait un ravintsara.

Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *