Logo de kxs.frCours d'informatique pour le lycée et la prépa

Filtres photo

Prérequis

Introduction

Dans ce projet, vous aller devoir créer des filtres pour des images comme les filtres Instagram.

Nous utiliserons 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.

Couleurs d’une image

Une image se décompose en une multitude de points appelés pixels.

Chaque pixel possède sa propre couleur. Cette couleur résulte de la combinaison des trois couleurs primaires : rouge, vert et bleu (Red, Green et Blue : RGB). Ces niveaux peuvent en général prendre toutes les valeurs entre 0 et 255. On représente ainsi la couleur d’un pixel par trois nombres correspondant aux niveaux de rouge, vert et bleu. Par exemple pour un pixel vert on aura (0, 255, 0). Vous pouvez aller sur ce site pour voir le code RGB de toutes les couleurs affichables sur un écran : https://htmlcolorcodes.com/fr/.

Pillow

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

Vous allez devoir créer différents filtres ainsi qu’une interface en ligne de commande. On utilisera dans un premier temps le fichier maison.jpg à télécharger.

1 - Premier filtre : rouge

1) Créez un premier filtre qui ne garde que la composante rouge d’une image. C’est à dire qu’il faut pour chaque pixel mettre le vert et le bleu à zéro et ne pas toucher à la composante rouge. Ce filtre se présentera sous la forme d’une fonction prenant un objet Image en paramètre et retournant un nouvel objet image.

from PIL import Image

image = Image.open("maison.jpg")

image.show()

def filtre_rouge(image):
    # On fait une copie de l'image pour ne pas modifier l'original
    nouvelle = image.copy()
    for y in range(image.height):
        for x in range(image.width):
            r, g, b = image.getpixel((x,y))
            nouvelle.putpixel((x,y), (r,0,0))
    return nouvelle

image_filtree = filtre_rouge(image)
image_filtree.show()

2 - Filtres

Créez les filtres suivants :

2) Un filtre vert et un filtre bleu basés sur le même principe que le filtre rouge ;

3) Un filtre gris qui transforme une image couleur en nuance de gris. Pour cela, chaque composante d’un pixel prend la moyenne des trois composantes.

4) Un filtre noiretblanc qui après le filtre gris met les composantes à 0 si leur valeur est inférieure à 128 et à 255 si leur valeur est supérieure ou égale à 128.

5) Un filtre miroir qui retourne l’image comme si on la voyait dans un miroir.

3 - Interface

6) Créez une interface simple en ligne de commande qui propose de choisir le fichier à traiter, le nom du ficher produit (pas de sauvegarde si rien n’est saisi) puis le filtre avec un numéro. L’interface devra ressembler à ce qu’il y a ci-dessous :

Quel fichier utiliser ("photo.jpg" par défaut) ?
Quel nom donner au nouveau fichier (pas de sauvegarde par défaut) ? photo2.jpg
Voici les filtres disponibles :
1 – rouge
2 – vert
3 – bleu
4 – gris
5 – noir_et_blanc
6 – miroir
Quel filtre choisissez-vous ? 2
Filtre vert appliqué

4 - Encore des filtres

Créez les filtres suivants :

7) Un filtre pixel3 qui parcourt l’image par bloc de 3 pixels de large et remplace les couleurs des 9 pixels par une même couleur qui est la moyenne des 9 couleurs. Cela devra faire l’effet d’une image pixelisée.

8) Un filtre pixel10 qui fait la même chose que le filtre pixel3 mais avec des blocs de 10 pixels de large.

9) Un filtre lum qui prend en paramètre un nombre entier et qui ajoute cette valeur à toutes les couleurs de chaque pixel. (il n’y a pas besoin de faire attention aux limites 0 et 255, Pillow s’en charge automatiquement)

10) Un filtre color qui prend en paramètre une des trois couleurs primaire et un nombre entier k. Il ajoute alors ce nombre à la composante correspondante de chaque pixel et retranche k/2 aux deux autres composantes.

11) Un filtre color512 qui limite à 8 le nombre de valeurs pour chaque composante de façon à donner un effet « vieux jeu vidéo » à l'image. Par exemple si la composante est entre 0 et 31 alors on la remplace par 0, entre 32 et 63 on la remplace par 32… Il est possible de faire cela très simplement. Le rendu pourra être meilleur avec une autre image que vous trouverez sur internet.

Tableau du barème

Voilà le barème complet sur 20 pour ce projet.

Tâche Barème
rouge 1 points
bleu et vert 1 points
gris 2 points
noir et blanc 2 point
miroir 1 point
interface 2 point
pixel3 3 points
pixel10 1 point
lum 1 points
color 1 point
color512 1 point
commentaires 1 points
code propre 1.5 point
code optimisé 1.5 points
Totals 20