Outils pour utilisateurs

Outils du site


tp:python:transforme_images

Warning: Undefined array key "lang" in /home/signac/doku/lib/plugins/wrap/helper.php on line 94

Warning: Undefined array key "id" in /home/signac/doku/lib/plugins/wrap/helper.php on line 117

Warning: Undefined array key "width" in /home/signac/doku/lib/plugins/wrap/helper.php on line 119

Warning: Undefined array key "dir" in /home/signac/doku/lib/plugins/wrap/helper.php on line 128

Warning: Undefined array key "lang" in /home/signac/doku/lib/plugins/wrap/helper.php on line 94

Warning: Undefined array key "id" in /home/signac/doku/lib/plugins/wrap/helper.php on line 117

Warning: Undefined array key "width" in /home/signac/doku/lib/plugins/wrap/helper.php on line 119

Warning: Undefined array key "dir" in /home/signac/doku/lib/plugins/wrap/helper.php on line 128

Warning: Undefined array key "lang" in /home/signac/doku/lib/plugins/wrap/helper.php on line 94

Warning: Undefined array key "id" in /home/signac/doku/lib/plugins/wrap/helper.php on line 117

Warning: Undefined array key "width" in /home/signac/doku/lib/plugins/wrap/helper.php on line 119

Warning: Undefined array key "dir" in /home/signac/doku/lib/plugins/wrap/helper.php on line 128

Warning: Undefined array key "lang" in /home/signac/doku/lib/plugins/wrap/helper.php on line 94

Warning: Undefined array key "id" in /home/signac/doku/lib/plugins/wrap/helper.php on line 117

Warning: Undefined array key "width" in /home/signac/doku/lib/plugins/wrap/helper.php on line 119

Warning: Undefined array key "dir" in /home/signac/doku/lib/plugins/wrap/helper.php on line 128

Warning: Undefined array key "lang" in /home/signac/doku/lib/plugins/wrap/helper.php on line 94

Warning: Undefined array key "id" in /home/signac/doku/lib/plugins/wrap/helper.php on line 117

Warning: Undefined array key "width" in /home/signac/doku/lib/plugins/wrap/helper.php on line 119

Warning: Undefined array key "dir" in /home/signac/doku/lib/plugins/wrap/helper.php on line 128

Warning: Undefined array key "lang" in /home/signac/doku/lib/plugins/wrap/helper.php on line 94

Warning: Undefined array key "id" in /home/signac/doku/lib/plugins/wrap/helper.php on line 117

Warning: Undefined array key "width" in /home/signac/doku/lib/plugins/wrap/helper.php on line 119

Warning: Undefined array key "dir" in /home/signac/doku/lib/plugins/wrap/helper.php on line 128

📓 Transformer des images

Solution

L'objectif de ce TP est d'opérer des transformations sur une image, en manipulant les valeurs de pixels.

Rappelons au passage qu'une image en “couleurs vraies” et sans transparence est composée d'un mélange de rouge, de vert et de bleu (les trois composantes sont stockées dans cet ordre). La valeur de chaque composante est donnée par un nombre entier codé sur un octet (un nombre entre 0 et 255). Le mélange des couleurs se fait par synthèse additive : (rouge + vert) => jaune.

Création de l'image de départ

Commencez par choisir l'image sur laquelle vous allez travailler parmi celle qui sont proposées en lien ici. Si possible, choisissez une zone de l'image où on distingue au moins 2 composantes.

Modifiez cette image de manière à obtenir finalement une image carrée de taille 256x256, non déformée, comportant éventuellement une partie seulement de l'image de départ choisie. Avec un logiciel de dessin, signez cette image, de manière visible, lisible (on doit reconnaître votre nom) et pas trop intrusive. Demandez conseil si vous n'êtes pas sûr de vous.

À partir de cette image, vous devrez en produire des versions modifiées, toujours avec la même résolution (256×256).

Toutes les images que vous utiliserez, et que vous rendrez doivent être au format PNG (attention, avoir l'extension .png ne signifie pas que le format est nécessairement PNG). Modifier l'extension ne change pas le format du fichier.

Comment démarrer ?

Une documentation est accessible pour vous expliquer comment manipuler et afficher des images : Travailler avec des images en Python.

Il existe plusieurs façons de procéder, chacune ayant ses avantages et ses inconvénients. Nous conseillons ici d'utiliser PIL et matplotlib pour charger et afficher les images. La méthode est détaillée dans le document cité plus haut.

D'autres transformations d'images

Votre programme devra se nommer login_images.py (où login est votre login)

Votre programme doit comporter une fonction différente pour chaque transformation mentionnée ci-dessous. Chaque fonction doit prendre une image en paramètres (plus d'autres paramètres si vous en avez besoin) et renvoyer une image.

  • Vous pouvez répondre aux question (finales) dans le code, en commentaire (pensez à vérifier que ça fonctionne encore après avoir ajouté les commentaires…)
  • Le module imageio contient une fonction imageio.imsave qui permet d'enregistrer une image. Utilisez l'aide pour savoir comment vous en servir.

Par ordre de difficulté :

  • niveaux de gris, couleurs cyclées, miroir vertical,
  • image quantifiée (sur les couleurs), pop art
  • photomaton, floutage, mosaïque
  • solvant renversé
  • détection de contours

| {{arles.png}} | |

Image de départ : La chambre de van Gogh à Arles (v.2 ;-) )
Image en niveaux de gris (1) Couleurs cyclées : un pixel bleu deviendra rouge, un pixel rouge deviendra vert et un pixel vert deviendra bleu) (1)
Image «quantifiée», chaque composante ne peut prendre que 8 valeurs différentes, régulièrement réparties (2) Image floue, chaque point est obtenue en faisant la moyenne des valeurs de pixels dans un carré 5×5 centré en i,j (3)
Miroir vertical (1) Détection de contour (4)
Version Pop-art (le rouge devient plus rouge, le bleu plus bleu et le vert plus vert…) (2) Transformée du photomaton (ici, version réversible) (3)
Mosaïque (5×5) (2) Vincent a renversé du solvant…

Parmi les transformations précédentes, certaines sont sujettes à de la perte d'information et d'autres non. Indiquez quelles sont les transformations qui perdent de l'information et quelles sont les transformations qui n'en perdent pas. Justifiez.

Espace de couleurs

Il existe plusieurs [[https://fr.wikipedia.org/wiki/Espace_de_couleur|espaces de couleur]] pour représenter les couleurs des images.

  • le modèle RGB est un triplet de trois valeurs numériques, Red, Green et Blue, comprises entre 0 et 1 (ou 0 à 255 dans les exemples que nous avons vu précédemment).
  • le modèle HSV est un triplet de trois valeurs : Hue qui est un angle

en degrés dont la valeur est comprise entre 0 et 360 et représente la teinte, Value et Saturation sont des valeurs numériques comprises entre 0 et 1 et représentent respectivement la brillance (0 pour Value donne du noir) et l'intensité (lorsque Saturation diminue, la couleur devient fade)

Un des intérêts du modèle HSV est qu'il correspond mieux à une perception humaine des couleurs. De plus, une seule valeur correspond à la teinte, et il est donc facile de traverser tout le spectre des couleurs en faisant varier un seul paramètre : Hue.

Nous allons créer une fonction qui transforme une teinte en une autre, dans une image, en opérant une translation de toutes les valeurs de teintes. Il suffira pour cela de décaler toutes les valeurs de *Hue* d'un certain nombre de degrés. Par exemple, ajouter 120 à la teinte fera passer le jaune (60°) au cyan (180°). Naturellement, les autres couleurs seront modifiées aussi.

Pour réaliser cela, nous allons devoir, pour chaque couleur RGB d'une image, la transformer en HSV, opérer le décalage, puis retransformer en RGB pour stocker la nouvelle couleur.

Les outils à avoir à notre disposition sont donc une fonction qui passe de l'espace de couleurs RGB à HSV, et une autre fonction qui fait le contraire. Les formules permettant de passer d'un espace à un autre sont données ici : [[https://fr.wikipedia.org/wiki/Teinte_Saturation_Valeur#Transformation_entre_TSV_et_RVB|Transformation entre TSV et RVB]]. Nous les redonnons ci-dessous.

RGB vers HSV

Soient $M=\max(R, G, B)$ et $m = \min(R, G, B)$. Si $M=m$, on prend $H = 0$. Sinon :

  • si $M = R$, $H = 60\times (G - B) / (M - m) \bmod 360$
  • si $M = G$, $H = 60\times (B - R) / (M - m) + 120$
  • si $M = B$, $H = 60\times (R - G) / (M - m) + 240$

On obtient ainsi une valeur de $H$ entre 0 et 360. Puis on prend $V = M / 255$ (pour avoir une valeur entre 0 et 1 si les composantes RGB sont des entiers sur un octet) Et enfin, $S=(M-m)/M$ si $M$ est non nul et $S=0$ sinon.

HSV vers RGB

Ce qui suit est valable pour H dans $[0, 360[$. On calcule en premier le sextant contenant la teinte, et la position dans le sextant :

  • $a = \lfloor H/60\rfloor$ : sextant
  • $f = H/60 - a$ : position dans le sextant

puis :

  • $l = V\times (1 - S)$
  • $m = V\times (1 - f\times S)$
  • $n = V \times (1 - (1 - f)\times S)$

Les 3 valeurs RGB (ici entre 0 et 1, il faudra les multiplier pour obtenir un entier stockable sur un octet) sont lors données par le tableau suivant :

$a$ 0 1 2 3 4 5
R,G,B $V,n,l$$m,V,l$$l,V,n$$l,m,V$$n,l,V$$V,l,m$

Travail à faire

Écrivez une fonction qui prend une image et un angle en paramètres et fait tourner toutes les teintes de l'image de l'angle en question.

tp/python/transforme_images.txt · Dernière modification: 2021/05/04 15:12 (modification externe)