Formation I.S.N.

Opérations sur les images avec le module PIL

Cette page présente comment réaliser des opérations sur les images avec PIL en construisant ligne par ligne un programme.
On commence toujours par importer le module en en-tête du fichier :


from PIL import Image

Ouvrir un fichier image




Téléchargez l'image ci-contre en cliquant dessus puis placez-la dans le répertoire courant.

Dans toute la suite, on considère que l'image est située dans le répertoire courant, c'est-à-dire dans le répertoire qui contient le script Python qui fait appel à cette image.

Pour ouvrir un fichier image au format .jpg (par exemple) située dans le répertoire courant, on utilise :


im = Image.open('Logo_ISN-IREM.jpg')

Afin d'être « manipulée », cette image est affectée à la variable nommée im dans le programme.

Obtenir des informations sur cette image

Une fois le fichier ouvert, on peut connaître et utiliser :

  • L'encodage des couleurs du fichier : 'RGBA' (couleurs avec gestion de la transparence), 'RGB', 'L' (gris) ou '1' (noir & blanc).
    
    couleur = im.mode
    print("L'encodage des couleurs est ", couleur)
  • Les dimensions de l'image (en pixels) sous forme d'un tuple (liste non modifiable) : (largeur, hauteur).
    
    l, h = im.size
    print('largeur : {} et hauteur : {}'.format(l, h))


  • Les composantes couleur du pixel de coordonnées (x, y) dans l'image. L'illustration ci-contre présente comment PIL « lit » une image. Les coordonnées du pixel rouge de cette image sont donc (3, 1) : à nouveau, c'est un tuple (il doit être entouré de parenthèses...).
    
    x, y = 120, 120         # Coordonnées choisies au hasard
    triplet = im.getpixel((x, y))
    print("Ce pixel a pour composantes : ", triplet)

Remarque importante

Dans le cas d'une image encodée en 'RGB', triplet prend pour valeur le triplet d'entier (r, v, b) correspondant aux composantes couleurs du pixels de coordonnées x en colonne et y en ligne. Par conséquent,

  • Ou bien on récupère l'intégralité du triplet puis on récupère les composantes r,v,b une à une avec les instructions
    
    triplet = im.getpixel((x, y))
    r = triplet[0]
    v = triplet[1]
    b = triplet[2]
  • Ou bien on récupère directement composante par composante avec l'instruction
    
    r, v, b = im.getpixel((x, y))

Modifier une image existante

Dans ce paragraphe, nous allons détailler un programme permettant d'obtenir l'image ci-contre, transposée de l'image originale du paragraphe précédent.

  • Avant d'obtenir une nouvelle image, il faut définir son nom (le nom de la variable qui « contiendra » cette image), l'encodage des couleurs et ses dimensions :
    
    # couleur est l'encodage du fichier d'origine
    # l, h sont les dimensions du fichier d'origine
    im2 = Image.new(couleur, (h,l))
    # h, l sont les dimensions de la nouvelle image
  • Colorisation de chaque pixel de la nouvelle image en utilisant ses coordonnées (x, y) :
    
    for x in range(l):       				# Abscisse de l'image d'origine
        for y in range(h):  				# Ordonnée de l'image d'origine
            triplet = im.getpixel((x, y))	# On récupère le code couleur du pixel
            im2.putpixel((y, x), triplet)	# On l'injecte dans le pixel correspondant
  • Sauvegarde et affichage de l'image ainsi créé dans le répertoire courant, sans oublier son format (.jpg, .gif, .bmp, etc...)
    
    im2.save('Logo_transpose.jpg')
    im2.show()
  • Programme complet

##----- Importation des modules -----##
from PIL import Image

##----- Ouverture des Fichiers -----##
im = Image.open('Logo_ISN-IREM.jpg')

##----- Obtenir des informations -----##
couleur = im.mode
print("L'encodage des couleurs est ", couleur)

l, h = im.size
print('largeur : {} et hauteur : {}'.format(l, h))

x, y = 120, 120         # Coordonnées choisies au hasard
triplet = im.getpixel((x, y))
print("Ce pixel a pour composantes : ", triplet)

##------ Nouvelle image ------##
im2 = Image.new(couleur, (h,l))		# couleur est l'encodage du fichier d'origine
									# l, h sont les dimensions du fichier d'origine
									# h, l sont les dimensions de la nouvelle image

for x in range(l):       				# Abscisse de l'image d'origine
    for y in range(h):  				# Ordonnée de l'image d'origine
        triplet = im.getpixel((x, y))	# On récupère le code couleur du pixel
        im2.putpixel((y, x), triplet)	# On l'injecte dans le pixel correspondant
									
##----- Fermeture et affichage -----##
im2.save('Logo_transpose.jpg')
im2.show()