Bloc-notes
Math Lycée
Info Lycée
Menu contextuel
Mona Lisa (Fiche élève)
[MIE710]

Dans cette activité vous allez apprendre à manipuler une image bitmap à l'aide de la biliothèque Numpy de Python.

Partie A — Boucles imbriquées

(a)
Copiez le fichier « mona-lisa.jpeg » dans un dossier de travail.
(b)
Que fait le programme ci-dessous ?
import Image        # Pour lire et écrire des images dans un fichier
import numpy as np  # Pour manipuler des tableaux de nombres

image = Image.open('mona-lisa.jpeg')
pixels = np.array(image)
for y in range(176, 190):
    for x in range(80, 134):
        pixels[y, x] = np.array([255, 0, 0])
image2 = Image.fromarray(pixels)
image2.save('mona-lisa2.jpeg')
Créez ce programme, exécutez-le et observez son effet.
(c)
Modifiez le programme afin de remplacer la zone rouge par du vert. Remplacer ensuite le vert par du jaune.
(d)
Modifiez le programme afin d'insérer des petits carrés oranges au niveaux des yeux.
(e)
Modifiez le programme afin d'ajouter une grande croix rouge en forme de $X$ dont les extrémités sont localisées aux quatre coins de l'image.

Partie B — Calcul vectoriel

La bibliothèque Numpy dispose d'une syntaxe qui permet d'éviter parfois l'écriture de boucles imbriquées. Ainsi, le programme ci-dessus peut aussi s'écrire sous cette forme :
import Image        # Pour lire et écrire des images dans un fichier
import numpy as np  # Pour manipuler des tableaux de nombres

image = Image.open('mona-lisa.jpeg')
pixels = np.array(image)
pixels[176:190, 80:134] = np.array([255, 0, 0])
image2 = Image.fromarray(pixels)
image2.save('mona-lisa2.jpeg')
Voici quelques exemples d'utilisation :
pixels[5, 7, 0] = 255   # Canal 0 du pixel (5, 7) mis à 255
pixels[5, 7, 1:3] = 128 # Canaux 1 à 2 du pixel (5, 7) mis à 128
pixels[9, :, 1] = 100 # Canal 1 des pixels de la ligne 9 mis à 100
np.mean(pixels[6, 4]) # Renvoie la moyenne des 3 canaux du pixel (6, 4)
np.mean(pixels[:, 7, 1]) # Renvoie la moyenne du canal 1 de la colonne 7
# La ligne suivante crée un tableau 256x256x3 contenant des 0
pixels2 = np.zeros((256, 256, 3), dtype=np.uint8)
# La ligne suivante crée une copie du tableau `pixels`
pixels2 = np.copy(pixels)
1.
On obtient des tons gris lorsque les trois canaux ont la même valeur. Une façon de transformer une image couleur en niveaux de gris consiste à donner comme valeur commune aux trois canaux la valeur moyenne de ces trois canaux.

Écrivez un programme qui transforme l'image de Mona Lisa en une image en niveaux de gris.
2.
Chaque pixel (sauf ceux sur le bord) est le centre d'un petit carré de cinq pixels de côté.

Quel effet obtient-on si, pour chaque canal, on remplace la valeur de chaque pixel par la moyenne des valeurs des 25 pixels du carré ?

Vérifiez votre conjecture en écrivant un programme qui réalise cette transformation.

Partie C — Mona Lisa au photomaton

Regardez attentivement la série de 9 images $A, B, C, D, E, F, G, H, I$ 1. Chacune a été obtenue à partir de la précédente en réduisant la taille de l'image de moitié ce qui a donné quatre morceaux analogues qu'on a placés en carré pour obtenir une image ayant la même taille que l'image d'origine. Le nombre de pixels a été exactement conservé et en fait on a seulement déplacé les pixels pour avoir quatre réductions de l'image initiale. Cette transformation s'appelle la transformation du photomaton.

L'image $B$ comporte 4 Mona Lisa. L'image $C$ en comporte 16. L'image $D$ en comporte 64, etc. Il se produit quelque chose d'étrange car, au bout de neuf étapes, l'image de Mona Lisa est réapparue. Précisons que c'est bien la même transformation qui a été utilisée pour déduire les unes après les autres les images de la série.

Les deux questions suivantes sont liées. Réfléchir sur l'une revient aussi à réfléchir sur l'autre.
(a)
Comment expliquez-vous la réapparition de l'image initiale ?
(b)
Écrivez un programme qui effectue la transformation.



1 Cette activité est issue d'un article de Jean-Paul Delahaye publié dans la revue Accromath.


Denis Pinsard -- Mis à jour le mercredi 16 octobre 2013

Infos site
Visites

 0 visiteurs

 2 visiteurs en ligne

Calendrier
^ Haut ^