Cours d'informatique pour le lycée

Projet : fond vert

Présentation

Nous allons ici tenter de remplacer un fond vert dans une image.

Nous utiliserons à nouveau la bibliothèque Python PIL (Python Image Library) aussi appelée Pillow :

from PIL import Image

Cette bibliothèque permet d’accéder simplement aux pixels d’une image.

La documentation de Pillow est disponible à l’adresse suivante : https://pillow.readthedocs.io/en/stable/reference/Image.html

Pour vous faciliter la prise en main de cette bibliothèque, voici les commandes les plus utiles :

Commande Description
image = Image.open("photo.jpg") Ouvre le fichier "photo.jpg" et le stocke en tant qu’objet dans la variable image.
image = Image.new("RGB", (larg, haut)) Crée une nouvelle image de largeur larg et de hauteur haut et la stocke en tant qu’objet dans la variable image.
image.copy() Retourne une copie de l’image. Utile avant de transformer une image.
image.save("photo2.jpg") Sauvegarde l’objet image dans le fichier "photo2.jpg".
image.show() Affiche l’image dans une fenêtre.
image.width Retourne la largeur de l’image en pixels.
image.height Retourne la hauteur de l’image en pixels.
image.getpixel((x, y)) Retourne la couleur du pixel (x, y) de image.
image.putpixel((x, y),(r, g, b)) Modifie la couleur du pixel (x, y) de image en (r, g, b).

Projet

Le fichier avec le fond vert est extrait d'un clip de Vald : fond vert. Et l'image à incruster est une salle de classe : classe. Les deux images font la même taille pour faciliter votre travail. Vous pouvez éventuellement changer l'image à incruster.

Il pourra être plus facile de détecter le vert avec les couleurs en HLS plutôt que RGB (à vous de chercher sont fonctionnement). Voici une structure qui vous donne accès pour chaque pixel aux composantes RGB et HLS de chaque pixel :

from PIL import Image
import colorsys

vald = Image.open("vald.jpg")
classe = Image.open("classe.jpg")
vald.show()
classe.show()

def fond_vert(img_fv,fond):
    # On fait une copie de l'image pour ne pas modifier l'original
    nouvelle = img_fv.copy()
    for y in range(img_fv.height):
        for x in range(img_fv.width):
            r, g, b = img_fv.getpixel((x,y))
            h,l,s = colorsys.rgb_to_hls(r/255,g/255,b/255)
            …
    return nouvelle

image = fond_vert(vald,classe)
image.show()

Le résultat ne sera pas parfait, mais l'objectif est d'avoir le moins de vert restant et de modifier le moins possible l'apparence de Vald.