Vincent GODARD - V1- 25/03/2022
Inspiré de :
Sources :
Dossier compressé à télécharger => ici.
Le jeu de données a été téléchargé lors du précédent TD (tdpy21tel)
Pour ce TD, une fenêtre a été découpée autour de l'île d'Yeu. Les données sont du 23 septembre 2021 (T30TWS_20210923T110659_TCI_b?.jp2).
# Installation de la bibliothèque rasterio qui n'est généralement pas installée en native.
!pip install rasterio
## Import des modules nécessaires dans ce TD.
import numpy as np
import matplotlib.pyplot as plt
import rasterio
from pathlib import Path
Charger préalablement ces images dans la zone dédiée à cet effet si vous êtes sur une plate-forme comme Google Colab (qui ne semble accepter que du jpg en direct ou du JPEG2000 en passant par Google Drive), Jupyter Lab, Kaggle... sinon adaptez le chemin d'accès si vous êtes sur votre disque dur.
Pour importer les fichiers jp2 (JPEG2000), charger les fichiers dans Google Drive, puis les installer dans la zone des données ("Fichiers").
from google.colab import drive
drive.mount('/content/drive')
Utiliser la commande "Copier le chemin d'accès" pour assurer un accès "sans stress" aux images avec Rasterio.
# Ouverture des 4 fichiers comme on l'a déjà fait
b2 = rasterio.open('/content/drive/MyDrive/yeu_b2.jp2')
b3 = rasterio.open('/content/drive/MyDrive/yeu_b3.jp2')
b4 = rasterio.open('/content/drive/MyDrive/yeu_b4.jp2')
b8 = rasterio.open('/content/drive/MyDrive/yeu_b8.jp2')
Nous allons voir au chapitre suivant, la description d'une méthode automatisée d'ouverture !
Une fonction est un morceau de code qui reçoit des arguments en entrée, effectue un calcul, puis génère une sortie. Elle peut être utilisée plusieurs fois dans un même script ou appelée dans d'autre scripts.
# Quelques remarques :
# Création d'une fonction qui contient un boucle de lecture de certains fichiers (qui contiennent yeu_ et finissent par jp2 !)
# Comme les images Sentinel contiennent "yeu_.jp2", ils seront seuls sélectionnés !
# La lettre "f" au début de la chaîne "next(path.glob(f'yeu_{band}.jp2'))" indique qu'il s'agit d'une chaîne formatée
# ceci permet d'inclure entre parenthèses des commandes Python pour : afficher un résultat.
def load_sentinel_image(img_folder, bands): # nom de la fonction
image = {}
path = Path(img_folder)
for band in bands: # début de la boucle
file = next(path.glob(f'yeu_{band}.jp2')) # ici la chaîne formatée
print(f'Opening file {file}')
ds = rasterio.open(file) # création d'un dataset (jeu de données) avec rasterio.open()
image.update({band: ds.read(1)})
return image
# Un dictionnaire Python est un objet qui peut stocker des paires de clés (keys) et de valeurs (values).
# Les clés peuvent correspondre à n'importe quel type de données Python "interne" (c'est-à-dire une chaîne, des nombres ou des tuples)
# Les valeurs peuvent être de n'importe quel type/objet arbitraire (ici une image).
# Utilisation de la fonction précédente pour compléter le dictionnaire des "clées" avec les bandes chargées de notre image
img = load_sentinel_image('/content/drive/MyDrive', ['b2', 'b3', 'b4', 'b8'])
img.keys()
# Interrogation de la taille lignes x colonnes de nos images
img['b2'].shape, img['b3'].shape, img['b4'].shape, img['b8'].shape
# Description de nos variables
type(img), type(img['b8'])
# Contrôle par affichage de nos variables
fig, ax = plt.subplots(1, 4, figsize=(20, 5))
ax[0].imshow(img['b2'], cmap='Blues_r')
ax[1].imshow(img['b3'], cmap='Greens_r')
ax[2].imshow(img['b4'], cmap='Reds_r')
ax[3].imshow(img['b8'], cmap='gray_r')
# Composition colorée vraies couleurs
# Affichage des compositions colorées
# alpha (brightness) pour améliorer la visualisation
# rgb = rgb/rgb.max() => division des valeurs de rgb par le max pour être entre [0;1]
# > contrainte de imshow()
def display_rgb(img, b_r, b_g, b_b, alpha=1., figsize=(10, 10)):
rgb = np.stack([img[b_r], img[b_g], img[b_b]], axis=-1)
rgb = rgb/rgb.max() * alpha
plt.figure(figsize=figsize)
plt.imshow(rgb)
# Couleurs naturelles ou vraies couleurs avec la : Bande du Rouge en rouge, Bande du Vert en vert et Bande du Bleu en bleu.
display_rgb(img, 'b4', 'b3', 'b2', alpha=2.)
# /!\ idem => problème de path à tester en résidant /!\
# Affichage des compositions colorées
# alpha (brightness) pour améliorer la visualisation
# rgb = rgb/rgb.max() => division des valeurs de rgb par le max pour être entre [0;1]
# > contrainte de imshow()
def display_rgb(img, b_r, b_g, b_b, alpha=1., figsize=(10, 10)):
rgb = np.stack([img[b_r], img[b_g], img[b_b]], axis=-1)
rgb = rgb/rgb.max() * alpha
plt.figure(figsize=figsize)
plt.imshow(rgb)
# Fausses couleurs ou pseudos couleurs avec la : Bande du PIR en rouge, Bande du Rouge en vert et Bande du Vert en bleu.
display_rgb(img, 'b8', 'b4', 'b3', alpha=2.)