TD Pillow⚓︎
Dans ce TD, il vous est proposé de travailler avec l'image carrée du voilier, de taille \(512\)x\(512\) suivante :
Afin de mieux illustrer visuellement ce qu'il vous est demandé (le rendu à obtenir), nous utiliserons dans les consignes de ce TD, une autre image, celle d'une plage, de taille \(512\)x\(512\).
Vous pouvez utiliser une autre image téléchargée sur internet, si cela vous amuse, mais :
- votre image DOIT ÊTRE CARRÉE.
- il faudra adapter certaines consignes afin qu'elles coincident avec votre situation
Nuances de Gris⚓︎
On souhaite convertir notre image de couleur en gris.
Principe Général : Comment faire ?⚓︎
Rappelons que la couleur \((R,G,B)\) d'un pixel est grise, si et seulement si ses composantes \(R\), \(G\) et \(B\) de ce pixel vérifient :
Plusieurs méthodes sont imaginables. Inventez en une, en plus des deux suivantes...
Niveaux de Gris par la moyenne⚓︎
Une méthode, parmi d'autres, pour convertir un pixel \((R,G,B)\) d'une couleur quelconque, en un pixel gris dont les 3 composantes \((R', G', B')\) sont égales entre elles, consiste à calculer \(R'\), \(G'\) et \(B'\) de la manière suivante :
-
Créer une fonction
get_gris_moyen(xy:tuple)->int
qui :- reçoit en entrée les coordonnées
xy
(un tuple) d'un pixel - renvoie en sortie un tuple
(gr,gr,gr)
oùgr = R' = G' = B'
est le gris moyenne calculé par la formule de la moyenne non coefficientée, décrite ci-dessus
- reçoit en entrée les coordonnées
-
Créer une fonction
colorer_gris_moyen()
qui convertit l'image en gris, avec la méthode du gris moyen détaillée ci-dessus
Rendu Attendu
Niveaux de Gris Naturels, version Gimp/Photoshop⚓︎
La méthode précédente a l'avantage de fonctionner, néanmoins, les graphistes s'accordent à penser que les couleurs grises sont plus belles, càd plus proches de celles de la nature, lorsque le mode de calcul du gris utilise une moyenne coefficientée (car le vert est dominant dans la nature), avec les coefficients suivants :
- ROUGE = \(30\%\)
- VERT = \(59\%\)
- BLEU = \(11\%\)
C'est ce que font les logiciels de retouche d'images, comme GIMP/Photoshop, pour convertir une image en couleur en gris.
Autrement dit, pour convertir un pixel \((R,G,B)\) d'une couleur quelconque, en un pixel gris, avec 3 composantes \((R', G', B')\) égales entre elles, On calcule \(R', G'\) et \(B'\) de la manière suivante :
-
Créer une fonction
get_gris_nature(xy:tuple)->int
qui :- reçoit en entrée les coordonnées
xy
(un tuple) d'un pixel - renvoie en sortie un tuple
(gr,gr,gr)
oùgr = R' = G' = B'
est le gris nature calculé par la formule de la moyenne coefficientée avec les coefficients(0.3,0.59,0.11)
, décrite ci-dessus
- reçoit en entrée les coordonnées
-
Créer une fonction
colorer_gris_nature()
qui convertit l'image en gris, avec la méthode du gris nature détaillée ci-dessus
Rendu Attendu
Négatif Noir & Blanc⚓︎
Un négatif noir et blanc est une image dont les tons noirs et blancs (et gris) sont "inversés":
- les noirs deviennent blancs
- les blancs deviennent noirs
- etc.. les gris très clairs deviennent des gris très sombres, et réciproquement,
- etc..
-
Si on note
gris
, l'entier compris entre \(0\) et \(255\), qui représente la nuance de gris d'un pixel de l'image noir et blanc initiale, alors comment calculer la nouvelle nuance de grisgrisNegatif
(encore un entier entre \(0\) et \(255\)) du même pixel pour le négatif noir et blanc (en fonction de la variablegris
initiale) ? -
Créer une fonction
negatif_noir_blanc()->None
qui utilise l'image en gris transformée à la question précédente, et qui transforme cette image grise en négatif noir et blanc.
Rendu Attendu
Jeux de Couleurs⚓︎
Filtre de Couleur⚓︎
On souhaite coloriser l'ensemble de l'image avec une certaine couleur. Le principe général consiste en :
- colorier chaque pixel en gris
(gr,gr,gr)
(en version Moyenne, ou en version nature/Gimp/Photoshop, peu importe), puis -
coloriser chaque pixel gris via le filtre d'une certaine couleur
(R,G,B)
choisie à l'avance. On obtient ainsi la nouvelle couleur filtrée(R',G',B')
de ce pixel grâce à la formule :- \(R' = gr\times \dfrac{R}{255}\)
- \(G' = gr\times \dfrac{G}{255}\)
- \(B' = gr\times \dfrac{B}{255}\)
-
Créer une fonction
filtre(xy:tuple, rgb:tuple)->tuple
telle que :- elle reçoit en entrée :
- les coordonnées
(x,y)
du pixel (un tuple), ainsi que - la couleur
(R,G,B)
du filtre à appliquer, et
- les coordonnées
- elle renvoie en sortie la nouvelle couleur
(R',G',B')
(donc un tuple de 3 entiers entre 0 et 255) après avoir appliqué le filtre
- elle reçoit en entrée :
-
Créer une fonction
colorier_filtre(rgb:tuple)->None
qui applique le filtre de couleur(r,g,b)
à toute l'image grâce à la fonctionfiltre(rgb)
de la question précédente
Quelques Rendus Attendus
Col
Col
Col
Col
Fusion d'Images (Colorées)⚓︎
Dans cette partie, on suppose que l'on dispose déjà de 4 images colorées (comme les précédentes) sauvegardées dans votre OS (dans le même répertoire que votre algorithme Python, pour simplifier) avec des noms différents.
Créer une fonction fusion(listeNomsImages:list)->None
qui :
- reçoit en entrée une liste de 4 noms d'images déjà créées (de taille \(512\)x\(512\))
- crée une nouvelle image
im
avec l'instructionim = Image.new(mode="RGB", size=(4*512, 512))
- fusionne les 4 images colorées dans une même image (par exemple les 4 images colorées créées précédemment, en les alignant toutes les 4 sur une même ligne).
Rendu Attendu
Filtre Sepia, ou Photographie vieillie⚓︎
Amusez-vous à simuler artificiellement le vieillissement de vos photos, en coloriant votre photo avec une couleur de filtre particulière.
-
Créer une fonction
sepia(xy:tuple)->tuple
qui :- reçoit en entrée les coordonnées
xy
(un tuple) d'un pixel - renvoie en sortie les composantes
(R,G,B)
(un tuple) du pixelxy
mais filtré avec la couleur sepia, càd la couleur(174,137,100)
. On pourra utiliser la fonctionfiltre()
déjà créée.
- reçoit en entrée les coordonnées
-
Créer une fonction
colorier_sepia()
qui convertit l'image en une image vieillie.
Rendu Attendu
Négatif Couleur⚓︎
-
Si on note
(R, G, B)
, les 3 entiers compris entre \(0\) et \(255\), qui représentent les composantes RGB de couleur d'un pixel de l'image initiale, alors comment calculer les nouvelles composantes de couleur(rougeNegatif, vertNegatif, bleuNegatif)
(encore 3 entiers entre \(0\) et \(255\)) du même pixel pour le négatif couleur (en fonction des valeurs(R,G,B)
des composantes initiales) ? -
En s'inspirant de la fonction négatif Noir & Blanc, créer une fonction
négatif_couleur()
, qui inverse (non pas le noir et le blanc, mais) la clarté de chacun des canaux R,G et B : ce que l'on pourrait appeler un négatif couleur.
Rendu Attendu
Inversion de Composantes/Canaux⚓︎
-
Créer une fonction
inversionRG()
qui, pour chaque pixel de l'image :- permute les canaux Rouge (R) et Vert (G)
- ne modifie pas le canal Bleu (B)
-
Créer une fonction
inversionRB()
qui, pour chaque pixel de l'image :- permute les canaux Rouge (R) et Bleu (B)
- ne modifie pas le canal Vert (G)
-
Créer une fonction
inversionGB()
qui, pour chaque pixel de l'image :- permute les canaux Bleus (B) et Vert (G)
- ne modifie pas le canal Rouge (R)
-
Créer une fonction
permuteCanaux()
qui, pour chaque pixel de l'image :- permute circulairement les canaux Rouge (R), Vert (G) et Bleu (B) :
- le nouveau Rouge (R) prend comme valeur l'ancien Vert (G)
- le nouveau Vert (G) prend comme valeur l'ancien Bleu (B)
- le nouveau Bleu (B) prend comme valeur l'ancien Rouge (R)
- permute circulairement les canaux Rouge (R), Vert (G) et Bleu (B) :
Quelques Rendus Attendus
Col
Col
Col
Col
Oeuvre d'Art Andy Warhol⚓︎
Dans cette partie, on suppose que l'on dispose déjà des 4 images (précédentes) inversant les canaux de couleur, sauvegardées dans votre OS (dans le même répertoire que votre algorithme Python, pour simplifier) avec des noms différents.
Utiliser les 4 images (précédentes) d'inversions de canaux, et la fonction fusion(listeNomsImages:list)->None
pour fusionner les 4 images (précédentes) dont les canaux ont été inversés, et ainsi créer une Oeuvre d'Art, en l'honneur modeste mais sincère, à l'artiste américain Andy Warhol et sa célèbre oeuvre sur Marylin Monroe :
Rendu Attendu
Pixelisation⚓︎
-
Créer une fonction
couleur_moyenne_carre(x0,y0,a)
qui :- reçoit en entrée :
- les coordonnées
(x0,y0)
du point supérieur gauche d'un petit carré - le petit carré admet un côté de longueur
a
- les coordonnées
- renvoie en sortie la couleur moyenne, représentée par le triplet
(mR, mG, mB)
des moyennes sur chaque canal sur le carré(x0,y0,a)
, càd le carré de coin supérieur gauche(x0,y0)
et de côtéa
:mR
est la moyenne du canal Rouge dans ce carrémG
est la moyenne du canal Vert dans ce carrémB
est la moyenne du canal Bleu dans ce carré
- reçoit en entrée :
-
Créer une fonction
pixeliser(a:int)->None
qui :- remplace l'image du carré
(x,y,a)
par un carré de couleur uniforme (la même)(mR, mG, mB)
- remplace l'image du carré
Quelques Rendus Attendus
Col
Col
Col
Col
- On pourra vérifier qu'une image en nuances de gris pixellise en carrés gris
Disque Central⚓︎
Disque Blanc⚓︎
- Créer une fonction
dist(x0:float,y0:float,x1:float,y1:float)->float
qui renvoie la distance (euclidienne) entre les deux points de coordonnées(x0,y0)
et(x1,y1)
. On pourra utiliser la fonctionsqrt
du modulemath
-
Créer un algorithme qui :
- convertit l'image en RGB (si besoin)
- ajoute un Disque Blanc de rayon
200px
, centré au milieu de l'image (autour dun point de coordonnées(256,256)
)
Rendu Attendu
Disque Transparent⚓︎
Créer un algorithme qui :
- convertit l'image en RGBA
- ajoute un Disque Transparent de rayon
200px
, centré au milieu de l'image (autour dun point de coordonnées(256,256)
)
Rendu Attendu