Télédétection
Calcul d'indices spectraux - classification par seuillage

Licence Creative Commons

Liste des exercices

Objectifs d'apprentissage

À la fin de ce TD, tu seras en mesure de classifier de manière "experte" une image de télédétection multispectrale à partir d'une analyse de la dynamique spectrale de l'image. De façon plus détaillée, tu seras en mesure de :

Pour atteindres ces objectifs d'apprentissages, tu seras amené à utiliser les outils suivants :

Indice de végétation

Parmi les indices radiométriques existants, seul le NDVI sera utilisé dans ce TD car il est l'indice de végétation le plus utilisé en télédétection.

Pour rappel, la formule du NDVI est la suivante :

NDVI=IRRIR+RNDVI = \frac{IR - R}{IR + R}

Il est possible de calculer le NDVI de plusieurs manières. Soit :

Les deux premiers outils permettent de faire des opérations entre les bandes des différentes images que tu as chargées dans QGIS. On peut les utiliser pour calculer le NDVI mais également pour d'autres calculs. En revanche, les deux outils suivent une syntaxe qui n'est pas la même (ce serait trop facile). Pour la calculatrice raster tu peux te référer à cette doc et pour la syntaxe de BandMath à cette doc.

La Calculatrice Raster est disponible depuis le menu Raster ► Calculatrice Raster.

Outil Calculatrice Raster

Pour la calculatrice raster il faudra rentrer la formule suivante pour le calcul du NDVI (dans la partie expression de la calculatrice raster sur la figure ci-dessus):

("fabas_octobre_2013@4"-"fabas_octobre_2013@1")/("fabas_octobre_2013@4"+"fabas_octobre_2013@1")

L'application BandMath est quant à elle disponible depuis la Boîte à outils de traitements ► OTB ► Image Manipulation ► BandMath.

Outil BandMath

L'expression à rentrer pour le calcul du NDVI (dans la partie expression sur la figure ci-dessus) est :

(im1b4-im1b1)/(im1b4+im1b1)

Voici également un exemple de syntaxe de pour l'application OTB BandMath en ligne de commande :

otbcli_BandMath \
    -il fabas_octobre_2013.tif \
    -out ndvi_fabas.tif \
    -exp "(im1b4-im1b1)/(im1b4+im1b1)"

Enfin, voici un exemple de syntaxe de pour l'application OTB RadiometricIndices en ligne de commande :

otbcli_RadiometricIndices \
    -in fabas_12_10_2013.tif \
    -list Vegetation:NDVI \
    -channels.red 1 \
    -channels.nir 4  \
    -out ndvi_fabas.tif

Tips n°1 : Consulte la documentation ! De manière générale, n'hésite pas à consulter la documentation des applications que tu utilises pour savoir comment remplir certains champs.

Tu peux obtenir de l'aide en cliquant sur l'icone d'aide en bas des fenêtres des applications.

Tips n°2 : Une différence entre la Calculatrice Raster et l'application BandMath est qu'il est possible de choisir le type de données en sortie avec BandMath alors que ce n'est possible avec la Calculatrice Raster. Avec cette dernière application, les images en sortie sont par défaut en flottant de 32 bits (les images prennent donc beaucoup de place sur l'espace disque, parfois plus que nécessaire).
Je te conseillerais donc de plutôt utiliser BandMath pour toujours avoir en tête le type des images en sortie.

: Calculer un indice de végétation.

Tu es libre d'utiliser l'outil de votre choix.

  • Calcule le NDVI ;
    • Pour le 12 octobre ;
    • pour le 10 décembre ;
  • Compare le NDVI de chaque date (à l'aide de MapSwipeTool par exemple) et explique ce que tu vois.
  • Teste les deux autres outils sur une seule date cette fois-ci.
  • Marque dans l'exercice comme terminé dans Moodle.

Tu vas te tromper, et c'est normal ;)

Tu vas faire des erreurs, c'est normal. Ce serait de ne pas en faire qui n'est pas normal. Certaines peuvent être dues à une mauvaise utilisation des paramètres d'une application, il faut dans ce cas là se référer à l'aide des applications. D'autres erreurs sont dues à de l'inattention, parce que tu es allé·e trop vite, emporté·e par ton enthousiame.

Dans tous les cas, prends le temps de regarder les messages d'erreur. Ils ne sont pas toujours faciles à comprendre mais ils t'aideront souvent (pas toujours malheureusement) à trouver la source de ton erreur (voir exemple sur la figure ci-dessous).


Exemple d'une erreur de frappe lors de l'utilisation de l'application RadiometricIndices (l'erreur est surlignée dans la partie de droite).

Seuillage d'image (classification experte)

Dans ce TD, tu vas réaliser ta première classification : tu vas attribuer à chaque pixel d'une image un label qui correspondra à une occupation du sol. Aujourd'hui, nous nous focaliserons sur une approche non supervisée et manuelle : tu vas déterminer toi même les règles permettant de discrimer les labels de chaque pixel.

En fonction de ton interlocuteur, le terme utilisé pourra varier. Certains parleront de segmentation (simple) d'images, d'autres de classification experte (au sens d'expertisée par une personne) ou encore de seuillage.

De quelle occupation du sol parle-t-on ?

Dans ce TD nous ne connaissons pas a priori les occupations du sol qu'il est possible de discriminer (--> c'est pour ça qu'on parle d'approche non supervisée). Tu vas analyser les dynamiques spectrales des images, aussi bien des bandes natives (Rouge, Vert, Bleu et Proche Infrarouge) que de l'indice NDVI. Tu verras dans un premier temps comment analyser la dynamique spectrale d'une bande (ou d'un indice) puis dans un second temps comment analyser la dynamique de deux bandes en même temps.

Analyse spectrale 1D

Dans le meilleur des mondes, les occupations du sol principales présentes dans une image peuvent être identifées sur l'histogramme d'une bande. Dans l'histogramme théorique ci dessous, les classes de sol nu, Herbe, Ligneux bas et Ligneux Hauts se distinguent par des modes différents (ou des pics). Dans ce cas là on peut imaginer différencier ces classes grâce à des seuils entre les modes. La "hauteur" des modes nous renseigne quant à elle à quel point c'est classe est présente dans la zone d'étude.

Exemple d'histogramme de NDVI théorique pour des milieux de garrigue.

Aujourd'hui, les classes d'occupation du sol que tu vas classifier ne correspondront pas forcément à du sol nu, de l'herbe, des ligneux bas ou des ligneux hauts. À toi de le découvrir !

Tu peux visualiser les histogrammes d'une bande dans QGIS en : Clique Droit sur la couche votre choix ► Propriétés ► Histogramme :

Histogramme du NDVI de l'image du 10 décembre.

Remarque : les histogrammes peuvent parfois être plus difficiles à lire selon les machines avec lesquelles tu vas travailler.

: Identifier des modes sur un histogramme.

Dans cette partie, tu vas afficher l'histogramme du NDVI d'octobre et essayer d'identifier à quelle occupation du sol correspond les modes que tu observes :

  • Regarde l'Histogramme et identifies les maximums locaux ;
  • Note les caractéristiques de chaque mode (position centrale et largeur).
  • Par chaque mode, essaie de déterminer dans l'image à quels pixels ils correspondent (à l'aide de Value Tool, en réglant le contraste de l'image).

  • Marque dans l'exercice comme terminé dans Moodle.

Seuillage 1D

Ici, l'objectif est de regrouper les pixels ayant des caractéristiques spectrales similaires. L'analyse de l'histogramme que tu as faite dans la partie précédente t'a permis d'identifier plusieurs classes spectrales. Tu vas maintenant attribuer un label à chacun des pixels grâce à l'aide de l'application BandMath ou de la calculatrice raster.

Le principe est d'attribuer un label (par exemple 2) à des pixels ayant une gamme de valeurs que tu auras déterminée (par exemple les pixels compris entre -0.2 et 0). Selon l'application choisie la syntaxe n'est pas la même.

La syntaxe entre les calculatrices est légèrement différente mais le principe reste le même.

Syntaxe et fonctionnement des calculatrices raster

Pour les explications, prenons l'exemple d'un raster ImgA qui contient des entiers entere 1 et 7. Pour sélectionner les pixels compris entre 4 et 5 la syntaxe à utiliser est la suivante pour la calculatrice raster est :

("ImgA@1" > 3 ) AND ("ImgA@1" < 6)

ou la suivante pour l'application BandMath :

(im1b1 > 3 ) and (im1b1 < 6)

Si cette formule est entrée telle quelle, le raster en sortie aura pour valeur 1 là où la condition est respectée et 0 ailleurs. Pour attribuer la valeur de 3 à la plage de valeur sélectionnée, on multiplie tout simplement le résultat par 3, les autres zones auront toujours pour valeur 0. Ces deux étapes sont résumées dans la figure ci dessous.

Changer une plage de valeurs avec une calculatrice raster, exemple 1. En rouge la syntaxe de la calculatrice raster de QGIS et en violet celle de BandMath.

Il est possible d'obtenir l'image C avec un seul traitement en entrant une formule légèrement plus complexe :

Changer une plage de valeurs avec une calculatrice raster, exemple 2. En rouge la syntaxe de la calculatrice raster de QGIS et en violet celle de BandMath.

Si tu veux attribuer un autre label (par ex. 2) à une autre plage de valeurs (par ex. les valeurs inférieures à 3), tu peux additionner des conditions ensemble :

Changer une plage de valeurs avec une calculatrice raster, exemple 3. En rouge la syntaxe de la calculatrice raster de QGIS et en violet celle de BandMath.

Erreur courante : conditions qui ne sont pas mutuellement exlusives

La combinaison de plusieurs conditions n'est possible que si les plages de valeurs sélectionnées sont mutuellement exclusives. C'était le cas dans les exemples ci dessus. Imaginons maintenant que la condition pour obtenir l'image D soit légèrement différente et est "ImgA@1" < 5 au lieu de "ImgA@1" < 4 (voir figure ci-dessous).

Dans ce cas l'image E en sortie comportera 4 valeurs au lieu de 3 :

  • 0 pour les pixels qui ne respectent aucune condition ;
  • 3 pour les pixels qui respectent uniquement la première condition ;
  • 2 pour les pixels qui respectent uniquement la deuxième condition ;
  • 5 (2 + 3) pour les pixels qui respectent les deux conditions --> résultat non souhaité (dans la majorité des cas).
Changer une plage de valeurs avec une calculatrice raster, exemple de combinaison de deux conditions qui ne sont pas mutuellement exclusives. En rouge la syntaxe de la calculatrice raster de QGIS et en violet celle de BandMath

Si tu souhaites simplement masquer une partie de l'image, c'est possible aussi. Dans ce cas là, selectionne la plage de valeurs à garder et multiplie la par l'image d'origine :

Masquer une partie de l'image avec la calculatrice raster. En rouge la syntaxe de la calculatrice raster de QGIS et en violet celle de BandMath

: As-tu bien compris la syntaxe de la calculatrice raster ?

Si tu appliques les formules suivantes (ne le fais pas dans QGIS, tu n'apprendrais rien en faisant ça) :

  • combien de valeurs comporteront les rasters en sortie ?
  • quelles sont ces valeurs ?
  • à quelles valeurs initiales correspondent les nouvelles valeurs ?

1. On se chauffe tranquillement :

(("fabas_decembre_2013_ndvi@1" > -0.1) AND ("fabas_decembre_2013_ndvi@1" < 0.1)) * 2 +
((("fabas_decembre_2013_ndvi@1" > 0.2) AND ("fabas_decembre_2013_ndvi@1" < 0.35))) * 5

2 Un peu plus dur :

("fabas_decembre_2013_ndvi@1" < -0.1) +
(("fabas_decembre_2013_ndvi@1" > -0.1) AND ("fabas_decembre_2013_ndvi@1" < 0.1)) * 2 +
((("fabas_decembre_2013_ndvi@1" > 0.2) AND ("fabas_decembre_2013_ndvi@1" < 0.35))) * 5 +
("fabas_decembre_2013_ndvi@1" > 0.35) * 7

3 Encore plus dur :

(("fabas_decembre_2013_ndvi@1" > -0.1) AND ("fabas_decembre_2013_ndvi@1" < 0.1)) * 2 +
((("fabas_decembre_2013_ndvi@1" > 0.2) AND ("fabas_decembre_2013_ndvi@1" < 0.35))) * 5 +
((("fabas_decembre_2013_ndvi@1" > 0.05) AND ("fabas_decembre_2013_ndvi@1" < 0.25))) * 3


  • Marque dans l'exercice comme terminé dans Moodle.

Comme tu as pu le voir dans ces différents exemples, les syntaxes de BandMath et de la calculatrice raster de QGIS ne sont pas très différentes. Les principales différences sont résumées dans le tableau ci-dessous :

Propriété calculatrice raster BandMath
Nom de l'image "ImgA" (à sélectionner dans la liste des images dispos) im1 (1 parce que c'est la première image que tu auras sélectionnée, mais mets 2 si tu as selectionné deux images et que tu veux faire l'opération sur la deuxième)
Numéro de la bande @X (avec X correspondant au numéro de la bande) bX (avec X correspondant au numéro de la bande)
Opérateur logique ET AND and
Opérateur logique OU OR or
Principale différences entre les syntaxes de la calculatrice raster de Qgis et celle de BandMath.

Rappel : l'avantage de BandMath par rapport à la calculatrice raster est que tu peux définir le type de l'image en sortie (par exemple en entier 8 bits).

Mise en pratique

: Seuillage d'une image en utilisant une seule bande.

À l'aide de l'application BandMath ou la calculatrice raster.

1 Seuille ton image de NDVI pour obtenir une image (une classification) à une classe pour commencer : choisis un des modes identifié précédemment, celui que tu préfères, sélectionne la plage de valeurs lui correspondant à l'aide de la syntaxe de l'outil que tu utilises et attribue lui une valeur de 31 (et pourquoi pas ?)

2 Seuille ton image de NDVI pour obtenir une classification avec autant de classes que de modes identifiés précédemment : cette fois attribue des nouvelles valeurs 11, 22, 33 etc. par ordre croissant de NDVI.

3 Quel est le type de l'image en sortie qu'il faudrait renseigner (si possible) ?

4 À quoi correspondent les classes obtenues (il est possible qu'une classe correspondent à plusieurs occupations du sol) ?

5 Marque dans l'exercice comme terminé dans Moodle.

Tips n°1 : Si par hasard tu t'es trompé·e dans le type de données en sortie, ou que tu utilises un outil qui ne te permette pas de le choisir, tu peux bien sûr relancer le traitement, mais tu peux aussi utiliser l'outil Convertir de GDAL. Si ton traitement prends du temps, ça peut représenter un gain de temps non négligeable !

Tips n°2 : Dans cette partie, tu as utilisé la Calculatrice Raster ou BandMath pour reclasser les valeurs de l'image fabas_octobre_2013_ndvi.tif. L'attribution de nouveaux labels s'est basée sur une seule bande (correspondant ici au NDVI). Dans le cas des images mono-bandes, tu peux également utiliser l'outil reclassifier par table dans le menu analyse raster dans la boite outils à traitements qui permet de faire la même chose sans avoir besoin de faire de formule. Tu trouveras la manière de procéder sur la documentation de QGIS si ça t'intéresse.

Pourquoi le prof ne t'en a pas parlé plus tôt ? : Parce que cet outil ne permet pas d'attribuer des nouveaux labels en se basant sur les valeurs de plusieurs bandes (cf. partie suivante). C'est pour cette raison que tu ne vois pas cet outil plus en détails.

Analyse spectrale 2D

Pour cette partie, il faut installer le plugin RasterDataPlotting (installer un plugin).

Répartition spectrale des réflectances dans le rouge et le proche infrarouge

L'objectif est de repérer des classes spectrales à partir des bandes Rouge et Infrarouge. On parle de Scatter Plot 2D. Cette représentation est très utile pour distinguer les différents types de végétation, de sol et d’enneigement (voir figure ci-dessus).

Tu peux obtenir cette représentation en configurant le pluggin RasterDataPlotting comme suit :

Configuration du pluggin RasterDataPlotting pour obtenir un scatter Plot 2D representant la bande Rouge et Infra-rouge.

: Afficher un scatter plot 2D d'une image

Affiche le Scatter Plot 2D de l'image fabas_octobre_2013.tif avec la bande Rouge en abscisse et la bande InfraRouge en ordonnée.

Marque dans l'exercice comme terminé dans Moodle.

Comment faire pour faire le lien entre le scatter plot et les pixels de l'image ?

Deux fonctionnalités peuvent t'aider à faire le lien entre les classes spectrales que tu as distinguées sur le scatter plot et les occupations du sol. La première est le fait que seul les pixels contenus dans l'emprise de ton Canevas QGIS sont affichés dans dans le scatter plot : pour voir le comportement spectrale d'une occupation du sol, zoome sur celle-ci comme sur l'exemple ci-dessous.

Le Scatter Plot s'adapte à l'emprise de votre Canevas.

De manière inverse tu peux mettre en évidence sur le Canevas les pixels correspondant à une classe spectrale en utilisant le bouton Spectral ROI comme sur l'exemple ci-dessous. Attention toutefois, l'utilisation des Spectral ROI demande un peu de doigté et sera certainement source de frustration au bout de quelques essais infructueux. Prends patience ! cet outil en vaut la peine.

Exemple de mise en évidence de classes spectrales.

: Identifier des classes spectrales sur un Scatter Plot 2D

  1. Combien de classes spectrales distingues-tu ?

  2. Identifie à quelles occupations du sol correspondent tes classes spectrales :

    • en zommant sur une occupation du sol en particulier (cf explication ci dessus);
    • à l'aide de Spectral ROI (cf explication ci dessus);
  3. Comme pour les modes des histogrammes 1D, notez les caractéristiques de chaque classe spectrale. Vous identifierez cette fois des équations de droite qui séparent deux classes, ou des bornes inférieurs et supérieurs de chaque bandes.

  4. Marque dans l'exercice comme terminé dans Moodle.

Astuce : équation d'une droite

À partir de deux points (identifiés visuellement, en zoomant sur le scatter plot) vous pouvez déterminer l'équation d'une droite. Ça remonte à loin tout ça, je sais je sais ...


Relever les coordonnées d'un point sur le scatter plot n'est pas une gageure.

Tips n°1 : tu n'as probablement pas besoin d'être très précis pour déterminer les points de tes droites et obtenir de résultat correct, donc tu peux soufler un peu.

Tips n°2 : tu peux afficher des grilles en réglant les paramètres de Clique droit sur le graphique ► Plot Options ► Grid

Tips n°3 : tu peux gagner en précision en zommant sur le graphique.

C'est pas parfait, mais on a que ça en stock ... 😶

Seuillage du Scatter splot

Ici, l'objectif est encore et toujours de regrouper les pixels ayant des caractéristiques spectrales similaires. L'analyse du scatter plot que tu as faite dans la partie précédente t'a permis d'identifier plusieurs classes spectrales. Tu vas maintenant attribuer un label à chacun des pixels.

Deux classes spectrales séparables par une droite dans le plan spectral IR / R

La distinction de deux classes (2 et 0 par exemple) séparées par une droite dessinée dans le plan spectral constitué par la bande Infra rouge (bande 4) et la bande Rouge (bande 1) comme sur la figure ci-dessus, peut se faire avec BandMath comme suit :

(im1b4 > (a * im1b1 + b)) * 2

Tips : sélectionner des pixels à l'aide d'équation de droite te parait abscon ? Remarque alors que les droites verticales et horizontales ne sont que des cas particuliers où x = ValeurSeuil et y = ValeurSeuil. Dans le cas de l'histogramme, tu te contentais de sélectionner des pixels à l'aide de règles telles que x < 0.1, ce qui n'était rien d'autre que de dire que tu sélectionnais les pixels à droite de la droite d'équation x = 0.1

: Seuillage d'une image en utilisant deux bandes.

  1. À l'aide de l'application BandMath ou la calculatrice raster, seuille ton image et enregistre ton seuillage finale (par ex: fabas_octobre_2013_seuil.tif). Ne supprime pas l'image à la fin du TD, on s'en reservira plus tard (quel suspense ! 😱)
  2. Quel type de d'image en sortie faut il renseigner ? et surtout, pourquoi ?
  3. Change éventuellement le mode de représentation de l'image : Clique droit ► propriétés ► syle de couche ► Palette /Uniques (Doc) pour que le résultat de ton seuillage soit plus lisible :
Exemple de sémiologie à obtenir pour votre classification.
  1. Les classes issues ton seuillage sont-elles conformes à ce que tu avais repéré précédemment ?

  2. Marque dans l'exercice comme terminé dans Moodle.

: C'est l'heure du rangement.

Fais le ménage sur ton disque dur :

  • supprime tous les fichiers intermédiaires, les erreurs, les tests que tu ne ré-utiliseras plus. Si te es syllogomane avant l'heure, range les au minimum dans un dossier dédié (dossier temp ou fichiers_intermediaires par ex.).

  • renomme les résultats finaux que tu aurais nommés à la hate image_ok_v3_final2_definitif.tif (on fait tous ça): votre moi futur vous remerciera 👍

Si ce n'est pas déjà le cas, prends cette habitude de bien ranger ton ordinateur à la fin d'un TD.

Marque dans l'exercice comme terminé dans Moodle.