rotation quart de tour d'une image

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

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 fonction copie_image, faire une copie de l’image crabe_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

principe de la rotation horaire d'un quart de tour

Répondre aux Questions:

  1. Quelles sont les coordonnées des points A et B avant transformation?
  2. 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

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

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

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

trois permutations réalisées sur les subdivisions de l'image

  1. Pour échanger les zones A et B d’une image, et visualiser le résultat, utiliser la fonction permutation_blocs_A_B.
  2. Ecrire les fonctions permutation_blocs_B_D et permutation_blocs_C_D. Appliquer les transformations pour obtenir une rotation droite des blocs de l’image woody.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

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

image finale

Défi n°5: rotation d’une image par la méthode Diviser pour régner

  1. Compléter la fonction rotate pour obtenir une image à l’endroit de woody.
  2. 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 a

image b

image b

image c

image c

image d

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.