Clustering raster à l'aide de QGIS

10

Je cherche un moyen de convertir un raster classé en polygones basés sur des clusters spatiaux dans chaque classe. Pour que les grappes soient considérées comme valides, j'ai besoin qu'elles soient constituées d'un pourcentage minimum de cellules de l'une des classes.

Par exemple: Une zone composée de 70% (ou plus) de cellules de classe "1" sera considérée comme un cluster de classe "1" même si la zone est mélangée avec 30% de cellules appartenant à d'autres classes. L'analyse de regroupement doit donc être basée sur la distance entre les cellules de la même classe.

Une autre option pourrait être de baser le clustering sur un nombre minimum de cellules dans une certaine classe, ainsi qu'une définition d'une zone de recherche maximale.

Par exemple: dans une zone spécifiée, il doit y avoir 100 cellules de "classe 1" pour qu'elle soit considérée comme un cluster.  

La plupart des outils liés au clustering semblent fonctionner uniquement pour les vecteurs. J'ai regardé l'analyse de cluster de l'outil SAGA mais elle ne correspondait pas vraiment à mon objectif. Avez-vous des idées pour résoudre ce problème ou quels autres outils peuvent être utiles?

Spiran
la source
Vous pouvez convertir le raster en vecteur et utiliser les outils de regroupement de vecteurs.
csk
C’est une option, mais je pense que c’est beaucoup plus facile de faire l’analyse au format raster si possible. La conversion en vecteur générerait probablement des polygones où beaucoup de détails se perdraient dans l'union des cellules raster, ou bien trop de points trop gérer (Big data set).
Spiran
3
Je sais que ce n'est pas une solution QGIS mais pourriez-vous utiliser python ou R pour créer une fonction de voisinage afin de créer un nouveau raster où il regarde chaque cellule et si> 70% des cellules du voisinage appartiennent à une classe alors cette cellule est reclassée dans cette classe?
Liam G
Cela pourrait fonctionner à coup sûr, merci! Je suis nouveau sur Python mais ça vaut le coup d'essayer.
Spiran

Réponses:

5

Si vous préférez résoudre ce problème dans "la logique raster", vous pouvez envisager quelques filtres. Le meilleur choix dépendra de la distribution spatiale de vos pixels de chaque classe à l'intérieur de vos valeurs "d'arrière-plan", mais voici deux solutions potentielles:

si vos correctifs que vous souhaitez supprimer sont relativement volumineux, vous devez utiliser "sieve" (raster> analysis> sieve dans QGIS 3.2, qui est basé sur gdal_sieve.py).

Le script gdal_sieve.py supprime les polygones raster inférieurs à la taille de seuil fournie (en pixels) et les remplace par la valeur en pixels du plus grand polygone voisin. Le résultat peut être réécrit dans la bande raster existante ou copié dans un nouveau fichier.

Si vous avez quelque chose comme un effet "sel et poivre" (beaucoup de pixels isolés de classes différentes, mais seulement quelques pixels par petits chemins, alors vous devez utiliser un filtre majoritaire (par exemple en allant vers les outils supplémentaires de GRASS> raster> r. voisins> sélectionnez l'option "mode". Notez que ce filtre affectera (légèrement) vos limites.

r.neighbors - Fait de chaque valeur de catégorie de cellule une fonction des valeurs de catégorie affectées aux cellules qui l'entourent et stocke les nouvelles valeurs de cellule dans une couche de carte raster en sortie

Vous trouverez les mêmes filers (filtre majoritaire, classes de tamisage) et autres (morphologie) dans les outils SAGA (SAGA> filtre raster) si vous préférez

radouxju
la source
C'est en fait à peu près comment je l'ai résolu. Fondamentalement, en utilisant l'outil d'analyse de voisinage de l'herbe avec quelques calculs sur le côté. J'ai oublié de poster la solution cependant, merci beaucoup pour votre contribution radouxju.
Spiran