Aller au contenu

Une image

On travaille ici sur cette image.

Note

On rappelle qu'une image est constituée de pixels.

Une image de largeur 400 et de hauteur 600 peut-être considérée comme une grille de largeur 400 et hauteur 600, chaque cellule de cette grille étant un pixel.

Chaque pixel possède une couleur. Ces couleurs seront manipulées à partir de leur code RGB (relire au besoin le codage RGB dans le cours sur html et css).

Obtenir les couleurs des pixels

Pour obtenir des informations sur l'image, on utilisera le module PIL.

Voici un script vous montrant ce dont on aura besoin ici (le fichier feux.png doit se trouver dans le même répertoire que le script python):

from PIL import Image

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

# récupération de ses dimensions :
largeur, hauteur = source.size
print(f"Le nombre de colonnes est {largeur}, le nombre de lignes est {hauteur}.")


# récupération de la couleur du pixel du coin supérieur gauche:
couleur_coin_haut_gauche = source.getpixel((0,0))
# récupération de la couleur du pixel du coin inférieur droit:
couleur_coin_bas_droit = source.getpixel((largeur-1,hauteur-1))


print(f"Le pixel en haut à gauche (colonne 0, ligne 0) a pour couleur {couleur_coin_haut_gauche}.")
print(f"Le pixel en bas à droite (colonne {largeur-1}, ligne {hauteur-1}) a pour couleur {couleur_coin_bas_droit}.")

Ce script affiche:

Le nombre de colonnes est 500, le nombre de lignes est 500.
Le pixel en haut à gauche (colonne 0, ligne 0) a pour couleur (255, 255, 255).
Le pixel en bas à droite (colonne 499, ligne 499) a pour couleur (255, 255, 255).

Cela signifie que l'on a une image de largeur 500 pixels, de hauteur 500 pixels.

La couleur du pixel haut gauche (colonne 0, ligne 0) est (255, 255, 255) ((composante de rouge, composante de vert, composante de bleu), il s'agit d'une couleur au format RGB qui correspond au blanc).

La couleur du pixel bas droit (colonne = largeur-1, ligne = hauteur-1) est (255, 255, 255).

Rappel

Dans le code RGB, chaque composante de rouge, vert, bleu peut varier entre 0 et 255. La couleur (255, 255, 255) correspond à blanc.

Les tuples liés à l'image

Avec PIL, on a donc pour chaque pixel deux tuples importants:

  • celui de son couple de coordonnées (colonne, ligne)
  • celui de sa couleur (rouge, vert, bleu).

On a également un tuple important pour l'image: le couple (largeur, hauteur).

Exercice 1

Écrire une fonction python qui renverra les coordonnées du sommet haut du triangle.

Le principe:

Parcourir les pixels ligne par ligne, chaque ligne étant parcourue de gauche à droite.
S'arrêter dès que l'on a obtenu un pixel dont la couleur n'est pas blanche.
Renvoyer les coordonnées de ce pixel.

Quelle est la couleur de ce pixel?

Aide: tant que le pixel est blanc

La condition "tant que le pixel est blanc" pourra se traduire par:

while source.getpixel((colonne,ligne)) == (255,255,255):

où colonne et ligne sont deux variables à faire évoluer, colonne entre 0 et largeur-1, ligne entre 0 et hauteur-1 (où largeur est la largeur de l'image et hauteur sa hauteur).

Aide: faire évoluer colonne et ligne

Pour parcourir les lignes de l'image une à une, on utilise deux variables ligne et colonne de façon à ce que le couple (colonne, ligne) prennent toutes les valeurs possibles (coordonnées des pixels dans l'image).

Les variables colonne et ligne débutent toutes deux à 0.

  • colonne est incrémentée tant que colonne < largeur - 1
  • et lorsque colonne vaut largeur - 1, on doit passer à la ligne suivante:
    • on remet donc colonne à 0
    • et on incrémente ligne.
Une résolution

On parcourt l'image de haut en bas et de gauche à droite. Le premier pixel dont la couleur n'est pas (255, 255, 255) sera considéré comme le sommet haut du triangle.

from PIL import Image

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

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



def sommetTriangleHaut():
    """
    Parcourt le fichier image de haut en bas et de gauche à droite.

    Renvoie les coordonnées du premier pixel rencontré 
    de couleur distincte de (255, 255, 255).
    """

    ligne = 0
    colonne = 0

    while source.getpixel((colonne,ligne)) == (255,255,255):
        if colonne < largeur-1:
            colonne += 1
        else:
            colonne = 0
            ligne += 1

    return (colonne, ligne)



print(sommetTriangleHaut())

On obtient le pixel de coordonnées (249, 20).

Si on ajoute, dans le script, la ligne:

print(source.getpixel(sommetTriangleHaut()))
on constate que sa couleur est un gris clair: (245, 245, 245).

Exercice 2

On ajoute au script précédent, le code suivant:

for i in range(largeur):
    if source.getpixel((i, 20)) != (255, 255, 255):
        print(i)

Qu'obtient-on? Comment interprétez vous cela?

Une réponse

On obtient:

249
250
Cela signifie que le sommet de notre triangle est en fait constitué de deux pixels, le pixel (249, 20) et le pixel (250, 20).

Remarque

Vous pouvez visualiser le résultat en ouvrant l'image avec GIMP. Dans le menu "Affichage", sélectionnez "Zoom 16:1". Déplacez vous sur les pixels du sommet, les coordonnées s'affichent dans le bas de la fenêtre logiciel.

Exercice 3

Obtenir de même les coordonnées du sommet gauche du triangle et celles du sommet droit.

Aide

Au lieu de parcourir l'image ligne par ligne, on la parcourt maintenant colonne par colonne.

  • De gauche à droite pour le sommet gauche.
  • De droite à gauche pour le sommet droit.

A vous de traduire cela avec les modifications qui conviennent sur le code écrit pour le sommet haut.

Une réponse

On obtient les coordonnées (46, 364) pour le sommet gauche. On obtient les coordonnées (453, 364) pour le sommet droit.

from PIL import Image

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

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



def sommetTriangleHaut():
    """
    Parcourt le fichier image de haut en bas et de gauche à droite.

    Renvoie les coordonnées du premier pixel rencontré 
    de couleur distincte de (255, 255, 255).
    """

    ligne = 0
    colonne = 0

    while source.getpixel((colonne,ligne)) == (255,255,255):
        if colonne < largeur-1:
            colonne += 1
        else:
            colonne = 0
            ligne += 1

    return (colonne, ligne)




def sommetTriangleGauche():
    """
    Parcourt le fichier image de gauche à droite et de haut en bas.

    Renvoie les coordonnées du premier pixel rencontré 
    de couleur distincte de (255, 255, 255).
    """

    ligne = 0
    colonne = 0

    while source.getpixel((colonne,ligne)) == (255,255,255):
        if ligne < hauteur-1:
            ligne += 1
        else:
            ligne = 0
            colonne += 1

    return (colonne, ligne)


def sommetTriangleDroit():
    """
    Parcourt le fichier image de droite à gauche et de haut en bas.

    Renvoie les coordonnées du premier pixel rencontré 
    de couleur distincte de (255, 255, 255).
    """

    ligne = 0
    colonne = largeur-1

    while source.getpixel((colonne,ligne)) == (255,255,255):
        if ligne < hauteur-1:
            ligne += 1
        else:
            ligne = 0
            colonne -= 1

    return (colonne, ligne)