Retoucher une photo numérique avec Python

  • Post last modified:7 janvier 2022
  • Temps de lecture :8 min de lecture
  • Post category:Seconde / SNT

Comparé aux photographies d’antan, la photographie numérique présente un coût marginal très faible et une diffusion par internet facile et immédiate. Cela est du aux algorithmes de développement, d’amélioration de l’image brute, d’aide à la prise de vue. Ils permettent d’automatiser les taches les plus complexes en travaillant pixel par pixel.

Les logiciels comme Gimp ou Photoshop font très intuitivement les différentes opérations sur les photos numériques. Mais comment ces logiciels fonctionnent-ils ? Ce cours propose de vous montrer comment des algorithmes simples, écrits avec Python, permettent de retoucher des photos.

Objectifs en classe de seconde SNT

A voir dans ce cours

Autres cours à consulter

Capacités et compétences travaillées

Présentation de la bibliothèque PIL

from PIL import Image

PIL = Python Imaging Library. La bibliothèque pour retoucher les images numériques. Le code ci-dessus indique que, de la bibliothèque PIL, nous n’utiliserons que les modules appelés « Image ».

Exemples de fonctions utiles

  • Image.open ( « titre.jpg » ) : permet d’ouvrir un fichier image pour le modifier.

Afin de modifier et d’exploiter notre photo numérique, elle doit être déclarée comme une variable : img = Image.open (« Titre.jpg« )

  • img.getpixel ( (X,Y) ) : permet de récupérer les attributs du pixel (R, V, B) aux coordonnées (X,Y) de la photo numérique.
  • img.save ( « Nouveau titre.jpeg », « jpeg ») : permet de sauvegarder dans le même dossier que le fichier python la nouvelle image au format *.jpeg

Les coordonnées des pixels avec PIL

Exemple de coordonées de pixels pour la bibliothèques PIL

Attention : Le tout premier pixel (1ière colonne, 1ière ligne) aura comme coordonnées (X, Y) = (0, 0). Il y aura donc un décalage à prendre en compte. 

Exemple : quelles sont les coordonnées du pixel à la 16ième colonne, 9ième ligne ? Réponse : (15, 8)

Pour aller plus loin

Si vous souhaiter accéder à davantage de fonctionnalité, reportez vous à cette page web :

Source – he-arc.github.io/

Obtenir des informations sur les pixels

Ci-dessous une photo de la Terre pixelisée en couleurs RVB 24 bits dont la définition est de 8 x 8 = 64 pixels

L’image est floutée car elle a du être agrandie pour être visible sur cette page web.

  • Téléchargez-la et enregistrez-la dans un de vos dossiers.
  • L’ouvrir avec un logiciel photo (« Paint » par exemple)
  • Vous serez obligé de zoomer (Ctrl + molette de la souris OU les 2 doigts sur téléphone portable) pour visualiser les 64 pixels colorés.

Exercice 1 : Information sur un seul pixel

  • Ouvrir votre éditeur python préférée. Par exemple : Spyder.
  • Commencer par créer votre fichier python en le sauvegardant dans le même dossier que la photo à traiter.
  • Écrire le code qui permet d’obtenir les attributs (couleurs) qui composent le pixel à la 5ième colonne, 5ième ligne de la photo « Terre-pixelisée-colorée.jpg » (si vous n’y arrivez pas, suivez les étapes ci-dessous)
  • Exécuter votre code à la fin pour le faire fonctionner.

Etape 1 : Importer la bibliothèque présentée précédemment.

from PIL import Image 

Etape 2 : Faire ouvrir par python le fichier image « Terre pixélisée colorée.jpg »

img = Image.open("Terre pixélisée colorée.jpg")

Etape 3 : Récupérer les attributs Rouge, Vert et Bleu du pixel à la 5ième colonne, 5ième ligne.

r, v, b = img.getpixel( (4 , 4) )

Etape 4 : Afficher sur la console le résultat des 3 composantes colorées du pixel.

print ("canal rouge : ",r, "canal vert : ",v, "canal bleu : ",b)

Changer un pixel

Nous travaillerons toujours avec la photo de la Terre pixelisée en couleurs RVB 24 bits dont la définition est de 8 x 8 = 64 pixels

Exercice 2 : Changer la couleur d'un pixel

  • Écrire le code qui permet de colorer en jaune le pixel se trouvant à la 2ième colonne, 6ième ligne.

IMPORTANT : pensez à enregistrer votre code python dans le même dossier que votre photo.

Etape 1 : Importer la bibliothèque présentée précédemment.

from PIL import Image 

Etape 2 : Faire ouvrir par python le fichier image « Terre pixélisée colorée.jpg »

img = Image.open("Terre pixélisée colorée.jpg")

Etape 3 : Colorer le pixel (2ième colonne, 6ième ligne) en jaune.

img.putpixel( (1,5) , (255,255,0) )

Etape 4 : Ouvrir la nouvelle image.

Explorer tous les pixels : la boucle "for"

Les algorithmes nous permettent d’automatiser des taches simples ou complexes à un nombre importants données. Ici, nous souhaitons changer ou connaitre les attributs de tous les pixels de notre photo numérique. Pour y arriver sans écrire un nombre important de ligne de code, nous allons utiliser une fonctionnalité puissante des codes de programmation : la boucle « for ».

Pour la suite, nous travaillerons toujours avec la photo de la Terre pixelisée en couleurs RVB 24 bits dont la définition est de 8 x 8 = 64 pixels

Exercice 3 : Obtenir les informations de tous les pixels

  • Copier-coller le code ci-dessous dans votre IDLE ou votre logiciel python (Spyder par exemple).

IMPORTANT : pensez à enregistrer votre code python dans le même dossier que votre photo.

from PIL import Image

img = Image.open("Terre pixélisée colorée.jpg")

largeur_image = 8
hauteur_image = 8

for y in range(hauteur_image):
    
    for x in range(largeur_image):

        r, v, b = img.getpixel( (x,y) )

        print("rouge : ", r, "vert : ", v, "bleu : ",b)
        
print("fin")

Travail :

  1. Que permet de faire ce script python ?
  2. A quoi les boucles for servent-elles ?

Exercice 4 : Changer de couleur tous les pixels

  • En complétant le code python ci-dessous, proposer un code qui permette de changer de couleur tous les pixels de notre photo numérique.
from PIL import Image

img = Image.open("Terre pixélisée colorée.jpg")

largeur_image = 8
hauteur_image = 8

for y in range(hauteur_image):
    
    for x in range(largeur_image):
        
        r, v, b = img.getpixel((x,y))
        
        
        
        
        
        
        img.putpixel((x,y),( . . . . .  . . . .))

img.show()

Laisser un commentaire