{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "![En tête](img/En_tete.png)\n", "\n", "\n", "*(C) Copyright Franck CHEVRIER 2019-2020 http://www.python-lycee.com/*\n", "\n", " Pour exécuter une saisie Python, sélectionner la cellule et valider avec SHIFT+Entrée.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Manipulation d'images (1/2): Application de filtres" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Vous pouvez récupérer une image-exemple ici." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Le programme donné ci-dessous va permettre d’ouvrir une image (png, jpg, bmp…) et de transcrire ses données sous la forme suivante :\n", "\n", "• pixphoto est un tableau contenant les composantes (R,G,B) de chaque pixel\n", "\n", "• l et h sont respectivement la largeur et la hauteur de l’image, exprimées en pixel.\n", "\n", "![Illustration TP1](img/TP1_illustration.png)\n", "\n", "\n", " 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é)\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "'''\n", "CI-DESSOUS FIGURE LE PROGRAMME PRINCIPAL\n", "!!! NE PAS MODIFIER !!!\n", "'''\n", "\n", "#Import des modules nécessaires (fenêtres de dialogue et traitement d'images):\n", "\n", "from tkinter.messagebox import*\n", "from tkinter.filedialog import*\n", "from PIL import Image, ImageTk\n", "\n", "\n", "def Appliquer(fonction_de_modification):\n", " \"\"\"\n", " Fonction principale à appeler pour appliquer une fonction de transformation\n", " \n", " 1 Fenêtre d'ouverture d'un fichier image (ne pas utiliser de fichiers images contenant des points dans leurs noms)\n", " 2 Affichage de l'image\n", " 3 Boîte de dialogue pour appliquer la transformation\n", " 4 Sauvegarde automatique dans un fichier (nom_du_fichier_original)_(fonction_de_modification) \n", " 5 Affichage de l'image modifiée\n", " 6 Boîte de dialogue pour reprendre les étapes 1 à 5\n", " \"\"\"\n", " \n", " # Creation de la fenetre principale:\n", " \n", " Fenetre_affichage = Tk() \n", " Fenetre_affichage.title(\"Visionneuse image\") \n", " \n", " # Ouverture de la boucle principale\n", " \n", " while \"on continue\":\n", " \n", " '''\n", " Importation de la photo\n", " conversion en format tkinter\n", " '''\n", " \n", " try:\n", " filename = askopenfilename(title=\"Ouvrir l'image à transformer\",filetypes=[('jpg files','.jpg'),('bmp files','.bmp'),('png files','.png'),('all files','.*')]) \n", " photo = ImageTk.PhotoImage(master=Fenetre_affichage ,file=filename)\n", " except:\n", " print(\"Annulation\")\n", " break\n", " \n", " '''\n", " Creation d'un canevas \n", " (pour l'affichage de l'image dans la fenêtre principale)\n", " '''\n", " Canevas = Canvas(Fenetre_affichage) \n", " Canevas.config(height=photo.height(),width=photo.width())\n", " Canevas.create_image(0,0,anchor=NW,image=photo)\n", " \n", " '''\n", " Affichage de la photo originale\n", " '''\n", " Canevas.pack()\n", " Fenetre_affichage.update()\n", " \n", " '''\n", " boîte de dialogue pour appliquer la fonction de transformation\n", " Oui-> applique la transformation Non-> fin de boucle\n", " '''\n", " \n", " if not askyesno(\"Modification de l'image\", \"L'image est chargée.\\n Appliquer la fonction \"+str(fonction_de_modification.__name__)+\" ?\"): break\n", " \n", " '''\n", " Conversion de l'image en format modifiable:\n", " récupération des pixels sous forme (R,G,B) et des dimensions de l'image \n", " '''\n", " photo=Image.open(filename)\n", " pixphoto = photo.load()\n", " (l,h) = photo.size\n", " \n", " '''\n", " Application de la fonction de modification\n", " et génération de l'image modifiée\n", " '''\n", " pixphoto2,l2,h2=fonction_de_modification(pixphoto,l,h)\n", " \n", " photo2=Image.new(\"RGB\",(l2,h2))\n", " for i in range(l2):\n", " for j in range(h2):\n", " photo2.putpixel((i,j),pixphoto2[i,j])\n", " \n", " '''\n", " Sauvegarde automatique de l'image obtenue\n", " '''\n", " \n", " placeextension=filename.index(\".\")\n", " file_save_name=filename[:placeextension]+\"_\"+str(fonction_de_modification.__name__)+filename[placeextension:] \n", " photo2.save(file_save_name)\n", " '''\n", " Ouverture de l'image modifiée\n", " récupération des pixels sous forme (R,G,B) et des dimensions de l'image\n", " '''\n", " photo2=ImageTk.PhotoImage(master=Fenetre_affichage ,file=file_save_name)\n", " Canevas.config(height=photo2.height(),width=photo2.width())\n", " Canevas.create_image(0,0,anchor=NW,image=photo2)\n", " \n", " Canevas.pack()\n", " Fenetre_affichage.update()\n", " \n", " if not askyesno(\"Recommencer?\", \"Votre image modifiée a été sauvegardée\\ndans un fichier \"+file_save_name+\"\\nRecommencer sur une nouvelle image?\"): break\n", " \n", " '''\n", " destruction du Canevas courant\n", " '''\n", " Canevas.destroy()\n", "\n", " Fenetre_affichage.quit()\n", " Fenetre_affichage.destroy()\t\n", " return True\t" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La fonction fournie nommée eclaircir :\n", "