{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"![En tête](img/En_tete_general.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": [
"# Composition d'images\n",
"\n",
"### Activité sur le traitement d'images n°2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Le but de cette activité est d'apprendre à composer une nouvelles image à partir de deux images initiales.
\n",
"Cette activité fait suite à l'activité sur les traitements d'images n°1 (Application de filtres).\n",
"
\n",
"Dans chacun des cas, les images qui seront composées entre elles auront les mêmes dimensions.\n",
"\n",
"\n",
"### Sommaire\n",
"\n",
"1. Superposition d'images
\n",
"2. Réalisation d'un anaglyphe
\n",
"3. Incrustation sur fond vert
\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. Superposition d'images\n",
"\n",
"Dans cette partie, on souhaite obtenir une nouvelle image par superposition de deux images."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"1.1. Exécuter les cellules ci-dessous, qui permettent chacune :\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"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"# import du module permettant la gestion des images\n",
"from PIL import Image\n",
"\n",
"#ouverture de l'image 1\n",
"Im1 = Image.open('img/Compo/oiseau.jpg')\n",
"\n",
"#affichage du format, du type et de la dimension de l'image 2\n",
"print(\"Nom: Im1\",\"\\nFormat:\",Im1.format,\"\\nMode:\",Im1.mode,\"\\nDimensions:\",Im1.size) ; \n",
"\n",
"#affichage de l'image\n",
"Im1"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"\n",
"#ouverture de l'image 2\n",
"Im2 = Image.open('img/Compo/montagne.jpg')\n",
"\n",
"#affichage du format, du type et de la dimension de l'image 2\n",
"print(\"Nom: Im2\",\"\\nFormat:\",Im2.format,\"\\nMode:\",Im2.mode,\"\\nDimensions:\",Im2.size) ; \n",
"\n",
"#affichage de l'image\n",
"Im2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"__1.2. Superposition par saturation.__
\n",
"$\\;\\;\\;\\;\\;$__On donne la fonction Python sup_saturation ci-dessous.__
\n",
"$\\;\\;\\;\\;\\;$__a. On suppose que les codes R,G,B de deux pixels correspondants dans les images originales sont (50,200,70) et (40,120,30).__
\n",
"$\\;\\;\\;\\;\\;\\;\\;\\;$__Quel sera le code R,G,B du pixel de l'image obtenue?__
\n",
"$\\;\\;\\;\\;\\;$__b. Exécuter les deux cellules ci-dessous pour tester la fonction sup_saturation.__
\n",
"$\\;\\;\\;\\;\\;$__c. Que peux-t-on dire de la luminosité de l'image obtenue par rapport à celles des images originales?__\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def sup_saturation(im_or1,im_or2):\n",
" \"\"\"\n",
" fonction qui superpose deux images par saturation\n",
" \"\"\"\n",
" \n",
" # vérification que les images sont de même format et taille\n",
" if (im_or1.format,im_or1.mode,im_or1.size) != (im_or2.format,im_or2.mode,im_or2.size): return \"Images incompatibles\"\n",
" \n",
" # récupération des dimensions des images originales\n",
" L,H = im_or1.size\n",
" \n",
" # création d'une image vierge, de même format et même taille que les images initiales\n",
" im_composee = Image.new( mode=im_or1.mode , size=(L,H) )\n",
" \n",
" # ouverture de l'accès aux pixels des images \n",
" pix_or1 = im_or1.load()\n",
" pix_or2 = im_or2.load()\n",
" pix_composee = im_composee.load()\n",
" \n",
" # on parcourt tous les pixels des images\n",
" for x in range(L):\n",
" for y in range(H):\n",
" R1,G1,B1 = pix_or1[x,y] #récupération des composantes R,G,B du pixel original de l'image originale im_or1\n",
" R2,G2,B2 = pix_or2[x,y] #récupération des composantes R,G,B du pixel original de l'image originale im_or2\n",
" \n",
" R = R1+R2\n",
" G = G1+G2\n",
" B = B1+B2\n",
" \n",
" pix_composee[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_composee\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"sup_saturation(Im1,Im2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"__1.3. Superposition par maximum.__
\n",
"$\\;\\;\\;\\;\\;$__On souhaite construire les composantes des pixels de la nouvelle image en prenant la plus grande des composantes des deux images.__
\n",
"$\\;\\;\\;\\;\\;$__Écrire la fonction Python sup_max qui convient.__
\n",
"$\\;\\;\\;\\;\\;$Aide : On peut utiliser la fonction Python max pour le calcul d'un maximum.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Écrire ici la fonction sup_max\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"# Tester ici un appel à la fonction sup_max\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"__1.4. Superposition par la moyenne.__
\n",
"$\\;\\;\\;\\;\\;$__On souhaite construire les composantes des pixels de la nouvelle image par calculs des moyennes des composantes des pixels initiaux.__
\n",
"$\\;\\;\\;\\;\\;$__Écrire la fonction Python sup_moyenne qui convient.__ \n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Écrire ici la fonction sup_moyenne\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Tester ici la fonction sup_moyenne\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 2. Réalisation d'un anaglyphe\n",
"\n",
"
\n",
"Un anaglyphe est une image permettant de donner l'illusion de la 3ème dimension à l'aide de lunettes à filtres bleu-rouge.
\n",
"Pour réaliser un anaglyphe, on commence par prendre deux photos de la même scène, avec un léger décalage de l'appareil (correspondant aux images perçues par les deux yeux de l'individu).\n",
"
\n",
"\n",
"![anaglyphe](img/Compo/Illu_anaglyphe.png)\n",
"\n",
"\n",
"
\n",
"\n",
"
- Si vous disposez de deux images (de mêmes type et dimensions), allez à la question 2.1.a.
\n",
"- Si vous ne disposez pas d'images, passez directement à la question 2.1.b. pour utiliser les images fournies.\n",
"\n",
"
\n",
"
\n",
"\n",
"
- Si vous disposez d'une image sur fond vert et d'une image de paysage (de mêmes type et dimensions), allez à la question 3.1.a.
\n",
"- Si vous ne disposez pas d'images, passez directement à la question 3.1.b. pour utiliser les images fournies.\n",
"\n",
"
\n",
"