Tutoriel SCP:réussir un classement supervisé avec calcul de texture(1)

Nous continuons la série d’articles sur la Classification supervisée d’images de drone en milieu littoral. La première étape, indispensable pour pouvoir bien gérer la sélection des bandes à utiliser pour chaque étape du traitement, est de décomposer l’image aérienne originale, comportant trois bandes : rouge, vert et bleu, en trois images séparées. Nous utilisons pour tout le traitement QGis et le plugin SCP.

Décomposition de la mosaïque en trois bandes séparées : rouge, vert, bleu

Pour effectuer cette opération on utilise le traitement de QGis « Réordonner les bandes »

Réordonner les bandes

Dans « Bande(s) sélectionnée(s) » sélectionnez la bande à extraire

Dans « Type de données en sortie » sélectionnez « Byte »

Dans « Converti» définissez le nom et l’emplacement du fichier raster en sortie. Le résultat est ajouté à la fenêtre cartographique

Utiliser une des bandes comme source pour le calcul de texture de terrain avec r.texture

Attention ! r.texture est un traitement de Grass 7. Vous devez lancer « QGis Desktop avec Grass 7 » au lieu de « QGis Desktop »

r.texture

Pour plus de détails voir l’aide en ligne Grass de r.texture

Dans la fenêtre Traitements allez dans l’onglet Grass7 et lancez le traitement r.texture.

Textural measurement method(s) permet de choisir les différentes variables en sortie :

La taille de la fenêtre mobile détermine la taille réelle des éléments de texture détectés. Si vous avez des pixels de 10cm, une fenêtre de 3×3 mettra en lumière des textures de l’ordre de 30cm, une fenêtre de 15×15 des textures de l’ordre de 1,5m, etc. Les images suivantes montrent le résultat de trois tailles de fenêtre différentes : 3×3, 15×15 et 25×25. L’image a une taille de 1500×750 pixels.

fenêtre 3×3

fenêtre 15×15

fenêtre 25×25

Pour la suite de notre exemple nous choisissons la fenêtre de 15×15.

Convertir les rasters de texture en rasters entiers avec des plages de valeurs normalisées en 0-255

Cette étape « étire » les valeurs des différentes variables calculées par r.texture dans une plage de valeurs entre 0 et 255. Ceci permet un traitement homogène dans le plugin SCP. En effet, les différentes mesures de texture donnent des valeurs de magnitudes très différentes ce qui entraînerait, en cas de non normalisation, de privilégier la prise en compte d’un type de mesure en raison de la magnitude des valeurs et non de leur pouvoir de discrimination.

On évite ce type de problème en ramenant toutes les types de mesure à des valeurs comprises entre 0 et 255.

On pourrait faire cette opération directement sur le raster en sortie de r.texture, en ramenant à 0 la valeur minimale observée et à 255 la valeur maximale. Mais il convient de vérifier que ces rasters en sortie de r.texture n’ont pas des « effets de bord » qui affectent ces deux valeurs extrêmes.

Résultat de texture

Prenons l’exemple de la mesure de la variance de la différence (DV) dans notre zone.

Si nous chargeons le raster dans QGis nous avons :

Les valeurs obtenues vont de -0.00000153 à 0.00115. Mais, visuellement, on s’aperçoit qu’il a un problème car on ne voit pas de détails dans la texture.

Histogramme

Si nous effectuons l’histogramme de ce raster nous avons l’explication :

On voit que l’essentiel des valeurs se situe entre 0 et 0.0001 mais que des effets de bord produisent des valeurs bien supérieures mais très peu nombreuses.

Si on souhaite utiliser cette mesure de texture dans la classification d’image, on doit enlever ces valeurs parasites du raster.

Pour cela, nous utilisons la calculatrice raster pour définir l’étendue souhaitée et l’affichage de l’histogramme pour valider notre choix. Selon les cas, on peut être amenés à boucler cette opération jusqu’à trouver un bon compromis.

Calculatrice raster

L’utilisation de la calculatrice raster de QGis, dans l’opération qui nous intéresse (calcul conditionnel), n’est pas très intuitive. Voyons cela un peu en détail.

Nous souhaitons modifier certaines valeurs du raster en entrée et pas d’autres : les valeurs inférieures à 0 nous souhaitons leur affecter la valeur 0 et pour les valeurs supérieures à 0.00004 on veut les ramener à cette valeur.

On aura donc deux traitements différents pour ces valeurs, plus un traitement pour les valeurs qui sont déjà comprises entre nos deux bornes.

Dans la syntaxe de la calculatrice raster cela se traduit par trois traitements séparés par le signe +

Traitement1 + Traitement2 + Traitement3

Voyons maintenant la syntaxe d’un traitement conditionnel du type si val>X alors…

La condition ne pose pas de problème : si on souhaite que le traitement s’applique aux pixels avec une valeur < 0 la condition s’écrit

(nom_du_raster <0)

Pour chaque pixel du raster, cette condition va être évaluée, et la calculatrice donnera une valeur de 1 si la condition est remplie ou de 0 si elle ne l’est pas.

Si nous laissons le traitement tel quel, les pixels ayant une valeur inférieure à 0 prendront la valeur de 1. Mais ce que nous voulons c’est qu’ils aient la valeur 0. Nous devons donc compléter le traitement par une multiplication par 0 :

(nom_du_raster <0)*0

Là, les pixels remplissant la condition, vont être multipliés par 0 et donc auront tous la valeur de 0 en sortie. C’est ce que nous voulons.

Par contre les pixels ayant une valeur >0 auront une évaluation de 0 pour la condition et ils seront encore multipliés par 0. Si on laisse le calcul dans l’état, on aura un raster en sortie rempli de 0 !

On va compléter notre commande avec le traitement des pixels qui sont déjà entre nos deux bornes :

(nom_du_raster <0)*0  + (nom_du_raster >0 AND nom_du_raster <0.00004)

Cette condition sera évaluée à 1 si le pixel est entre les deux bornes et à 0 s’il est en dehors. S’il est entre les bornes (valeur 1) on veut qu’il garde sa valeur d’origine. On écrit cela :

(nom_du_raster <0)*0  + (nom_du_raster >0 AND nom_du_raster <0.00004) * nom_du_raster

On multiplie la valeur du pixel par 1. Rappelons que le premier traitement donne une valeur de 0 pour les pixels pris en compte par le deuxième traitement.

Il nous reste à traiter les pixels avec des valeurs > 0.00004, car dans l’état de notre commande ils ont une valeur de 0 sur le premier traitement et de 0 aussi dans le deuxième. Ce que nous voulons c’est qu’ils aient la valeur de 0.0004. On rajoute un troisième traitement

(nom_du_raster >0.00004) *0.00004

Si le pixel est > 0.00004 la condition sera évaluée à 1 et on le multiplie par 0.00004.

Notre commande finale sera alors :

(nom_du_raster <0)*0  + (nom_du_raster >0 AND nom_du_raster <0.00004) * nom_du_raster + (nom_du_raster >0.00004) *0.00004

Ce qui donne comme résultat le raster suivant :

Avec un histogramme :

En fonction du zonage de la texture, on peut encore ajuster les valeurs pour mieux discriminer nos zones d’intérêt.

L’outil convertir un raster

Une fois ce travail d’ajustement jugé satisfaisant, nous normalisons le raster sur la plage 0-255.

Pour cela nous utilisons l’outil « Convertir » disponible dans le menu QGis Raster->Conversion->Convertir

Le changement d’échelle des valeurs est fait par « Paramètres additionnels de la ligne de commande ».

Tapez –scale.

Pour avoir un raster monobande, sélectionnez Byte dans « Type de données en sortie »

Pour avoir automatiquement les bandes chargées dans le même ordre dans SCP plugin, vous pouvez numéroter cet ordre en finissant toujours le nom du raster par B et un chiffre indiquant le numéro de bande (ex : B01,B02,…).

Faites attention à définir le format de sortie en .tif.

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 *