Aller au contenu

Rotation d'une image⚓︎

Manipulation d'une image⚓︎

Le module pillow

Pour manipuler les images, nous allons utiliser le module pillow de Python. Pour cela, il faut mettre la ligne suivante au début de votre fichier :

from PIL import Image

Vous pouvez utiliser l'image fractale.jpg.

l'image de fractale


Afin de charger une image, il faut utiliser l'instruction suivante :

image = Image.open("fractale.jpg")

La variable image contient un objet qui contient toutes les informations de l'image.


Pour la visualiser, il faut utiliser l'instruction :

image.show()

Avec Thonny, cela ouvre une fenêtre contenant l'image. Ici, il faudra regarder en dessous de l'IDE.


Afin de manipuler l'image, vous pouvez utiliser les deux lignes suivantes :

largeur, hauteur = image.size
pixels = image.load()

La première ligne permet d'obtenir les dimensions de l'image et la deuxième crée une matrice contenant les pixels de l'image.

L'objet pixels fonctionne comme un tableau à deux dimensions contenant chacun des pixels. Les coordonnées fonctionnent de la manière suivante :

coordonnées

Les coordonnées du pixel en bas à droite sont (largeur-1, hauteur-1).


Pour obtenir la valeur d’un pixel ou la modifier, il faut écrire :

couleur = pixels[5, 2]  # x=5 et y=2

Le module pillow utilise une autre notation pour les tableaux qui permet d'écrire pixels[x, y].


Les couleurs sont généralement soit des triplets (r, g, b), avec chacune des valeurs qui est un entier entre 0 et 255, ou des quadruplets (r, g, b, a), où a correspond à l'opacité (0 pour invisible à 255 pour opaque). Dans le premier cas, l'image est en mode RGB et dans le deuxième elle est en RGBA.

De la même manière, on peut changer la couleur d'un pixel :

pixels[5, 2] = (255, 125, 38)  # si l'opacité n'est pas ajoutée elle sera mise à 255

Pour créer une nouvelle image, il faut utiliser la syntaxe suivante :

image2 = Image.new("RGBA", (hauteur, largeur))

Enfin, après avoir manipulé l'image, vous pouvez la sauvegarder ainsi :

image2.save("bonjour.png")

Sur le site, si vous voulez la télécharger, vous devrez utiliser cette fonction, après avoir enregistré l'image :

telecharger("bonjour.png")
Exercice 1

Tester le module pillow.

Vous pouvez décommenter les différentes parties afin de tester leur effet.

from PIL import Image
image = Image.open("fractale.jpg")
image.show()
largeur, hauteur = image.size
print(f"L'image a pour dimension {largeur}x{hauteur}")
pixels = image.load()
x, y = 5, 2
couleur = pixels[x, y]
print(f"Le pixel aux coordonnées {(x, y)} a pour couleur {couleur}")
image2 = Image.new("RGBA", (largeur, hauteur))
pixels2 = image2.load()
for x in range(largeur):
for y in range(hauteur):
pixels2[x, y] = couleur
image2.save("nouvelle_image.png")
#image2.show()
#telecharger("nouvelle_image.png")
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
rounded
>>> 
 
x
x
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Votre figure

Votre tracé sera ici

Rotation naïve⚓︎

Exercice 2 (sur papier)

Pour faire une rotation d’un quart de tour, on peut créer une nouvelle image en inversant la hauteur et la largeur et ensuite copier tous les pixels.

rotation naïve

  1. Déterminer les coordonnées du pixel correspondant à (0, 0) dans l'image d'origine.

    Solution

    (h-1, 0)

  2. Déterminer les coordonnées du pixel correspondant à (l-1, h-1) dans l'image d'origine.

    Solution

    (0, l-1)

  3. Déterminer les coordonnées du pixel correspondant à (0, h-1) dans l'image d'origine.

    Solution

    (0, 0)

  4. Déterminer les coordonnées du pixel correspondant à (l-1, 0) dans l'image d'origine.

    Solution

    (h-1, l-1)

  5. Déterminer les coordonnées du pixel correspondant à (x1, y1) dans l'image d'origine.

    Solution

    (h-1-y1, x1)

Exercice 3

Compléter le code de la fonction rotation_naive qui prend en paramètre le nom d'un fichier, qui effectue cette rotation sur l'image correspondant au fichier.

from PIL import Image
image = Image.open("fractale.jpg")
def rotation_naive(image):
largeur, hauteur = image.size
pixels = image.load()
image2 = Image.new("RGBA", (..., ...))
pixels2 = image2.load()
for x in range(largeur):
for y in range(hauteur):
pixels2[..., ...] = pixels[x, y]
return image2
image2 = rotation_naive(image)
#image2 = rotation_naive(image2)
image2.show()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
rounded
>>> 
 
x
x
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution
def rotation_naive(image):
    largeur, hauteur = image.size
    pixels = image.load()
    image2 = Image.new("RGBA", (hauteur, largeur))
    pixels2 = image2.load()
    for x in range(largeur):
        for y in range(hauteur):
            pixels2[hauteur-1-y, x] = pixels[x, y]
    return image2

Votre figure

Votre tracé sera ici