Aller au contenu

Ce TP est à rendre sur école directe, toute absence de travail sera noté zéro.

Manipulation d’images

Toutes les manipulations d'images se feront sur cette image.

Télécharger cette image cliquez ici et mettez là dans le même dossier où vous avez mis votre fichier python.

Introduction

Quelques notions sur les images :

  • Une image est constituée de pixels (points). La définition d’une image (par exemple pour l’image considérée correspond au nombre de pixels de l’image (L : la largeur de l’image en pixel, H : la hauteur de l’image en pixel).
  • Chaque pixel est constitué de 3 composantes (chacun est appelé aussi canal) : un rouge, un vert et un bleu (RVB). C’est la somme de ces 3 couleurs qui permet d’obtenir un grand nombre de couleurs (synthèse additive).
  • Classiquement, à chaque canal, on associe un nombre binaire codé sur 8 bits (soit donc 24 bits par pixel).
  • Pour chaque pixel, on aura donc une valeur pour le rouge (comprise entre 0 et 255 puisque codé sur 8 bits), une valeur pour le vert (comprise entre 0 et 255) et une valeur pour le bleu (comprise entre 0 et 255). Quelques exemples : (0,0,0) => noir ; (255,0,0) => rouge ; (255,255,255) => blanc ; (0,255,0) => vert…

Remarque : Il peut exister un 4ème canal en plus du canal rouge, canal vert et canal bleu, le canal « alpha » qui permet de gérer la transparence du pixel (par exemple, les images au format .png gèrent la transparence). Dans ce cas chaque pixel est codé sur 32 bits.

Pour manipuler les images en Python, nous allons utiliser la bibliothèque Pillow. La documentation générale est disponible ici https://pillow.readthedocs.io/en/stable/handbook/tutorial.html

Pour ouvrir notre image, nous allons utiliser le code suivant.

from PIL import Image
image = Image.open('bebe-yoda.jpg')
image.show()

Si pillow n'est pas installé sur votre ordinateur, vous pouvez utiliser cet IDE en ligne : https://console.basthon.fr/

getpixel

La méthode getpixel((x,y)) renvoie un tuple (nous étudierons ce type de données plus tard dans l'année, cela ressemble un peu aux listes Python sauf qu'un tuple n'est pas modifiable) contenant les trois composantes rouge, verte et bleue du pixel de coordonnées . Attent

coord

Saisir, analyser et tester ce code:

from PIL import Image
image = Image.open('bebe-yoda.jpg')
(r, v, b) = image.getpixel((100, 100))

A quoi correspond précisémment le tuple (r, v, b) dans ce cas ?

putpixel

Une autre méthode essentielle est putpixel((x,y), (r, v, b)) qui permet d'attribuer des valeurs aux canaux rouge, vert et bleu d'un pixel de coordonnées \((x, y)\).

Saisir, analyser et tester ce code:

from PIL import Image
image = Image.open('bebe-yoda.jpg')
image.putpixel((0, 0), (255, 0, 0))
image.show()
Faites vous plaisir (surtout de bon matin !), et cherchez ce pixel.

Pour récupérer le nombre de pixels en largeur et en Hauteur :

(L, H) = image.size

Exercice 1

Faites un petit drapeau français sur 6 pixels :

from PIL import Image
image = Image.open('drapeau.png')
image.show()
from PIL import Image

image = Image.new('RGB', (3, 2))
image.putpixel((0, 0), (5, 20, 64))
# COMPLETER ICI
image.save("drapeau-français.png")

Pensez à zoomer, l’image est très petite.

Dans les exercices suivants vous devez utiliser des boucles imbriquées (pas des fonctions de la librairie pillow).
Essayez de créer vos propres fonctions.

Exercice 2

Pour pouvoir manipuler les images, il est nécessaire de parcourir l'ensemble de tous les pixels. On utilise pour ce faire deux boucles imbriquées sur les index d'abscisse et d'ordonnée de chaque pixel comme dans l'exemple ci-dessous :

from PIL import Image
image = Image.open('bebe-yoda.jpg')
image.show()
(L, H) = image.size
for x in range(L):
    for y in range(H):
        image.putpixel((x, y), (0, 0, 255))
image.show()

On vient de recolorier tous les pixels en bleu, ce qui n'a aucun intérêt.

Vous pouvez créer une nouvelle image de cette manière :

nouvelle_image = Image.new('RGB', (100, 100))

On cherche à obtenir un négatif de l'image, ce que nous voulons, c'est une fonction qui transforme :

  • 0 en 255
  • 1 en 254
  • 2 en 253 ...

Transformer l'image en son négatif.

Exercice 3

Transformer l'image en sa symétrique par rapport à l'axe vertical central de l'image comme ci-dessous :

Image

coord

Image symétrique

coord

Exercice 4

Le cercle trigonométrique :

coord

Tourner l'image d'un quart de tour dans le sens trigonométrique.

Bravo, vous avez terminé ce TP, envoyez moi votre travail sur école directe et travaillez sur votre projet.