TD : MANIPULATION D’IMAGES
On travaillera sur des images bitmap, c’est-à-dire sur des matrices de pixels.
On peut considérer que c’est une liste
de lignes, chaque ligne étant une liste
de pixels.
Chaque pixel est défini par sa position
et sa couleur.
Celle-ci se est un mélange des ses trois
composantes RGB ( Red, Blue, Green).
(255, 255, 255) au blanc et
(255, 0, 0) au rouge par
exemple.
Les valeurs de chaque
composante sont comprises
entre 0 et 255.
La librairie Python Imaging Library (PIL) permet d’importer des images pour les
manipuler comme des tableaux de pixels, et ensuite les réimporter.
L’image à ouvrir sera placée dans le même répertoire que votre programme
python.
Voici un exemple qui permet d’obtenir le drapeau
français.
import PIL
# Pour lire et écrire des images dans un fichier
from PIL import Image
#(0,0,255) : bleu
#(255,255,255) : blanc
#(255,0,0) : rouge
def drapeaux_francais():
# on définit la taille de l’image
xmax,ymax = 300,300
# on crée une variable qui contiendra l’image
img = Image.new(mode = "RGB",size = (xmax,ymax))
# on parcourt tous les pixels de l’images
# px est la couleur du pixel
for x in range(xmax):
for y in range(ymax):
if x < 100:
px = (0,0,255)
elif x < 200:
px = (255,255,255)
else :
px = (255,0,0)
# on met le pixel à la position (x,y) à la couleur px
img.putpixel((x ,y ), px)
return img
img_drapeau = drapeaux_francais()
# on affiche l’image
img_drapeau.show()
# on sauvegarde l’image
img_drapeau.save("drapeau_francais.jpg")
Questions
1. Écrire une fonction qui dessine le drapeau de la Sierra Leone, l’affiche et le
sauvegarde.
Le drapeau devra être de forme rectangulaire.
2. Écrire une fonction qui dessine une image dont chaque pixel est pris au
hasard, l’affiche et le sauvegarde.
On utilisera :
• from random import *
• la fonction randint()
3. Écrire une fonction qui dessine cette image, l’affiche et
le sauvegarde.
L’image sera de forme carrée.
Les coordonnées des pixels bleus vérifie : x < y.
4. Écrire une fonction qui dessine un dégradé à partir
d’une couleur, l’affiche et le sauvegarde.
Vous choisirez votre couleur de départ.
Une composante (r,g,b) devra débuter à 0,pourquoi ?
La taille d’un côté ne pourra pas dépasser 256 pixels,
pourquoi ?
→ Indication : la double boucle dessine l’image colonne par colonne.
5. Écrire une fonction qui prend en entrée une image et qui crée une autre
image dont tous pixels ont une composante rouge nulle et les autres
inchangées.
Pour récupérer la taille de l’image, on utilisera la commande
• (xmax,ymax) = image.size
Pour charger une image, on utilisera la commande
• raphael = Image.open('raphael.jpg')
6. L’image Invisible.jpg contient un message caché.
Le fond de cette image est de couleur (102,255,102).
Un texte a été écrit avec une couleur très légèrement
différente.
Écrire une fonction, qui prend en entrée cette image et
qui renvoie une nouvelle image avec le message visible.
7. Écrire une fonction qui dessine un rectangle avec un texte caché.
Pour écrire du texte dans une image :
img = Image.new(mode = "RGB",size = (xmax,ymax),color = (...,...,...))
phrase_1 = "(-_-)ZZZ "
image_texte = ImageDraw.Draw(img)
myFont = ImageFont.truetype('FreeMono.ttf', 65)
image_texte.text((5, 5), phrase_1,font = myFont,fill = (...,...,...))
8. Écrire une fonction, qui prend en entrée une image et qui renvoit une
nouvelle image dont les composantes r et b sont inversées.
(203,10,45) → (45,10,203)
9. Écrire une fonction, qui prend en entrée une image et qui renvoit une
nouvelle image symétrique.