(C) Copyright Franck CHEVRIER 2019-2020 http://www.python-lycee.com/
Pour exécuter une saisie Python, sélectionner la cellule et valider avec SHIFT+Entrée.
Vous pouvez récupérer une image-exemple ici.
Le programme donné ci-dessous va permettre d’ouvrir une image (png, jpg, bmp…) et de transcrire ses données sous la forme suivante :
• pixphoto est un tableau contenant les composantes (R,G,B) de chaque pixel
• l et h sont respectivement la largeur et la hauteur de l’image, exprimées en pixel.
Exécuter la cellule pour mettre ce programme en mémoire. (NB: il n'est pas nécessaire de comprendre le programme ci-dessous pour réaliser l'activité)
'''
CI-DESSOUS FIGURE LE PROGRAMME PRINCIPAL
!!! NE PAS MODIFIER !!!
'''
#Import des modules nécessaires (fenêtres de dialogue et traitement d'images):
from tkinter.messagebox import*
from tkinter.filedialog import*
from PIL import Image, ImageTk
def Appliquer(fonction_de_modification):
"""
Fonction principale à appeler pour appliquer une fonction de transformation
1 Fenêtre d'ouverture d'un fichier image (ne pas utiliser de fichiers images contenant des points dans leurs noms)
2 Affichage de l'image
3 Boîte de dialogue pour appliquer la transformation
4 Sauvegarde automatique dans un fichier (nom_du_fichier_original)_(fonction_de_modification)
5 Affichage de l'image modifiée
6 Boîte de dialogue pour reprendre les étapes 1 à 5
"""
# Creation de la fenetre principale:
Fenetre_affichage = Tk()
Fenetre_affichage.title("Visionneuse image")
# Ouverture de la boucle principale
while "on continue":
'''
Importation de la photo
conversion en format tkinter
'''
try:
filename = askopenfilename(title="Ouvrir l'image à transformer",filetypes=[('jpg files','.jpg'),('bmp files','.bmp'),('png files','.png'),('all files','.*')])
photo = ImageTk.PhotoImage(master=Fenetre_affichage ,file=filename)
except:
print("Annulation")
break
'''
Creation d'un canevas
(pour l'affichage de l'image dans la fenêtre principale)
'''
Canevas = Canvas(Fenetre_affichage)
Canevas.config(height=photo.height(),width=photo.width())
Canevas.create_image(0,0,anchor=NW,image=photo)
'''
Affichage de la photo originale
'''
Canevas.pack()
Fenetre_affichage.update()
'''
boîte de dialogue pour appliquer la fonction de transformation
Oui-> applique la transformation Non-> fin de boucle
'''
if not askyesno("Modification de l'image", "L'image est chargée.\n Appliquer la fonction "+str(fonction_de_modification.__name__)+" ?"): break
'''
Conversion de l'image en format modifiable:
récupération des pixels sous forme (R,G,B) et des dimensions de l'image
'''
photo=Image.open(filename)
pixphoto = photo.load()
(l,h) = photo.size
'''
Application de la fonction de modification
et génération de l'image modifiée
'''
pixphoto2,l2,h2=fonction_de_modification(pixphoto,l,h)
photo2=Image.new("RGB",(l2,h2))
for i in range(l2):
for j in range(h2):
photo2.putpixel((i,j),pixphoto2[i,j])
'''
Sauvegarde automatique de l'image obtenue
'''
placeextension=filename.index(".")
file_save_name=filename[:placeextension]+"_"+str(fonction_de_modification.__name__)+filename[placeextension:]
photo2.save(file_save_name)
'''
Ouverture de l'image modifiée
récupération des pixels sous forme (R,G,B) et des dimensions de l'image
'''
photo2=ImageTk.PhotoImage(master=Fenetre_affichage ,file=file_save_name)
Canevas.config(height=photo2.height(),width=photo2.width())
Canevas.create_image(0,0,anchor=NW,image=photo2)
Canevas.pack()
Fenetre_affichage.update()
if not askyesno("Recommencer?", "Votre image modifiée a été sauvegardée\ndans un fichier "+file_save_name+"\nRecommencer sur une nouvelle image?"): break
'''
destruction du Canevas courant
'''
Canevas.destroy()
Fenetre_affichage.quit()
Fenetre_affichage.destroy()
return True
La fonction fournie nommée eclaircir :
1. Expliquer pourquoi l'instruction R=R*1.5 ne fonctionnerait pas pour n'importe quelle valeur de R initiale (on pourra tester avec R=13 ou R=200 par exemple).
2. Effectuer l’appel Appliquer(eclaircir) pour utiliser cette fonction sur une image de votre choix.
def eclaircir(pixphoto,l,h):
"""
Fonction qui renvoie une image éclaircie
"""
#La double boucle permet d'atteindre chaque pixel de l'image
for i in range(l):
for j in range(h):
#On récupère les composantes R,V,B du pixel
(R,V,B)=pixphoto[i,j]
#On modifie R,V,B
R=int(min(R*1.5,255))
V=int(min(V*1.5,255))
B=int(min(B*1.5,255))
#On modifie le pixel
pixphoto[i,j]=(R,V,B)
#On renvoie la liste des pixels et les dimensions de l'image modifiée
return pixphoto,l,h
#Appel à la fonction eclaircir, à tester sur une image
Appliquer(eclaircir)
3. Dans chacun des cas suivants, en vous basant sur la fonction eclaircir :
a. Fonction d’assombrissement : assombrissement
Pour chaque pixel, remplacer les composantes R,G,B par leur moitié
#Ecrire et tester la fonction assombrissement
b. Fonction de filtre rouge : filtre_R
Pour chaque pixel, mettre les composantes G et B à zéro.
(puis filtre_V et filtre_B)
#Ecrire et tester les fonctions filtre_R, filtre_V et filtre_B
c. Fonction de mise en niveau de gris : gris_rapide
Pour chaque pixel :
#Ecrire et tester la fonction gris_rapide
d. Fonction de mise en niveau de gris : gris_precis
La perception des composantes de couleur par l’œil humain diffère selon ces couleurs. Ainsi, l’organisme CIE (Commission Internationale de l’Eclairage) préconise le calcul de niveau de gris suivant :
niveau_de_gris = int ( 0.2125$*$R + 0.7154$*$V + 0.0721$*$B )
#Ecrire et tester la fonction gris_precis
e. Fonction de mise en négatif : negatif
Pour chaque pixel, remplacer chaque composante par la différence entre 255 et la valeur de cette composante.
#Ecrire et tester la fonction negatif
Pour accéder à la suite (TP2-Composition d'images): Cliquer ici
(C) Copyright Franck CHEVRIER 2019-2020 http://www.python-lycee.com/