Header
🠖 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 tout au long de cette activité.

Ouverture d'une image

La définition de l'image est le nombre de pixels qui la compose.
Script 01 : 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
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 01_script.py de l'archive, 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
image chat.jpg
from PIL import Image img = Image.open("chat.jpg") largeur, hauteur = img.size definition = largeur*longueur print("largeur de l'image :", largeur, "pixels") print("hauteur de l'image :", hauteur, "pixels") print("définition de l'image :", definition, "pixels")

Modification des pixels de l'image

En python, le pixel de coordonnée (0, 0) est en haut à gauche.
070105.png
Script 02 : from PIL import Image img = Image.open("couleur.png") r, v, b = img.getpixel((0, 0)) print("RVB :", r, v, b)
image couleur.png
image couleur.png
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.
  1. Vérifier que le pixel de coordonnée (0, 0) est bien en haut à gauche.
  2. Modifier le 02_script.py (de l'archive) 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.
from PIL import Image img = Image.open("couleur.png") for pixel in [(0,0), (15,0), (30,0), (0,30), (15,30), (30,30)] : r, v, b = img.getpixel(pixel) print("pixel :", pixel) print("RVB :", r, v, b)
Script 03 : 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 du 03_script.py (de l'archive) pour créer une image bleue nommée rectanglebleu.png.
    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 du 03_script.py (de l'archive) pour créer une image carrée jaune carrejaune.png de 200 pixels de côté.
    from PIL import Image largeur = 200 hauteur = 200 img = Image.new('RGB', (largeur, hauteur)) for y in range(hauteur): for x in range(largeur): img.putpixel((x, y), (255, 255, 0)) img.show() img.save("carrejaune.png", "PNG")
  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 //)
    from PIL import Image largeur = 200 hauteur = 100 img = Image.new('RGB', (largeur, hauteur)) for y in range(hauteur//2): for x in range(largeur): img.putpixel((x, y), (255, 0, 0)) img.show() img.save("rectanglerougeamoitie.png", "PNG")
  4. Faire vérifier par le professeur en lui montrant une image à moitié rouge et à moitié jaune.
Thème 7 - Photographie numérique / 4 - Avec python 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.

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.

  1. Parmi les pixels (r, v, b) suivants, lesquels sont gris ? Classer ces pixels gris du plus sombre au plus clair.
    (128, 0, 0) ; (128, 128, 128) ; (0, 256, 0) ; (10, 10, 10) ; (96, 96, 96) ; (200, 200, 200)
    (10, 10, 10) < (96, 96, 96) < (128, 128, 128) < (200, 200, 200)
  2. Désaturer les pixels qui n'étaient pas gris dans la liste précédente et donner le nouveau classement.

    • (128, 0, 0) : on calcule (128+0+0)//3 soit 42, donc on obtient le pixel désaturé : (42, 42, 42)
    • (0, 256, 0) : on calcule (0+256+0)//3 soit 85, donc on obtient le pixel désaturé : (85, 85, 85)

    Classement :
    (10, 10, 10) < (42, 42, 42) < (85, 85, 85) < (96, 96, 96) < (128, 128, 128) < (200, 200, 200)

Script 04 : 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")
  1. Modifier les lignes 7, 8 et 9 dans 04_script.py (contenu dans l'archive déjà téléchargée) afin de convertir l'image colorée en image en niveau de gris.
  2. Modifier les lignes 7, 8 et 9 dans 04_script.py (contenu dans l'archive déjà téléchargée) pour réaliser d'autres effets sur l'image.
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)) g = (r+v+b)//3 img.putpixel((x, y),(g, g, g)) img.show() img.save("image_modif.png", "PNG")

Applications : Crée tes propres filtres !

Auréole
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 300×366 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.
Andy Warhol
  1. Écrire un programme qui, à partir d'une image, produit une composition 2×2 (rouge, vert, bleu, jaune) à la Andy Warhol, comme dans l'exemple ci-contre.
    fichier_image.jpg
    doit être transformée en
    image_modif.png
  2. Recombiner les couleurs de l'image du phare, de manière à retrouver la photo originale. phare.jpg
from PIL import Image img1 = Image.open("fichier_image.jpg") largeur, hauteur = img1.size img2 = Image.new("RGB", (2 * largeur, 2 * hauteur)) for y in range(hauteur): for x in range(largeur): r, v, b = img1.getpixel((x, y)) img2.putpixel((x, y), (r, 0, 0)) img2.putpixel((x + largeur, y), (0, v, 0)) img2.putpixel((x, y + hauteur), (0, 0, b)) img2.putpixel((x + largeur, y + hauteur), (r, v, 0)) img2.show() img2.save("image_modif.png", "PNG")