Enseignement de l'informatique et du numérique au lycée Boissy d'Anglas
https://icn-isn-boissy.yj.fr/wp/2020/03/12/programmation-du-traitement-dimage-avec-python/
Export date: Mon Jan 20 10:37:09 2025 / +0000 GMT

Programmation du traitement d’image avec python


Dans la section précédente, vous avez utilisé un logiciel de traitement d'image (Photofiltre) qui contient différents algorithmes permettant de modifier automatiquement des images. Dans un appareil photo ou un smartphone, il y a aussi de tels types d'algorithmes. Ici, vous allez programmer vous-mêmes en Python différents algorithmes permettant de modifier des images.

INDISPENSABLE : Pour travailler avec Python, il faut créer un répertoire (par exemple travail) dans lequel vous enregistrerez à la fois vos fichiers Python (format .py) et vos images (format .png)

A la fin de la section, vous zipperez (= clic droit > compresser) ce répertoire contenant l'intégralité des fichiers .py et .png pour nous le rendre avec votre compte-rendu.

A faire vous-même 0 : Configurer le logiciel Thonny dans lequel on va programmer en Python

Ouvrez le logiciel Thonny (faire une recherche avec la loupe)

Une boite de dialogue apparaît avec le message suivant : "Can't find backend 'LocalCPython'. Please select another backend from options"

  • ouvrir le menu Outils > Options > Onglet Interpéteur
  • choisir l'option par défaut : "Le même interpréteur qui exécute Thonny"

Ensuite, il est nécessaire d'importer la librairie PILLOW (Python Imaging Library) qui fournit les outils nécessaires pour les manipulations d'images :

  • de nouveau, ouvrir le Menu Outil > Gérer les paquets...
  • écrire "Pillow" dans la barre de recherche et cliquer sur rechercher
  • Cliquer sur le lien "pillow" dans la liste obtenue

A faire vous-même 1 : Créer une image avec Python

Voici un script qui génère deux images en couleurs RVB (=RGB en anglais) de dimension 100 x 100.

Tapez-le dans l'éditeur de script de Thonny (fenêtre du haut) et enregistrez-le sous le nom afvm1.py dans votre dossier de travail créé précédemment.

Exécutez le script (icône "lecture")

from PIL import Image
im=Image.new("RGB", (100, 100)) 
im2= Image.new("RGB", (100, 100), (255,255,255))
im.save("afvm1_1.png")
im2.save("afvm1_2.png") 
  • Vérifiez que vous avez 2 images créées dans le dossier de travail (sinon demander de l'aide)
  • Lancez le logiciel Photofiltre et ouvrez les 2 images créées
  • Expliquez la couleur de l'image afvm1_1.png

Pour modifier la couleur de l'image, il suffit de modifier la couleur de chaque pixel.

On va utiliser la commande putpixel((x,y), (a, b, c)) qui permet de colorer le pixel de coordonnées (x, y) avec la couleur RVB (a, b, c) où a, b et c sont les valeurs de luminance de chaque canal, comprises entre 0 et 255.

Remarque : x est le n° de colonne et y est le n° de ligne. Le 1er pixel en haut à gauche a pour coordonnées (0,0)

A faire vous-même 2 : mettre de la couleur

Dans l'éditeur Thonny, modifiez le script précédent en ajoutant la boucle "for" suivante.

Attention  !

  • respectez l'indentation qui délimite les blocs de code (Elle se fait avec la touche de tabulation « tab »)
  • n'oubliez pas les "deux-points" : à la fin de la ligne for
from PIL import Image
im=Image.new("RGB", (100, 100))
for x in range (100):
    for y in range(100):
        im.putpixel((x,y),(0,255,0))
im.save("afvm2.png")
  • Expliquez ce que produit la boucle ajoutée sur l'image.
  • Remplacez la boucle par celle donnée ci-dessous et expliquez le résultat.
for x in range (50):
    for y in range (50,100):
        im.putpixel((x,y),(0,255,0))  

A faire vous-même 3 : coder des drapeaux

Le script suivant permet de produire le drapeau français sous forme d'une image de dimension 120x100 pixels. Une première boucle "for" permet de parcourir les lignes de l'image. Les boucles for imbriquées (attention aux indentations) parcourent les colonnes dans un rectangle donné et y affectent une couleur.

from PIL import Image
col=120
lgn=100
im=Image.new("RGB", (col,lgn))
#il y a 3 bandes verticales, on définit la variable bande :
bande=col//3
for y in range (100):
    for x in range (bande):
        im.putpixel((x,y),(0,0,255))
    for x in range (bande, (2*bande)):
        im.putpixel((x,y),(255,255,255))
    for x in range ((2*bande), col):
        im.putpixel((x,y),(255,0,0))
im.save("france.png")

Après avoir compris le script précédent, vous allez le modifier pour produire d'autres drapeaux. Pensez à enregistrer votre script modifié sous un autre nom et à modifier également le nom de l'image enregistrée par python pour ne pas écraser l'image précédente.

Enregistrez vos différentes versions de script jusqu'à ce que cela fonctionne. Vous joindrez vos scripts python afvm3-irlande et afm3-colombie à votre compte-rendu.

  • Modifiez les arguments de la commande putpixel() pour reproduire le drapeau irlandais. (pour avoir le code RGV des couleurs, vous pouvez les sélectionner sur une image avec Pixie ou avec la pipette de Photofiltre)
  • Pour ceux qui aiment les défis : plus difficile : modifiez les arguments de la commande putpixel() pour reproduire le drapeau colombien

A faire vous-même 4 : apporter des nuances

Avec quelques petites astuces, on peut aussi produire des dégradés assez facilement. Voici un script qui permet d'obtenir deux dégradés de bleu différents.

from PIL import Image
largeur = 255
hauteur = 255
im=Image.new('RGB', (largeur, hauteur))
for x in range(largeur):
    for y in range(hauteur):
        im.putpixel((x, y), (0, 0, y))
im2=Image.new('RGB', (largeur, hauteur))
for x in range(largeur):
    for y in range(hauteur):
        im2.putpixel((x, y), (0, 0, x))
im.save("camaieubleu1.png")
im2.save("camaieubleu2.png")   
  • Expliquez la ligne 7 du script précédent.
  • Expliquez la différence entre les 2 images.
  • Modifiez le script pour produire le dégradé suivant et enregistrer l'image sous le nom degrade.png

Dans un logiciel de traitement d'image comme Photofiltre, ou celui qui est présent dans l'appareil photo, il est possible de faire des corrections automatiques comme passer l'image en négatif.

Le principe de l'algorithme est de donner pour chaque pixel la couleur inverse : cette couleur est calculée selon le principe suivant :

A faire vous-même 5 : l'image en négatif

  • Enregistrez une image de votre choix dans votre répertoire de travail (pensez à choisir une image dont la licence vous permet sa modification)

Voici une partie du script permettant de créer le même effet négatif.

La commande pix = img.getpixel((x,y)) permet d'affecter dans une variable pix  les valeurs des canaux RVB extraites du pixel de coordonnées (x,y).

On peut exprimer ces valeurs sous forme d'un 3-tuple (c'est-à-dire une collection de 3 valeurs, ici correspondant aux 3 canaux RVG) :      p = (pix[0], pix[1], pix[2]) que l'on peut affecter à une variable (ici p) pour l'utiliser ensuite.

Remarque : les indices entre [ ] permettent d'accéder aux différents éléments du tuple. Pour accéder à un élément d'indice   i  d'un tuple t , on écrit      t[i]

  • On veut transformer chaque pixel de l'image (variable pix) en son négatif (variable pixneg). Trouvez comment calculer pixneg à partir de pix.

L'extrait de script ci-dessous permet d'ouvrir l'image que vous avez enregistrée, puis de créer une nouvelle image qui sera son négatif. Il manque dans le script suivant 3 lignes (respectez les indentations !) qui permettent de passer l'image en négatif.

  • À vous de les écrire et de tester le résultat. Vous joindrez vos images et votre script à votre compte-rendu.
from PIL import Image
  
img = Image.open(MonImage)
col,lgn = img.size
imgF = Image.new(img.mode,img.size)
print("Patientez pendant l'exécution du script …")
  
for x in range(col):
    for y in range(lgn):
...
...
... 
print("… C'est fait !, voir le résultat avec Photofiltre")
imgF.save("image_negatif.png")   

Parmi les retouches d'images très utilisées pour incruster un logo, un copyright ou une signature dans une image, il y a la fusion de deux images. Il s'agit de transformer plus ou moins légèrement la couleur des pixels de manière à ce que l'incrustation ne puisse pas être enlevée facilement.

L'opération mathématique à appliquer pour modifier l'encodage des pixels est la suivante :

                (R1, V1, B1)           est le 3-tuple de l'image 1,         

                (R2, V2, V2)          est le 3-tuple de l'image 2

                a             est le coefficient de dominance d'une image sur l'autre, dont la valeur est comprise entre 0 et 1.

A faire vous-même 6 : fusion d'images

  • Utilisez les informations ci-dessus pour compléter le script suivant de façon à obtenir une fusion des drapeaux de la France et de la Colombie.

Astuce : les valeurs (R,V,B) d'un pixel sont obligatoirement des entiers à utilisez     int()

La ligne 2 indique qu'il faudra entrer la valeur de a dans le shell (fenêtre de droite). Vous pourrez essayer différentes valeurs de a et comparer les images produites. Dans ce cas, pensez à modifier le nom du fichier enregistré (ligne 17) sous peine d'écraser le fichier précédent.

(Vous pouvez bien sûr utiliser des images de votre choix dans ce script, mais les 2 images doivent avoir les mêmes dimensions)

from PIL import Image
a=float(input("Entrez la valeur de a : "))
  
im1 = Image.open('france.png')
im2 = Image.open('colombie.png')
  
largeur,hauteur = im1.size
  
im = Image.new('RGB', (largeur, hauteur))
    for x in range(largeur):
        for y in range(hauteur):
            pix1 = im1.getpixel((x,y))
            pix2 = im2.getpixel((x,y))
            fusion = .......................... 
            im.putpixel((x,y),fusion)
  
im.save('fusion.jpg') 
Post date: 2020-03-12 19:57:43
Post date GMT: 2020-03-12 18:57:43

Post modified date: 2023-05-21 11:40:13
Post modified date GMT: 2023-05-21 09:40:13

Export date: Mon Jan 20 10:37:09 2025 / +0000 GMT
This page was exported from Enseignement de l'informatique et du numérique au lycée Boissy d'Anglas [ https://icn-isn-boissy.yj.fr/wp ]
Export of Post and Page has been powered by [ Universal Post Manager ] plugin from www.ProfProjects.com