{"cells":[{"metadata":{},"cell_type":"markdown","source":"![En tête general](https://raw.githubusercontent.com/PythonLycee/PyLyc/master/img/En_tete_general.png)\n\n\n© Copyright Franck CHEVRIER 2019-2021 https://www.python-lycee.com.
\nLes activités partagées sur Capytale sont sous licence Creative Commons.\n\n Pour exécuter une saisie Python, sélectionner la cellule et valider avec SHIFT+Entrée.\n"},{"metadata":{},"cell_type":"markdown","source":"# Applications de filtres sur une image (corrigé) \n\n### Activité sur le traitement d'images n°1"},{"metadata":{},"cell_type":"markdown","source":"Le but de cette activité est de programmer et d'appliquer des filtres sur des images :
\nL'application d'un filtre consiste à transformer une image en modifiant les composantes R,G,B de chacun de ses pixels.\n"},{"metadata":{},"cell_type":"markdown","source":"1. Exécuter la cellule ci-dessous, qui permet :\n- d'ouvrir un fichier et de stocker l'image dans un objet Python de type Image;\n- d'afficher le format, le type de codage et la dimension de l'image;\n- d'afficher l'image.\n\nNB: Vous pouvez réexécuter la cellule pour obtenir une autre image (choix aléatoire dans une bibliothèque d'images de la ville de Strasbourg)."},{"metadata":{"scrolled":false,"trusted":true},"cell_type":"code","source":"# import du module permettant la gestion des images\nfrom PIL import Image\nimport requests\nfrom io import BytesIO\n\n#ouverture de l'image\nfrom random import randint\nStrasbourg = Image.open(BytesIO(requests.get('https://raw.githubusercontent.com/PythonLycee/PyLyc/master/img/Strasbourg/Strasbourg'+str(randint(1,10))+'.jpg').content))\n\n#affichage du format, du type et de la dimension de l'image\nprint(\"Format:\",Strasbourg.format,\"\\nMode:\",Strasbourg.mode,\"\\nDimensions:\",Strasbourg.size) ; \n\n#affichage de l'image\nStrasbourg","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"__2. Pour éclaircir une image, on peut augmenter de 50% les composantes couleurs de chaque pixel.__
\n$\\;\\;\\;$__a. Suivre la vidéo suivante, qui détaille la fonction Python eclaircissement donnée ci-dessous.__
\n\n\n\n\n\n"},{"metadata":{},"cell_type":"markdown","source":"$\\;\\;\\;$__b. Exécuter les deux cellules ci-dessous, pour appliquer la fonction eclaircissement à l'image Strasbourg.__"},{"metadata":{"trusted":true},"cell_type":"code","source":"def eclaircissement(im_originale):\n \"\"\"\n fonction qui renvoie l'image im_originale éclaircie\n \"\"\"\n \n # récupération des dimensions de l'image originale\n L,H = im_originale.size\n \n # création d'une image vierge, de même format et même dimension que l'image initiale\n im_modifiee = Image.new( mode=im_originale.mode , size=(L,H) )\n \n # ouverture de l'accès aux pixels des deux images \n pix_origine = im_originale.load()\n pix_modifie = im_modifiee.load()\n \n # on parcourt tous les pixels des images\n for x in range(L):\n for y in range(H):\n R,G,B = pix_origine[x,y] #récupération des composantes R,G,B du pixel original\n \n R = int(R*1.5)\n G = int(G*1.5)\n B = int(B*1.5)\n \n pix_modifie[x,y] = R,G,B #écriture des composantes R,G,B du pixel modifié\n \n # on renvoie l'image modifiée\n return im_modifiee\n ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"eclaircissement(Strasbourg)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"__3. Pour assombrir une image, on peut diminuer de 50% les composantes couleurs de l'image d'origine.__
\n$\\;\\;\\;$__Écrire une fonction Python assombrissement qui permet d'assombrir une image, puis tester cette fonction.__
\n$\\;\\;\\;$Aide : On pourra commencer par effectuer un copier/coller de la fonction eclaircissement puis l'adapter."},{"metadata":{"trusted":true},"cell_type":"code","source":"# Ecrire ici la fonction assombrissement\n\ndef assombrissement(im_originale):\n \"\"\"\n fonction qui renvoie l'image im_originale assombrie\n \"\"\" \n # récupération des dimensions de l'image originale\n L,H = im_originale.size\n \n # création d'une image vierge, de même format et même dimension que l'image initiale\n im_modifiee = Image.new( mode=im_originale.mode , size=(L,H) )\n \n # ouverture de l'accès aux pixels des deux images \n pix_origine = im_originale.load()\n pix_modifie = im_modifiee.load()\n \n # on parcourt tous les pixels des images\n for x in range(L):\n for y in range(H):\n R,G,B = pix_origine[x,y] #récupération des composantes R,G,B du pixel original\n \n R = int(R*0.5)\n G = int(G*0.5)\n B = int(B*0.5)\n \n pix_modifie[x,y] = R,G,B #écriture des composantes R,G,B du pixel modifié\n \n # on renvoie l'image modifiée\n return im_modifiee","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Tester ici un appel à la fonction assombrissement\n\nassombrissement(Strasbourg)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"__4. Le principe du filtre rouge consiste à conserver les composantes rouges des pixels de l'image et à remplacer les autres par $0$.__
\n$\\;\\;\\;$__a. Écrire une fonction Python filtre_R qui applique le filtre rouge à une image, puis tester cette fonction.__
\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Écrire ici la fonction filtre_R\n\ndef filtre_R(im_originale):\n \"\"\"\n fonction qui renvoie l'image im_originale filtrée en rouge\n \"\"\" \n # récupération des dimensions de l'image originale\n L,H = im_originale.size\n \n # création d'une image vierge, de même format et même dimension que l'image initiale\n im_modifiee = Image.new( mode=im_originale.mode , size=(L,H) )\n \n # ouverture de l'accès aux pixels des deux images \n pix_origine = im_originale.load()\n pix_modifie = im_modifiee.load()\n \n # on parcourt tous les pixels des images\n for x in range(L):\n for y in range(H):\n R,G,B = pix_origine[x,y] #récupération des composantes R,G,B du pixel original\n \n # pas de modification de R\n G = 0\n B = 0\n \n pix_modifie[x,y] = R,G,B #écriture des composantes R,G,B du pixel modifié\n \n # on renvoie l'image modifiée\n return im_modifiee","execution_count":null,"outputs":[]},{"metadata":{"scrolled":false,"trusted":true},"cell_type":"code","source":"# Tester ici un appel à la fonction filtre_R\nfiltre_R(Strasbourg)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"$\\;\\;\\;$__b. Écrire sur le même principe des fonctions Python filtre_G et filtre_B pour les filtres vert et bleu.__"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Écrire ici la fonction filtre_G\n\ndef filtre_G(im_originale):\n \"\"\"\n fonction qui renvoie l'image im_originale filtrée en vert\n \"\"\" \n # récupération des dimensions de l'image originale\n L,H = im_originale.size\n \n # création d'une image vierge, de même format et même dimension que l'image initiale\n im_modifiee = Image.new( mode=im_originale.mode , size=(L,H) )\n \n # ouverture de l'accès aux pixels des deux images \n pix_origine = im_originale.load()\n pix_modifie = im_modifiee.load()\n \n # on parcourt tous les pixels des images\n for x in range(L):\n for y in range(H):\n R,G,B = pix_origine[x,y] #récupération des composantes R,G,B du pixel original\n \n R = 0\n # pas de modification de G\n B = 0\n \n pix_modifie[x,y] = R,G,B #écriture des composantes R,G,B du pixel modifié\n \n # on renvoie l'image modifiée\n return im_modifiee","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Tester ici un appel à la fonction filtre_G\nfiltre_G(Strasbourg)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Écrire ici la fonction filtre_B\n\ndef filtre_B(im_originale):\n \"\"\"\n fonction qui renvoie l'image im_originale filtrée en bleu\n \"\"\" \n # récupération des dimensions de l'image originale\n L,H = im_originale.size\n \n # création d'une image vierge, de même format et même dimension que l'image initiale\n im_modifiee = Image.new( mode=im_originale.mode , size=(L,H) )\n \n # ouverture de l'accès aux pixels des deux images \n pix_origine = im_originale.load()\n pix_modifie = im_modifiee.load()\n \n # on parcourt tous les pixels des images\n for x in range(L):\n for y in range(H):\n R,G,B = pix_origine[x,y] #récupération des composantes R,G,B du pixel original\n \n R = 0\n G = 0\n # pas de modification de B\n \n pix_modifie[x,y] = R,G,B #écriture des composantes R,G,B du pixel modifié\n \n # on renvoie l'image modifiée\n return im_modifiee","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Tester ici un appel à la fonction filtre_B\nfiltre_B(Strasbourg)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"__5. Dans cette question, on souhaite convertir une image couleur en image en niveau de gris.__
\n$\\;\\;\\;$__En RGB, on obtient un pixel en niveau de gris lorsque ses 3 composantes couleur sont égales.__
\n$\\;\\;\\;$__a. Une première méthode consiste à remplacer chacune des composantes couleur d'un pixel par la moyenne des trois composantes initiales.__
\n$\\;\\;\\;\\;\\;\\;$__Écrire une fonction Python gris_rapide qui effectue cette conversion.__
\n$\\;\\;\\;\\;\\;\\;$__Tester cette fonction.__\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Écrire ici la fonction gris_rapide\n\ndef gris_rapide(im_originale):\n \"\"\"\n fonction qui renvoie l'image im_originale en niveau de gris\n par la méthode de la moyenne\n \"\"\" \n # récupération des dimensions de l'image originale\n L,H = im_originale.size\n \n # création d'une image vierge, de même format et même dimension que l'image initiale\n im_modifiee = Image.new( mode=im_originale.mode , size=(L,H) )\n \n # ouverture de l'accès aux pixels des deux images \n pix_origine = im_originale.load()\n pix_modifie = im_modifiee.load()\n \n # on parcourt tous les pixels des images\n for x in range(L):\n for y in range(H):\n R,G,B = pix_origine[x,y] #récupération des composantes R,G,B du pixel original\n \n moyenne = int((R+G+B)/3) # ou (R+G+B)//3 (calcul de la moyenne des trois composantes)\n R = moyenne\n G = moyenne\n B = moyenne\n \n pix_modifie[x,y] = R,G,B #écriture des composantes R,G,B du pixel modifié\n \n # on renvoie l'image modifiée\n return im_modifiee","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Tester ici un appel à la fonction gris_rapide\ngris_rapide(Strasbourg)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"$\\;\\;\\;$__b. La perception des composantes couleur par l'oeil humain diffère selon ces couleurs.__
\n$\\;\\;\\;\\;\\;\\;$__Ainsi, l'organisme CIE (Commission Internationale de l'Éclairage) préconise la méthode suivante pour convertir une image en niveau de gris :__
\n\n
\nConversion en niveau de gris :
\nOn attribue à chaque composante couleur la valeur obtenue en additionnant :
\n21,25% de la valeur de la composante rouge initiale;
\n71,54% de la valeur de la composante verte;
\n7,21% de la valeur de la composante bleue.\n