Télécharger le dossier de travail: TP_rotation_image.zip
Coder une image numérique
Qu’est ce qu’une image numériques?
Rappels de SNT: Une image numérique est constituée de pixels colorés (ou noirs et blanc). Le fichier comportant l’image numérique contient alors une succession de valeurs qui codent la couleur de chaque pixels: lire le cours de SNT, paragraphe codage de l'image
Librairie PIL
Pour manipuler les images, nous pouvons utiliser le module PIL de Python. Celui-ci permet de traiter les pixels d’une image, un par un. Souvent, il faudra parcourir l’image pixel par pixel, sur toute la largeur et toute la hauteur. Cela est possible avec deux boucles imbriquées, à condition de connaitre ses dimensions largeur, hauteur:
from PIL import Image
imageSource=Image.open("crabePortrait.bmp")
largeur,hauteur=imageSource.size
for y in range(hauteur): # y varie de 0 à hauteur - 1
for x in range(largeur): # x varie de 0 à largeur - 1
# traitement pixel (x,y)
Les boucles for vont effectuer un parcours:
- sur y (position en hauteur qui varie de 0 à hauteur-1)
- sur x (position en largeur qui varie de 0 à largeur-1)
Le pixel (0,0) est en haut sur le coin gauche.
imageSource est une instance de la classe Image et possède une methode getpixel((x,y)) qui renvoie la valeur du pixel pour l’argument (x,y). S’utilise de la manière suivante:
# lecture
p = imageSource.getpixel((x,y))
# ecriture
planPixels.putpixel((x,y),p)
Manipuler les pixels de l’image
Nous allons travailler sur l’image suivante: crabePortrait.bmp.
image de dimension 247 * 330 en format bitmap, RGB 3 octets
Défi n°1: explorer la structure de données
A vous de jouer: ouvrir le fichier
rotation_crabe.py, analyser le script, puis, à l’aide de la fonctioncopie_image, faire une copie de l’imagecrabe_portrait.bmp
Vérifier le contenu des données pour quelques uns des points de l’image: afficher la valeur de p si x < largeur//10 et y < hauteur //10
Laquelle des structures de données représente le mieux le format des données:
[124,90,120](124,90,120)#7C5A78?
Rotation d’une image: permutation de pixels
Défi n°2: Coordonnées pour une rotation droite
principe de la rotation horaire d'un quart de tour
Répondre aux Questions:
- Quelles sont les coordonnées des points A et B avant transformation?
- Quelles sont les nouvelles positions des points A’ et B’ après transformation: Pour un pixel situé initialement en (x,y), quelles sont ses coodonnées (x’,y’) après transformation?
Défi n°3: Rotation droite d’une image
En vous inspirant de la fonction copie_image, écrire une fonction rotation_droite qui réalise la rotation d’un quart de tour dans le sens horaire, comme sur l’image ci-dessus.
Permuter les zones d’une image
On cherche maintenant à effectuer cette transformation, SANS utiliser de nouvelle image planPixels comme précédemment.
On utilisera l’image suivante (carrée) pour cette méthode: woody.jpg
image woody.jpg
Le fichier de travail sera rotation_woody.py
Défi n°4: permutation de blocs
la fonction echange_quadrant permet d’echanger les pixels de 2 zones carrées de même dimensions.
exemple: echange des blocs A et B
Les zones échangées seront les 4 parties marquées A, B, C et D sur l’image ci-dessous.
image d'origine
Pour effectuer une rotation droite dans l’image, on va effectuer 3 permutations SUCCESSIVES sur les zones ABCD de l’image:
trois permutations réalisées sur les subdivisions de l'image
- Pour échanger les zones A et B d’une image, et visualiser le résultat, utiliser la fonction
permutation_blocs_A_B.- Ecrire les fonctions
permutation_blocs_B_Detpermutation_blocs_C_D. Appliquer les transformations pour obtenir une rotation droite des blocs de l’imagewoody.jpg.
Rotation par la méthode Diviser pour Régner
La fonction rotate permet de faire tourner l’image d’un quart de tour par une méthode de type diviser pour régner:
Tourner l’image d’un quart de tour, c’est permuter les 4 parties d’une image dont on a permuté l’interieur de ses 4 parties…
Une fois la partie divisée executée (appels recursifs), lorsque les subdivisions de l’image sont constituées d’un seul pixel, les pixels sont déplacés (règne) à l’aide de 3 permutations successives, selon le schéma suivant:
trois permutations réalisées sur les subdivisions de l'image
Il sont alors recombinés pour reformer l’image, tout en suivant les mêmes permutations, mais avec des blocs de pixels plus gros (fusion).
Le but est d’obtenir l’image suivante, à l’aide de la fonction quart_tour:
image finale
Défi n°5: rotation d’une image par la méthode Diviser pour régner
- Compléter la fonction
rotatepour obtenir une image à l’endroit dewoody.- Expliquer pourquoi cette méthode s’apparente à la famille Diviser pour régner. (On pourra s’aider des schémas ci-dessous, et les remettre dans l’ordre pour repondre).
image a
image b
image c
image d
efficacité de la méthode
Evaluons l’efficacité de cet algorithme
- Est-il plus rapide ou plus lent que votre premier algorithme?
- Le nombre d’opérations significatives suit une loi de recurence: $T(n) = 4 \times T(\tfrac{n}{2}) + C \times n^2$ Cela confirme t-il votre reponse à la question pécédente?
On rappelle que l’intérêt de la méthode est surtout de ne PAS utiliser de nouvelle image planPixels comme précédemment. Il s’agit d’une transformation en place.
Liens et aides
- En cas de difficulté, consulter la page et les videos du site: monlyceenumerique.fr, aller à la partie sur la rotation des images.
