La Joconde - Retouche de couleurs

Importer l'image

Chargeons l'image sur laquelle nous allons travailler dans cette première partie. Suivez la procédure suivante

  1. Téléchargez le fichier ci-dessous

  2. décompressez-le

  3. allez dans le menu sketch/Ajouter un fichier...

  4. sélectionnez le fichier monalisa_256.jpg afin de le accessible visible par notre programme python.

Recopiez et exécutez le programme ci-dessous, qui va se charger d'afficher la joconde.

1
def setup():
2
    size(256,256)
3
    monImage = loadImage("monalisa_256.jpg")
4
    image(monImage,0,0)
5
6
def draw():
7
    pass

ComplémentQuelques explications

Le programme ci-dessus est assez simple. Une fois le fichier monalisa_256.jpg chargé dans le sketch, nous utilisons

  • la fonction loadImage() pour charger l'image en mémoire dans une variable monImage

  • la fonction image() pour afficher l'image contenue dans la variable monImage. Celle-ci sera affichée à partir du point de coordonnées (0,0).

MéthodeRécupérer un pixel d'une image

Nous avons vu précédemment comment modifier la couleur d'un pixel dont la position était connue à l'aide de la fonction set(). A présent, nous allons récupérer les informations concernant un pixel d'une image à l'aide de la fonction get(). Cette-ci prend en paramètres les coordonnées du pixel dont on veut récupérer la couleur.

Exemple

Recopiez et analysez ce programme.

1
def setup():
2
    global monImage
3
    size(256,256)
4
    monImage = loadImage("monalisa_256.jpg")
5
    image(monImage,0,0)
6
7
def draw():
8
    if mouseX!= pmouseX or mouseY != pmouseY:
9
        image(monImage,0,0) # on réaffiche l'image car la souris a bougé
10
        couleur=get(mouseX,mouseY)
11
        fill(couleur)
12
        rect(mouseX-25,mouseY-25,50,50)
13
14
monImage=0

ComplémentQuelques explications

Dans cet exemple, nous devons accéder à la variable monImage, à la fois dans la fonction setup() pour l'affichage initial, et aussi dans la fonction draw() pour le rétablissement de l'image d'origine à chaque déplacement de la souris. Pour accéder à la variable monImage dans ces deux fonctions, on passe ici par une variable globale. Celle-ci étant modifiée dans la fonction setup(), on ajoute en début de celle-ci la ligne global monImage.

Pour détecter que la souris a bougé depuis l'appel précédent de draw(), on utilise le test suivant : if mouseX!= pmouseX or mouseY != pmouseY, qui compare la position de la souris avec sa position précédente. La souris a bougé si l'une ou l'autre de ses coordonnées a changé.

La fonction get(mouseX,mouseY) renvoie la couleur du pixel sous le curseur de souris. Il nous reste ensuite qu'à afficher un carré rempli avec cette couleur.

Modification des pixels

Commençons à torturer notre joconde. Recopiez, analysez et exécutez le programme ci-dessous :

1
def setup():
2
    global monImage
3
    size(256,256)
4
    monImage = loadImage("monalisa_256.jpg")
5
    image(monImage,0,0)
6
7
def draw():
8
    pass
9
10
def mousePressed():
11
    for y in range(256):
12
        for x in range(256):
13
            couleur = get(x,y)
14
            R,V,B=red(couleur), green(couleur), blue(couleur)
15
            couleur=color(R,B,V)
16
            set(x,y,couleur)
17
    
18
19
monImage=0

ComplémentQuelques explications

A chaque clic de souris, nous récupérons la valeur de chaque pixel dans deux boucles imbriquées afin de modifier la couleur.

  • couleur = get(x,y) récupère la couleur

  • R,V,B=red(couleur), green(couleur), blue(couleur) convertit cette couleur en valeurs des canaux rouges, verts et bleus

  • couleur=color(R,B,V) inverse les canaux verts et bleus du pixel ce qui occasionne le changement global de couleur de l'image

Exercice Im5 : Changement d'éclairage

Dans cet exercice, vous allez modifier la luminosité de l'image de la manière suivante :

  • si on appuie sur la touche c, l'image deviendra 50% plus claire

  • si on appuie sur la touche f, l'image deviendra 34% plus foncée

  • si on appuie sur la touche r, les couleurs deviendront plus rouges.

  • si on appuie sur la touche espace, l'image de départ sera rechargée.

Exemple : après 2 appuis sur la touche f, l'image ressemblera à ceci.

Indications :

  • Pour que l'image devienne 50% plus claire, on multipliera chaque couleur R, V et B par 1,5.

  • Pour que l'image devienne 34% plus foncée, on multipliera chacune des couleurs R,V et B par 0,66.

  • Pour que les couleurs deviennent plus rouges, on multipliera uniquement le canal rouge par 1,2

Exercice Im6 : en noir et blanc

Dans cet exercice, vous allez transformer l'image de la joconde en noir et blanc. Pour cela, il y a plusieurs moyens de procéder

  • en recopiant les valeurs d'un canal sur les autres. Par exemple, si un pixel possède les couleurs (R,V,B), on le transforme en (R,R,R) si on ne garde que le canal rouge, (V,V,V) si on garde que le vert et (B,B,B) si on ne garde que le bleu.

  • en se basant sur la valeur moyenne des canaux. Par exemple, si un pixel possède les couleurs (R,V,B), on le transforme en (M,M,M)\(M=\dfrac{R+V+B}{3}\)

Dans cet exercice, votre travail consistera à tester ces différents types de noir et blanc sur la joconde. Votre programme fonctionnera de la manière suivante :

  • Si vous appuyez sur la touche r, votre image sera passée en noir et blanc en ne conservant que le canal rouge.

  • Si vous appuyez sur la touche v, votre image sera passée en noir et blanc en ne conservant que le canal vert.

  • Si vous appuyez sur la touche b, votre image sera passée en noir et blanc en ne conservant que le canal bleu.

  • Si vous appuyez sur la touche m, votre image sera passée en noir et blanc en utilisant la valeur moyenne des couleurs.

  • Lorsque vous relâchez la touche (r,v,b pou m), l'image sera restaurée en couleurs d'origine.

Remarque

Vous voyez ainsi qu'il n'y a pas qu'une seule manière d'obtenir des noirs et blancs. En fonction de ce que l'on veut faire ressortir sur une image (végétation, ciel, visages, etc...), on utilisera une méthode plutôt qu'une autre.