Aller au contenu

Renversant

Dans cette page, on continue à travailler sur les images avec le module PIL, et notamment sur les tuples utilisés dans ce contexte: le couple des dimensions de l'image, les couples de coordonnées (colonne, ligne) des pixels, et les tuples définissant la couleur des pixels,

Symétrie axiale

On travaille avec cette image à télécharger.

L'exercice consiste à fabriquer une nouvelle image à partir de celle-ci. Cette nouvelle image sera obtenue par symétrie de la précédente par rapport à la droite horizontale coupant l'image au milieu... En d'autres termes:

  • la ligne en haut de l'image devient la ligne du bas (les pixels sont par contre dans le même ordre de gauche à droite),
  • la ligne 2 en partant du haut devient la ligne 2 en partant du bas,
  • etc...

Un début de code à compléter (en utilisant getpixel et putpixel déjà utilisés dans les pages précédentes).

from PIL import Image

# ouverture de l'image:
source = Image.open('ange.png')

# récupération de ses dimensions :
largeur, hauteur = source.size

# ouverture d'une nouvelle "image"
# codée en RGB, de mêmes dimensions que la précédente:
but = Image.new("RGB",(largeur,hauteur))


# boucle de parcours des pixels de l'image source
# et de placement dans la nouvelle image:

PARTIE DE CODE A ECRIRE


# sauvegarde de l'image créée :
but.save("renversee.png")
# on montre l'image :
but.show()
Solution

Un code:

from PIL import Image

# ouverture de l'image:
source = Image.open('ange.png')

# récupération de ses dimensions :
largeur, hauteur = source.size

# ouverture d'une nouvelle "image":
but = Image.new("RGB",(largeur,hauteur))

# boucle de parcours des pixels de l'image source
# et de placement dans la nouvelle image:
for lig in range(0, hauteur):
    for col in range(0, largeur):
        # on récupère la couleur d'un pixel:
        p = source.getpixel((col, lig))
        # on la place dans la nouvelle image:
        but.putpixel((col, hauteur-lig-1),p)


# sauvegarde de l'image créée :
but.save("renversee.png")
# on montre l'image :
but.show()

Symétrie centrale

On travaille maintenant avec cette image à télécharger.

L'objectif est de créer une nouvelle image à partir de celle-ci mais cette foisen lui faisant subir une symétrie centrale.

En d'autres termes:

  • la ligne du haut devient la ligne du bas, mais en plus les pixels sont réécrits de droite à gauche,
  • la ligne 2 du haut devient la ligne 2 en partant du bas, pixels inversés de droite à gauche,
  • etc...

A vous d'écrire le code.

Solution

Un code:

from PIL import Image

# ouverture de l'image:
source = Image.open('fauxvrai.png')

# récupération de ses dimensions :
largeur, hauteur = source.size

# ouverture d'une nouvelle "image":
but = Image.new("RGB",(largeur,hauteur))

# on modifie les données de certains pixels dans source:
for lig in range(0, hauteur):
    for col in range(0, largeur):
        # on récupère la couleur d'un pixel:
        p = source.getpixel((col, lig))
        # on la place dans la nouvelle image:
        but.putpixel((largeur-col-1, hauteur-lig-1),p)


# sauvegarde de l'image créée :
but.save("renversee.png")
# on montre l'image :
but.show()
Note

Utilisez ce petit programme pour résoudre l'énigme suivante:

quel est le numéro de la place de parking de la voiture garée ?

parking