Traitement d'une image par programmation

Préparation de l'activité

Télécharger l'image suivante sans modifier le nom et l'extension du fichier.

Lancer votre environnement de programmation python préféré (par exemple Edupython) et copier/coller le programme suivant :

#Appel de la bibliothèque PIL
from PIL import Image
#Récupération de l'image dans l'objet img
img = Image.open("imageFleur.jpg")
#Affichage de métadonnées
print(img.format)
print(img.size)
print(img.size[0])
print(img.mode)
#Affichage de l'image
img.show()
#information sur un pixel
xPixel=180
yPixel=180
r,v,b=img.getpixel((xPixel,yPixel))
print("codage RVB du pixel x=",xPixel, "y=",yPixel)
print("R=",r,"V=",v,"B=",b)

Créer un dossier de travail Traitement Image

Enregistrer votre programme python dans votre dossier de travail avec le nom traitementImage1

Déplacer le fichier imageFleur dans le même dossier que votre programme.

Utilisation avec Replit

- Pour le code python, rien de plus simple : copier/coller.

- Pour importer l'image :

Vous cliquez sur les 3 petits points afin de faire apparaître le menu ci-dessous et vous sélectionnez Upload file (télécharger un fichier) :

replitImportImg.png

Il n'y a plus qu'à retrouver le fichier de l'image de la fleur et c'est tout.

Vous êtes prêt à faire la suite.

Découvrir les notions de base

Un peu de code

Lancer l'exécution du programme, vous devez obtenir :

une nouvelle fenêtre avec l'image :

resuTrai1

l'affichage d'informations dans la console :

resuTrai1 2

a- Modifier le programme pour obtenir le résultat suivant dans la console :

modifTrait1

Une observation attentive du code à la ligne 16 vous permettra de faire cela facilement.

b- Comment s’appelle les informations relatives au format, la taille le système de codage des couleurs ?

Déplacer la bonne réponse dans le cadre bleu
dimensions de l'image
métadonnées de l'image
caractéristiques de l'image
propriétés de l'image

Pixels et taille d'une image

Le programme permet aussi d'accéder à un pixel donné - ici le pixel (180,180) - pour en connaître la couleur :

imgCoordonnee

Vous noterez l'endroit de l'origine de x et y qui ne correspond pas au repère habituel en mathématiques.

Le petit carré à droite de l'image correspond à la couleur du pixel de cette image.

Système de codage de couleurs en RVB

RVB pour Rouge, Vert et Bleu (RGB en anglais G: green) est un système de codage largement utilisé sur les écrans.

Chaque couleur est codé par exemple sur 1 octet, soit 256 niveaux de couleurs différents.

Mais revenons à notre pixel (180,180) avec le schéma suivant :

imgCodageRvb

Lorsqu'un pixel est éteint : aucune lumière n'est diffusée, d'où le fait que cela soit noir pour une valeur d'octet de 0.

Lorsque le photo-site est allumé à 100% (ce qui correspond à une valeur d'octet de 255) et les autres pixels éteints, on obtient pleinement la couleur Rouge ou Verte ou Bleue.

Lorsque les 3 photo-sites sont allumés, notre oeil les mélange pour  obtenir cette couleur moutarde (R=199 - V=161 - B=0) dans le cas de notre exemple.

Vous noterez la notion HTML #C7A100 que nous avions vue dans le chapitre sur le Web.

Modifier une ligne de pixels

L'objectif est d'apprendre à parcourir tous les pixels d'une ligne horizontale de l'image et d'en modifier la couleur au fur et à mesure.

Copier/coller le programme suivant dans l'IDE python et l'enregistrer avec le nom traitementImage2 dans le même dossier que précédemment :

#Appel de la bibliothèque PIL
from PIL import Image
#Récupération de l'image dans l'objet img
img = Image.open("imageFleur.jpg")
#changer la couleur d'une ligne de pixels
yPixel=100
for x in range(0,img.size[0]):
    img.putpixel((x,yPixel),(255,0,0))
#Affichage de l'image
img.show()

Une fois lancé, vous devez obtenir une ligne rouge horizontale :

resuTrait2

Vous remarquerez à la ligne 7 une boucle for ... In ... qui permet de parcourir les valeurs de x de 0 à 449.

c- Modifier les lignes 6,7 et 8 afin de dessiner une ligne bleue verticale pour xPixel=100.

Afin de vérifier si vous avez bon, faites l'exercice suivant :

Compléter les instructions sans mettre d'espace et en respectant les majuscules/minuscules des variables.

Modifier les canaux RVB d'une image

Échanger les canaux entre eux

Copier/coller le programme suivant et l'enregistrer avec le nom traitementImge3 dans le même dossier que précédemment :

#Appel de la bibliothèque PIL
from PIL import Image
#Récupération de l'image dans l'objet img
img = Image.open("imageFleur.jpg")
larg=img.size[0]
haut=img.size[1]
#Echanger les canaux de tous les pixels
for x in range(0,larg):
    for y in range(0,haut):
        #récupère le codage RVB du pixel courant
        r,v,b=img.getpixel((x,y))
        #TRAITEMENT : échange les canaux de couleurs
        r1=b
        v1=r
        b1=v
        #affecte le nouveau codage RVB au pixel courant
        img.putpixel((x,y),(r1,v1,b1))
#Affichage de l'image
img.show()

Il faut remarquer les 2 boucles imbriquées que se traduisent par :

Pour les valeurs de x de 0 à la largeur de l'image faire :

Pour les valeur de y de 0 à la hauteur de l'image faire :

Cela permet de parcourir tous les pixels de l'image.

a- Tester le programme.

b- Modifier le programme en échangeant les canaux Rouge et Vert uniquement (on laisse inchangé le canal bleu)

Convertir en niveaux de gris

Principe de base

La conversion en niveaux de gris se fait assez facilement : calculer la moyenne RVB et affecter la valeur trouvée à R, V et B (ils ont la même valeur).

c- Modifier le programme précédent pour convertir l'image en niveau de gris en utilisant  la technique des 2 boucles imbriquées et le calcul de moyenne.

Remarque : il faut utiliser la fonction int() pour le calul de la moyenne afin d'obtenir un nombre entier de pixels.

Afin de vérifier si vous avez bon, faites l'exercice suivant :

Compléter les instructions sans mettre d'espace et en respectant les majuscules/minuscules des variables.

Principe pour un rendu optimal

Faire une moyenne, ne correspond pas exactement à un rendu optimal tel que notre œil le verrait.

Il est préférable de modifier légèrement chaque canaux en utilisant le calcul de la la luminance (valeur de gris) :

L = R * 0.299 + G * 0.587 + B * 0.114

d- Modifier le programme précédent pour convertir l'image en niveau de gris en utilisant encore la technique des 2 boucles imbriquées.

Vous devez obtenir :

resuTrai4

Traitement mystère

Copier/coller le programme suivant et le sauvegarder avec le nom traitementImge4 dans le même dossier que précédemment.

Exécuter le programme suivant en modifiant plusieurs fois la valeur de a.

#Appel de la bibliothèque PIL
from PIL import Image
#Récupération de l'image dans l'objet img
img = Image.open("imageFleur.jpg")
larg=img.size[0]
haut=img.size[1]
#pour tous les pixels
for x in range(0,larg):
    for y in range(0,haut):
        #récupère le codage RVB du pixel courant
        r,v,b=img.getpixel((x,y))
        #TRAITEMENT
        a=0.6
        r1=int(r*a)
        v1=int(v*a)
        b1=int(b*a)
        #affecte le nouveau codage RVB au pixel courant
        img.putpixel((x,y),(r1,v1,b1))
#Affichage de l'image
img.show()

 Quel est le type de traitement sur l'image ?

Déplacer la bonne réponse dans le cadre bleu.
Changement des couleurs
Constraste
Agrandissement de la taille
Luminosité
Conversion en gris