Sentinel 2 à 1m:Analyse chronologique multi-dates – comprendre l’évolution des habitats côtiers

L’intérêt majeur de l’imagerie satellite n’est pas seulement de cartographier un état à un instant donné, mais de suivre son évolution dans le temps. Grâce aux archives Sentinel-2 — disponibles depuis 2015 et actualisées tous les 5 jours — il devient possible de :

  • détecter les dynamiques saisonnières (croissance, blanchissement, turbidité),
  • identifier les conséquences d’un épisode météorologique (cyclone, houle, fortes pluies),
  • repérer les tendances lentes (érosion, envasement, dégradation ou restauration).

Cette approche, appelée analyse chronologique multi-dates, repose sur la comparaison d’indices spectraux calculés régulièrement sur les mêmes zones : NDVI, MNDWI, BSI, mais aussi des indices spécifiques aux coraux ou aux herbiers.



Construire un “time cube” : empiler les images dans le temps

Pour analyser plusieurs dates simultanément, on crée ce qu’on appelle un cube temporel : un fichier raster multi-bandes où chaque bande correspond à une date.

Exemple :

  • Bande 1 → NDVI du 22/01/2025
  • Bande 2 → NDVI du 06/06/2025
  • Bande 3 → NDVI du 25/08/2025
  • etc.

Cet empilement permet :

  • de visualiser une animation directement dans QGIS,
  • de calculer la variation temporelle (ΔNDVI, ΔBSI, ΔMNDWI),
  • de repérer automatiquement les anomalies (chute brutale de NDVI = événement perturbateur).


Mesurer les changements : variation et anomalies

Une fois les indices empilés, plusieurs analyses deviennent possibles :

Variation absolue

On calcule simplement :

.
\(\Delta NDVI = NDVI_{\text{date2}} – NDVI_{\text{date1}}
\)

.
Cela permet de mettre en évidence :

  • une baisse de NDVI sur les récifs (blanchissement ou turbidité élevée),
  • une hausse liée à la repousse des herbiers,
  • une augmentation de BSI liée à des dépôts sédimentaires.

Variation relative

.

\(\Delta NDVI_{rel} = \frac{NDVI_{d2} – NDVI_{d1}}{NDVI_{d1}}
\)

.
Plus sensible aux changements sur les zones déjà peu végétalisées.

Détection d’anomalies

On compare une date récente à la médiane sur plusieurs années :

  • zones anormalement claires → blanchissement potentiel,
  • zones anormalement foncées → turbidité, pollution ou sédimentation.


Animation temporelle sous QGIS

QGIS permet maintenant de créer une animation temporelle de l’évolution des indices :

  • on active le mode temporel,
  • on charge chaque indice multi-dates,
  • QGIS joue les dates comme des images successives.

Cette visualisation est très efficace pour montrer :

  • la montée en turbidité après une forte pluie,
  • la récupération progressive d’un herbier,
  • le transport de sédiments après une houle cyclonique.

Idéal pour la communication, le suivi scientifique ou l’aide à la décision locale.


Appliquer l’analyse temporelle aux habitats côtiers

Les indices présentés dans l’article permettent de mieux distinguer :

  • Les coraux : NDVI très faible, BSI stable, MNDWI négatif
  • Les herbiers : NDVI modérément positif
  • Les mangroves : NDVI élevé
  • Les zones sableuses : BSI positif, NDVI très faible
  • Les eaux turbides : MNDWI fluctuant

En combinant ces signatures avec une analyse multi-dates, on peut suivre :

  • l’extension ou la régression des herbiers,
  • le blanchissement saisonnier ou post-cyclonique des coraux,
  • l’évolution des dépôts sableux dans les lagons,
  • la turbidité après les crues.


Objectif final : un tableau de bord d’évolution des récifs

L’étape suivante consistera à automatiser cette chaîne :

  1. Télécharger automatiquement chaque série Sentinel-2.
  2. Calculer les indices NDVI/BSI/MNDWI.
  3. Produire un cube temporel.
  4. Détecter automatiquement les zones en changement.
  5. Extraire les tendances de chaque habitat.

À terme, cela permettra de créer un tableau de bord des récifs, capable d’alerter dès qu’un changement rapide est détecté.


Tutoriel technique : produire une analyse multi-dates Sentinel-2 avec Google Colab

Dans cette section, nous allons reconstruire toute la chaîne de traitement utilisée précédemment, depuis l’accès à Sentinel-2 jusqu’à la création d’un cube temporel, puis d’une carte de variation ΔNDVI.
L’objectif est que tu puisses reproduire exactement l’analyse pour n’importe quelle zone de Rodrigues ou de Maurice.

Ce tutoriel repose sur Google Colab, donc aucune installation locale n’est nécessaire.


Préparer l’environnement dans Google Colab

Copiez-collez ce bloc en haut de votre notebook :

script Colab

# =========================================================
#   S2DR3 + Indices Sentinel-2 + Cube temporel
#   Tutoriel pour Google Colab
# =========================================================

from google.colab import drive
drive.mount('/content/drive')

# Dossier de sortie
!mkdir -p /content/drive/MyDrive/Sentinel2_Multidate/output
!ln -s /content/drive/MyDrive/Sentinel2_Multidate/output /content/output

# Installation du moteur de super-résolution S2DR3
!pip -q install https://storage.googleapis.com/0x7ff601307fa5/s2dr3-20250905.1-cp312-cp312-linux_x86_64.whl

import os, glob
import numpy as np
import rasterio
from rasterio.warp import reproject, Resampling
import scipy.ndimage as ndi
import s2dr3.inferutils


Définir les dates et lancer S2DR3

Chaque date sera téléchargée, traitée, super-résolue, puis les indices seront calculés automatiquement.

script Colab

# Liste des dates (format AAAAMMJJ)
dates = ['20251009','20250825','20250606','20250422','20250122','20241128']
lonlat = (57.73, -20.44)  # Blue Bay / Île aux Aigrettes

root_dir = '/content/drive/MyDrive/Sentinel2_Multidate/output'


Script complet de calcul des indices (NDVI, BSI, MNDWI)

Ce script :

  • télécharge l’image,
  • calcule les indices,
  • génère NDVI.tif, BSI.tif, MNDWI.tif pour chaque date.

script Colab

# =========================================================
#     CALCUL DES INDICES POUR CHAQUE DATE
# =========================================================
for date in dates:
    print(f"\n  Traitement : {date}")
    outdir = os.path.join(root_dir, date)
    os.makedirs(outdir, exist_ok=True)

    # --- 1. Télécharger et super-résoudre (10m → 1m) ---
    s2dr3.inferutils.test(lonlat, date)

    # Trouver le fichier *_MS.tif (super-résolution multispectrale)
    ms_files = glob.glob('/content/output/*_MS.tif')
    if not ms_files:
        print(f" Aucun fichier MS pour {date}")
        continue
    ms_path = ms_files[0]

    # --- 2. Charger le raster ---
    with rasterio.open(ms_path) as src:
        img = src.read()
        profile = src.profile
        # Sentinel-2 super-résolue → bandes : B2,B3,B4,B8 (BLEU, VERT, ROUGE, NIR)
        blue, green, red, nir = img

    # --- 3. Calcul des indices ---
    ndvi  = (nir - red) / (nir + red + 1e-6)
    bsi   = ((red + nir) - (blue + green)) / ((red + nir) + (blue + green) + 1e-6)
    mndwi = (green - nir) / (green + nir + 1e-6)

    # --- 4. Sauvegarde ---
    for arr, name in [(ndvi, 'NDVI'), (bsi, 'BSI'), (mndwi, 'MNDWI')]:
        out_path = os.path.join(outdir, f'{name}.tif')
        p = profile.copy()
        p.update(dtype='float32', count=1, compress='lzw')
        with rasterio.open(out_path, 'w', **p) as dst:
            dst.write(arr.astype('float32'), 1)

    print(f" Indices calculés pour {date}")


Créer un cube temporel NDVI (empilement multi-dates)

Ce fichier “NDVI_cube.tif” contiendra une bande par date, toujours dans le même ordre.

script Colab

# =========================================================
#      CREATION DU CUBE TEMPOREL NDVI
# =========================================================

cube_path = os.path.join(root_dir, "NDVI_cube.tif")

ndvi_stack = []
ref_profile = None

for date in dates:
    ndvi_path = os.path.join(root_dir, date, "NDVI.tif")
    if not os.path.exists(ndvi_path):
        print(f" NDVI manquant : {date}")
        continue

    with rasterio.open(ndvi_path) as src:
        if ref_profile is None:
            ref_profile = src.profile.copy()
        ndvi_stack.append(src.read(1))

ndvi_stack = np.stack(ndvi_stack, axis=0)

# Mise à jour du profil (une bande par date)
ref_profile.update(count=len(ndvi_stack))

with rasterio.open(cube_path, 'w', **ref_profile) as dst:
    dst.write(ndvi_stack)

print(f"\n Cube temporel NDVI généré → {cube_path}")


Calculer la carte de variation ΔNDVI

Comparons la dernière date à la première :

script Colab

# =========================================================
#      CALCUL DU ΔNDVI (variation temporelle)
# =========================================================

delta_path = os.path.join(root_dir, "Delta_NDVI.tif")

# bande 1 = date la plus ancienne
# bande N = date la plus récente
ndvi_early = ndvi_stack[0]
ndvi_late  = ndvi_stack[-1]

delta_ndvi = ndvi_late - ndvi_early

p = ref_profile.copy()
p.update(count=1)

with rasterio.open(delta_path, 'w', **p) as dst:
    dst.write(delta_ndvi.astype('float32'), 1)

print(f" Carte de variation ΔNDVI créée → {delta_path}")


Résultat : prêt à charger dans QGIS

Vous obtenez automatiquement :

✔ Un dossier par date contenant :

  • NDVI.tif
  • BSI.tif
  • MNDWI.tif

✔ Un NDVI_cube.tif prêt pour l’animation temporelle dans QGIS
✔ Un Delta_NDVI.tif pour repérer les zones en évolution (dégradation / récupération)


Et ensuite ?

Dans QGIS, vous pouvez :

  • visualiser le cube NDVI en mode temporalité (animation),
  • comparer les variations NDVI / BSI / MNDWI,
  • détecter zones affaiblies, blanchies, envasées, ou régénérées,
  • extraire automatiquement les zones en changement.


Si cet article vous a intéressé et que vous pensez qu'il pourrait bénéficier à d'autres personnes, n'hésitez pas à le partager sur vos réseaux sociaux en utilisant les boutons ci-dessous. Votre partage est apprécié !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *