{ "cells": [ { "cell_type": "markdown", "id": "437fa01c", "metadata": {}, "source": [ "# Métadonnées d'une image\n", "\n", "Dans ce TP, vous allez manipuler les métadonnées d'images pour ensuite les placer sur une carte.\n", "\n", "## Extraction des métadonnées\n", "\n", "Pour manipuler les images, on a besoin d'une librairie de manipulation d'images." ] }, { "cell_type": "code", "execution_count": null, "id": "5c9c7e32", "metadata": {}, "outputs": [], "source": [ "from PIL import Image, ExifTags" ] }, { "cell_type": "markdown", "id": "960941d7", "metadata": {}, "source": [ "Vous venez d'importer deux modules qui vous permettrons de manipuler des images et les metadonnées (les tags exifs).\n", "\n", "### Image\n", "\n", "Pour importer une image" ] }, { "cell_type": "code", "execution_count": null, "id": "cc05608c", "metadata": {}, "outputs": [], "source": [ "image1 = Image.open(\"image1.jpg\")\n", "image1" ] }, { "cell_type": "markdown", "id": "28e7d3fe", "metadata": {}, "source": [ "Pour obtenir les données exifs on pourra utiliser la méthode `._getexif()` sur l'image." ] }, { "cell_type": "code", "execution_count": null, "id": "75ad9d0a", "metadata": { "scrolled": true }, "outputs": [], "source": [ "image1._getexif()" ] }, { "cell_type": "markdown", "id": "8bddb206", "metadata": {}, "source": [ "Quel type de données est utilisé pour stocker les données exifs?" ] }, { "cell_type": "raw", "id": "7fb64ce8", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "4b9c1b9e", "metadata": {}, "source": [ "Quelles sont les informations que l'on peut trouver dans les métadonnées d'une image?" ] }, { "cell_type": "raw", "id": "7211efe2", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "f6496594", "metadata": {}, "source": [ "Quels problèmes a-t-on pour comprendre ce dictionnaire?" ] }, { "cell_type": "raw", "id": "c1ea645c", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "356814cc", "metadata": {}, "source": [ "### Comprendre les données exifs\n", "\n", "Pour donner un sens aux clés du dictionnaire des données exifs, le module `ExifTags` a un attribut `.TAGS`." ] }, { "cell_type": "code", "execution_count": null, "id": "04a8f787", "metadata": {}, "outputs": [], "source": [ "ExifTags.TAGS" ] }, { "cell_type": "markdown", "id": "545f1db5", "metadata": {}, "source": [ "Quel est ce type de données?" ] }, { "cell_type": "raw", "id": "d5ede170", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "a7564aaa", "metadata": {}, "source": [ "À quelle caractéristique correspond la clé `34853`?" ] }, { "cell_type": "code", "execution_count": null, "id": "00d8d07d", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "9b695442", "metadata": {}, "source": [ "À quelle caractéristique correspond la clé `272`?" ] }, { "cell_type": "code", "execution_count": null, "id": "c3d05add", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "1eb8842b", "metadata": {}, "source": [ "À quelle caractéristique correspond la clé `306`?" ] }, { "cell_type": "code", "execution_count": null, "id": "0ff2023d", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "b14e7a73", "metadata": {}, "source": [ "Faire une boucle sur les données exifs de l'`image1` en affichant la description de la donnée et la donnée. " ] }, { "cell_type": "code", "execution_count": null, "id": "99f357bc", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "95afa782", "metadata": {}, "source": [ "Ecrire une fonction `extrait_exit` qui prend en argument une image et qui renvoie un dictionaire contenant les données exifs (avec le clés qui doivent être la description de la donnée)." ] }, { "cell_type": "code", "execution_count": null, "id": "ce958419", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "96fb0759", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "3b677187", "metadata": {}, "source": [ "### Données GPS\n", "\n", "On s'interesse plus précisement aux données GPS de l'image.\n", "\n", "Afficher les données `'GPSInfo'` de l'`image1`." ] }, { "cell_type": "code", "execution_count": null, "id": "5b901411", "metadata": {}, "outputs": [], "source": [ "image1._getexif()[34853]" ] }, { "cell_type": "markdown", "id": "033a1730", "metadata": {}, "source": [ "Quel type est utilisé pour stocker les données GPS?" ] }, { "cell_type": "raw", "id": "086ee50f", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "322a9278", "metadata": {}, "source": [ "Quel est le type des clés?" ] }, { "cell_type": "raw", "id": "a140e2fd", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "f4f06f4c", "metadata": {}, "source": [ "Pour donner un sens à ces clés, le module `ExifTags` a un attibut `GPSTAGS` pour leur donner un sens." ] }, { "cell_type": "code", "execution_count": null, "id": "e13b29a0", "metadata": {}, "outputs": [], "source": [ "ExifTags.GPSTAGS" ] }, { "cell_type": "markdown", "id": "732ece8c", "metadata": {}, "source": [ "Ecrire une fonction `extrait_gps` qui prend en argument une image et qui renvoie un dicitonnaire avec les données GPS (avec des clés compréhensibles)" ] }, { "cell_type": "code", "execution_count": null, "id": "dbd0945a", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "7a282a17", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "77ecc152", "metadata": {}, "source": [ "La longitude et la latitude sont données sous forme de tuple (degré, minute, secondes).\n", "\n", "Pour les transformer en forme décimale, vous pouvez utiliser la fonction suivante" ] }, { "cell_type": "code", "execution_count": null, "id": "c0d9ca0f", "metadata": {}, "outputs": [], "source": [ "def gps_to_degre(gps:tuple) -> float:\n", " \"\"\"Converti des données GPS en notation décimale\n", " \n", " :param gps: tuple de données GPS (degré, minute, secondes)\n", " :return: gps en décimal\n", " \n", " :example:\n", " >>> gps_to_degre((48.0, 50.0, 44.85))\n", " 48.84579166666667\n", " \n", " \"\"\"\n", " return gps[0] + gps[1]/60 + gps[2]/3600" ] }, { "cell_type": "markdown", "id": "1d3726cd", "metadata": {}, "source": [ "Ecrire une fonction `ajoute_degre` qui prend en argument un dictionnaire contenant toutes les données gps et qui renvoie ces données où l'on a ajouté les clés `degreLattitude` et `degreLongitude` (calculés avec la fonction `gps_to_degre`)" ] }, { "cell_type": "code", "execution_count": null, "id": "d3e048d8", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "02fc0400", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "bbe16539", "metadata": {}, "source": [ "Extraire les données GPS des images \n", "\n", "- `image2.jpg`\n", "- `image3.jpg`\n", "- `image4.jpg`" ] }, { "cell_type": "code", "execution_count": null, "id": "8e6348e6", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "ccb0bb48", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "27e2647c", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "66c525f8", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "2b0004af", "metadata": {}, "source": [ "## Folium\n", "\n", "Folium est une librairie qui permet de manipuler des cartes." ] }, { "cell_type": "code", "execution_count": null, "id": "b4e23b6c", "metadata": {}, "outputs": [], "source": [ "from folium import Map, Marker" ] }, { "cell_type": "markdown", "id": "ad5694a8", "metadata": {}, "source": [ "Créer une carte" ] }, { "cell_type": "code", "execution_count": null, "id": "a5822416", "metadata": {}, "outputs": [], "source": [ "carte = Map(location=[45.5236, -122.6750])\n", "marqueur = Marker(location=[45.5236, -122.6750])\n", "marqueur.add_to(carte)" ] }, { "cell_type": "code", "execution_count": null, "id": "7ce827c7", "metadata": {}, "outputs": [], "source": [ "carte" ] }, { "cell_type": "markdown", "id": "e8ca713b", "metadata": {}, "source": [ "À quoi correspond la liste de nombres passés en argument de la fonction `Map` ou de `Marker`?" ] }, { "cell_type": "raw", "id": "281f1e36", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "id": "21c54fff", "metadata": {}, "source": [ "À vous de géolocaliser les images suivantes:\n", "\n", "- `image1.jpg`\n", "- `image2.jpg`\n", "- `image3.jpg`\n", "- `image4.jpg`" ] }, { "cell_type": "code", "execution_count": null, "id": "ae1323d6", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.10" } }, "nbformat": 4, "nbformat_minor": 5 }