{ "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", "\n", "\n", "__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).__\n", "\n", "__2. Effectuer l’appel Appliquer(eclaircir) pour utiliser cette fonction sur une image de votre choix.__\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def eclaircir(pixphoto,l,h):\n", " \"\"\"\n", " Fonction qui renvoie une image éclaircie\n", " \"\"\"\n", " #La double boucle permet d'atteindre chaque pixel de l'image\n", " for i in range(l):\n", " for j in range(h):\n", " \n", " #On récupère les composantes R,V,B du pixel\n", " (R,V,B)=pixphoto[i,j]\n", " \n", " #On modifie R,V,B\n", " R=int(min(R*1.5,255))\n", " V=int(min(V*1.5,255))\n", " B=int(min(B*1.5,255))\n", " \n", " #On modifie le pixel\n", " pixphoto[i,j]=(R,V,B)\n", " \n", " #On renvoie la liste des pixels et les dimensions de l'image modifiée\n", " return pixphoto,l,h\n", "\n", "\n", "#Appel à la fonction eclaircir, à tester sur une image\n", "Appliquer(eclaircir)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__3. Dans chacun des cas suivants, en vous basant sur la fonction eclaircir :__\n", "\n", "(on pourra commencer par un copier/coller de la fonction eclaircir, puis modifier le nom de la fonction et les affectations de R,V et B)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__a. Fonction d’assombrissement : assombrissement__\n", "\n", "Pour chaque pixel, remplacer les composantes R,G,B par leur moitié\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Ecrire et tester la fonction assombrissement\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__b. Fonction de filtre rouge : filtre_R__ \n", "\n", "Pour chaque pixel, mettre les composantes G et B à zéro.\n", "\n", "__(puis filtre_V et filtre_B)__" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Ecrire et tester les fonctions filtre_R, filtre_V et filtre_B\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__c. Fonction de mise en niveau de gris : gris_rapide__\n", "\n", "Pour chaque pixel : \n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Ecrire et tester la fonction gris_rapide\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__d. Fonction de mise en niveau de gris : gris_precis__\n", "\n", "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 :\n", "\n", "niveau_de_gris = int ( 0.2125$*$R + 0.7154$*$V + 0.0721$*$B )\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Ecrire et tester la fonction gris_precis\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__e. Fonction de mise en négatif : negatif__\n", "\n", "Pour chaque pixel, remplacer chaque composante par la différence entre 255 et la valeur de cette composante.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Ecrire et tester la fonction negatif\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pour accéder à la suite (TP2-Composition d'images): Cliquer ici \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*(C) Copyright Franck CHEVRIER 2019-2020 http://www.python-lycee.com/*\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "celltoolbar": "Raw Cell Format", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 2 }