Vous savez surement ce qu’est le négatif d’une image en niveaux de gris : Le pixel blanc valeur 255 devient noir et prend la valeur 0, un gris clair valeur 200 devient un gris foncé valeur 55 … etc. Pour la couleur on applique le même principe sur chaque composante RVB.
Exemple :
Léna en niveaux de gris | Léna en négatif |
Rose en couleur | Rose en négatif |
Exercice 1 : Ecrire la fonction negatif du code suivant permettant d’obtenir les effets ci-dessus.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#-*- coding:Latin-1 -*- # PIL (Python Imaging Library) est une bibliothèque pour la manipulation des images from PIL import Image #============================================================ def negatif(Pix,Largeur,Hauteur): # # return Pix #============================================================ # L'image a 3 composantes : RGB ou 1 si elle est en N&B im = Image.open("lena.pgm") w,h=im.size # Détermination du type d'image RGB ou N&B bands=im.getbands() if len(bands)==3: #Séparation des composantes => tuple de 3 images ImagePixelsRouges,ImagePixelsVerts,ImagePixelsBleus=im.split() #transformation de l'image en liste de pixels ListePixelsRouges=list(ImagePixelsRouges.getdata()) ListePixelsVerts=list(ImagePixelsVerts.getdata()) ListePixelsBleus=list(ImagePixelsBleus.getdata()) ListePixelsRouges=negatif(ListePixelsRouges,w,h) ListePixelsVerts=negatif(ListePixelsVerts,w,h) ListePixelsBleus=negatif(ListePixelsBleus,w,h) ImagePixelsRouges.putdata(ListePixelsRouges) ImagePixelsVerts.putdata(ListePixelsVerts) ImagePixelsBleus.putdata(ListePixelsBleus) ImagePixels = Image.merge('RGB',(ImagePixelsRouges,ImagePixelsVerts,ImagePixelsBleus)) else : #récupération des données de l'image ImagePixels=im.getdata() #transformation de l'image en liste de pixels ListePixels=list(ImagePixels) ListePixels=negatif(ListePixels,w,h) ImagePixels = Image.new('L',(w,h)) ImagePixels.putdata(ListePixels) ImagePixels.save("Negatif_lena.pgm") ImagePixels.close() im.close() |
Le seuillage d’une image est un procédé qui consiste à transformer une photo en niveaux de gris en une photo noir et blanc par transformation de chaque pixel en blanc s’il est compris entre les deux valeurs de seuil que l’utilisateur a renseigner ou en noir s’il n’est pas compris entre les deux valeurs de seuil. Bien sur ce procédé peut se généraliser dans le cas d’une image couleur en l’appliquant à chacune de ses composantes RVB.
Exemple : Les images précédentes avec un seuillage de 125 et 250.
Exercice 2 : Ecrire la fonction seuillage du code suivant permettant d’obtenir les effets ci-dessus.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# PIL (Python Imaging Library) est une bibliothèque pour la manipulation des images from PIL import Image #============================================================ def seuillage(Pix,n,inf,sup): # # # # # return Pix #============================================================ # Définitions des valeurs de seuils s1,s2=125,250 # L'image a 3 composantes :RGB im = Image.open("rose.jpg") w,h=im.size bands=im.getbands() if len(bands)==3: #Séparation des composantes => tuple de 3 images ImagePixelsRouges,ImagePixelsVerts,ImagePixelsBleus=im.split() #transformation de l'image en liste de pixels ListePixelsRouges=list(ImagePixelsRouges.getdata()) ListePixelsVerts=list(ImagePixelsVerts.getdata()) ListePixelsBleus=list(ImagePixelsBleus.getdata()) ListePixelsRouges=seuillage(ListePixelsRouges,w*h,s1,s2) ListePixelsVerts=seuillage(ListePixelsVerts,w*h,s1,s2) ListePixelsBleus=seuillage(ListePixelsBleus,w*h,s1,s2) ImagePixelsRouges.putdata(ListePixelsRouges) ImagePixelsVerts.putdata(ListePixelsVerts) ImagePixelsBleus.putdata(ListePixelsBleus) ImagePixels = Image.merge('RGB',(ImagePixelsRouges,ImagePixelsVerts,ImagePixelsBleus)) else : #récupération des données de l'image ImagePixels=im.getdata() #transformation de l'image en liste de pixels ListePixels=list(ImagePixels) ListePixels=seuillage(ListePixels,w*h,s1,s2) ImagePixels = Image.new('L',(w,h)) ImagePixels.putdata(ListePixels) ImagePixels.save("seuillage_rose.jpg") ImagePixels.close() im.close() |
Exercice 3 : Améliorer vos programmes précédents pour que l’utilisateur puisse choisir son image à partir d’une boîte de dialogue.