Thème 7 - Photographie numérique

Traitement avec python

Télécharger cette archive et la décompresser dans votre répertoire de travail.
Elle contient les images et scripts nécessaires pour traiter les parties suivantes.

1. Ouverture d'une image

La définition de l'image est le nombre de pixels qui la compose.
Code 1 :
from PIL import Image
img = Image.open("sernin.jpg")
largeur, hauteur = img.size
print("largeur de l'image :", largeur, "pixels")
print("hauteur de l'image :", hauteur, "pixels")
image sernin.jpg
Description des lignes du programme ci-dessus :
  • Ligne 1 : Importe la bibliothèque PIL (ou Pillow) permettant de traiter les images.
  • Ligne 2 : Ouvre le fichier image "sernin.jpg" et l'affecte à la variable img.
  • Ligne 3 : Crée les variables dont le nom est assez explicite : largeur et hauteur.
  • Ligne 4 et 5 : Affiche du texte dans la console (partie sombre de l'éditeur).
  1. Lancer le programme code_01.py pour observer le résultat.
  2. Modifier le code pour afficher les dimensions de l'autre image disponible nommée chat.jpg.
  3. La définition de l'image est le nombre de pixels qui la compose. Modifier le code afin de calculer la définition de l'image.
  4. Faire vérifier par le professeur.
image chat.jpg

2. Modification des pixels de l'image

En python, le pixel de coordonnée (0, 0) est en haut à gauche.
070105.png
Code 2 :
from PIL import Image
img = Image.open("couleur.png")
r, v, b = img.getpixel((0, 0))
print("RVB :", r, v, b)
Description des lignes du programme ci-dessus :
  • Ligne 1 : Importe la bibliothèque PIL (ou Pillow) permettant de traiter les images.
  • Ligne 2 : Ouvre le fichier image couleur.png et l'affecte à la variable img.
  • Ligne 3 : Extraction des valeurs des trois composantes du pixel (0, 0) soit le pixel de la 1re colonne et de la 1re ligne.
  • Ligne 4 : Affiche le résultat dans la console.
070106.png
  1. Vérifier que le pixel de coordonnée (0, 0) est bien en haut à gauche.
  2. Modifier le code afin de retrouver le code RVB des 5 autres zones de couleurs de l'image (l'image est de 30×30 pixels).
  3. Faire vérifier par le professeur.
Code 3 :
from PIL import Image
largeur = 200
hauteur = 100
img = Image.new('RGB', (largeur, hauteur))

# Balayage de tous les pixels de l'image
for y in range(hauteur): # Balayage des lignes
    for x in range(largeur): # Balayage des colonnes
        img.putpixel((x, y), (255, 0, 0))

img.show()
img.save("rectanglerouge.png", "PNG")
Description des lignes du programme ci-dessus :
  • Ligne 4 : Création d'une image en mode RVB (RGB en anglais) de 200 pixels de largeur et 100 pixels de hauteur.
  • Ligne 7 : Pour y allant de 0 à 99 (=hauteur). C'est une boucle FOR permettant un balayage de toutes les lignes de l'image.
  • Ligne 8 : Pour x allant de 0 à 199 (=largeur). C'est une boucle FOR permettant un balayage de toutes les colonnes de l'image. Les deux boucles sont imbriquées l'une dans l'autre permettant de balayer tous les pixels de l'image.
  • Ligne 9 : Coloration du pixel de coordonnée (x, y) avec les valeurs RVB (255, 0, 0).
  1. Modifier le code pour créer une image bleue.
    from PIL import Image
    largeur = 200
    hauteur = 100
    img = Image.new('RGB', (largeur, hauteur))
    
    for y in range(hauteur):
        for x in range(largeur):
            img.putpixel((x, y), (0, 0, 255))
    
    img.show()
    img.save("rectanglebleu.png", "PNG")
  2. Modifier le code pour créer une image jaune.
  3. Modifier le code pour colorer en rouge seulement la moitié supérieure de l'image. (Pour obtenir la division entière d'un nombre en python, il faut utiliser le double-slash //)
  4. Faire vérifier par le professeur en lui montrant une image à moitié rouge et à moitié jaune.
Code source (modification) :
Mémorisation 0x - Réussite 0/0
Où se situe généralement l'origine des coordonnées des pixels d'une image ?
Cocher la bonne réponse.

3. Application : Conversion en niveaux de gris

Une technique pour convertir une image en niveau de gris est de réaliser la moyenne des trois composantes RVB du pixel et d'affecter cette moyenne aux trois composantes RVB.

Attention : Les composantes doivent être des nombres entiers. Pour cela il y a toujours le double-slash // pour réaliser la division entière ou bien la fonction int() qui renvoie la partie entière de ce qui lui ait donné en argument.

Code 4 :
from PIL import Image
img = Image.open("occitanie.jpg")
largeur, hauteur = img.size
for y in range(hauteur):
    for x in range(largeur):
        r, v, b = img.getpixel((x, y))
        r = r # Ligne à modifier
        v = v # Ligne à modifier
        b = b # Ligne à modifier
        img.putpixel((x, y),(r, v, b))
img.show()
img.save("image_modif.png", "PNG")
  • Modifier les lignes 7, 8 et 9 du code ci-dessous afin de convertir l'image colorée en image en niveau de gris.
  • Modifier les lignes 7, 8 et 9 du code ci-dessous pour réaliser d'autres effets sur l'image.

4. Application : Presque comme Snapchat !

Pour faire presque comme Snapchat, programmer votre propre filtre Snapchat permettant d'ajouter une auréole sur la tête du chat.
Pour cela, il faut :
  • ouvrir les deux images "aureole.jpg" et "chat.jpg". Ces deux images ont la même définition de 300x366 pixels.
  • copier les 91 premières lignes de pixels de l'image aureole.jpg (soit 1/6 de sa hauteur) sur l'image chat.jpg.
image chat.jpg
image aureole.jpg