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) :
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 : |
l'affichage d'informations dans la console : |
a- Modifier le programme pour obtenir le résultat suivant dans la console :
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 ?
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 :
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 :
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 :
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 :
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 :
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 :
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 ?