SNT

Module La photographie numérique : traitement d'image

Nous allons utiliser le langage de programmation Python afin de directement travailler sur les pixels d'une image. Par travailler sur les pixels, j'entends déterminer la valeur du canal rouge, la valeur du canal et la valeur du canal bleu pour un pixel donné ou bien encore modifier carrément la couleur d'un pixel.

Avant de commencer à écrire un programme qui nous permettra de travailler sur les pixels d'une image, il est nécessaire de préciser que chaque pixel a des coordonnées x,y.

pixel

Comme vous pouvez le constater sur le schéma ci-dessus, le pixel de coordonnées (0,0) se trouve en haut à gauche de l'image. Si l'image fait 800 pixels de large et 600 pixels de haut, le pixel ayant pour coordonnées (400,300) sera au milieu de l'image.

Dans un premier temps nous allons utiliser une simple photo de pomme pour faire nos premiers essais, ensuite, vous pourrez travailler avec l'image de votre choix. L'image de la pomme est téléchargeable ici. Cette image devra se trouver dans le même dossier que vos programmes Python.

Voici un premier programme :

À faire vous-même 1

Après avoir ouvert l'éditeur Spyder, saisissez et testez le programme suivant :


from PIL import Image
img = Image.open("pomme.jpg")
r,v,b=img.getpixel((100,250))
print("canal rouge : ",r,"canal vert : ",v,"canal bleu : ",b)
        

Ce programme vous donne le canal rouge, le canal vert et le canal bleu du pixel de coordonnées (100,250) de l'image "pomme.jpg"


Voici une analyse ligne par ligne du programme ci-dessus :

À faire vous-même 2

Modifiez le programme du "À faire vous-même 1" pour qu'il affiche les valeurs du canal rouge, du canal vert et du canal bleu du pixel de coordonnées (250,300), notez votre réponse.

Il est possible de modifier les canaux RVB d'un pixel :

À faire vous-même 3

Saisissez et testez le programme suivant :


from PIL import Image
img = Image.open("pomme.jpg")
img.putpixel((250,250),(255,0,0))
img.show()
        

Regardez attentivement le centre de l'image, vous devriez voir un pixel rouge à la place d'un pixel vert.


Voici une analyse ligne par ligne du programme ci-dessus :

À faire vous-même 4

Modifiez le programme du "À faire vous-même 3" afin de colorier le pixel de coordonnées (100,250) en bleu.


Modifiez un pixel c'est déjà bien, mais comment faire pour modifier plusieurs pixels ? La réponse est simple, nous allons utiliser des boucles "for". Le but ici n'est pas de détailler le fonctionnement des boucles "for" en Python, vous devez juste comprendre que grâce à ces boucles nous allons pouvoir balayer toute l'image et ne plus nous contenter de modifier les pixels un par un.

À faire vous-même 5

Saisissez et testez le programme suivant (ATTENTION : l'exécution de ce programme n'est pas très intéressante en soi, vous pouvez l'arrêter à tout moment en appuyant simultanément sur la touche Ctrl et sur la touche C):


from PIL import Image
img = Image.open("pomme.jpg")
largeur_image=500
hauteur_image=500
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")
        

Quelques commentaires sur ce programme :

Compliquons un peu la chose en modifiant tous les pixels de l'image :

À faire vous-même 6

Saisissez et testez le programme suivant :


from PIL import Image
img = Image.open("pomme.jpg")
largeur_image=500
hauteur_image=500
for y in range(hauteur_image):
for x in range(largeur_image):
    r,v,b=img.getpixel((x,y))
    n_r=v
    n_v=b
    n_b=r
    img.putpixel((x,y),(n_r,n_v,n_b))
img.show()
    

Expliquez en quelques mots ce que fait ce programme.

À faire vous-même 7

En vous inspirant de ce qui a été fait au "À faire vous-même 6", écrivez un programme qui inverse les valeurs des canaux bleu et rouge sans changer la valeur du canal vert.


À faire vous-même 8

Après avoir fait quelques recherches sur le "négatif d'une image", écrivez un programme qui donne le négatif d'une image.


À faire vous-même 9

Après avoir fait quelques recherches sur les "images en niveau de gris", écrivez un programme qui transforme une "image couleur" en une "image en niveau de gris".

Petite astuce qui pourrait vous aider : en Python pour avoir une division entière (le résultat est un entier), il faut utiliser l'opérateur // à la place de l'opérateur /


À faire vous-même 10

Testez les programmes écrient dans le "À faire vous-même 8" et le "À faire vous-même 9" avec une image de votre choix (attention aux variables "largeur_image" et "hauteur_image").


Pour l'instant nous avons modifié tous les pixels de l'image. Avec l'instruction "if", il est possible de modifier seulement certains pixels.

À faire vous-même 11

Saisissez et testez le programme suivant :


from PIL import Image
img = Image.open("pomme.jpg")
largeur_image=500
hauteur_image=500
for y in range(hauteur_image):
for x in range(largeur_image):
    r,v,b=img.getpixel((x,y))
    if b<200:
        n_b=255-b
    else :
        n_b=b
    img.putpixel((x,y),(r,v,n_b))
img.show()
    

Expliquez en quelques mots ce que fait ce programme.


Il est même possible de combiner plusieurs conditions :

À faire vous-même 12

Saisissez et testez le programme suivant :


from PIL import Image
img = Image.open("pomme.jpg")
largeur_image=500
hauteur_image=500
for y in range(hauteur_image):
for x in range(largeur_image):
    r,v,b=img.getpixel((x,y))
    if v>100 and y>250:
        n_v=0
    else :
        n_v=255
    img.putpixel((x,y),(r,n_v,b))
img.show()
    

Expliquez en quelques mots ce que fait ce programme.


lien docShare