Suite

Transformer les beignets raster en cercles


Supposons que j'ai une image raster composée de 0 et de plusieurs anneaux en forme de beignet de 1. Ce raster pourrait par exemple être le résultat de la classification d'une image satellite contenant des étangs et des lacs en deux classes : 1) rivage de l'étang, valeur de pixel 1 et 2) autre, valeur de pixel 0. Voir l'image pour une impression.

Mon défi est de remplir chaque trou de beignet, en créant des cercles complets avec une valeur de pixel 1. Pour cela, j'ai accès à ArcGIS avec toutes les fonctionnalités courantes, ainsi qu'à ENVI et Python avec des liaisons gdal. Voir la deuxième image pour une impression du résultat souhaité. Je suppose qu'un filtre majoritaire fonctionnera dans une certaine mesure, sauf lorsque les trous de beignet sont grands.

Toutes les suggestions sur la transformation des beignets en cercles sont les bienvenues. Des points bonus pour que cela fonctionne également avec des beignets non fermés.


Ce que vous recherchez, c'est un Morphologie mathématique application, Fermeture pour être précis.

Si vous utilisez GDAL pour lire votre image dans un tableau numpy, il existe un certain nombre de bibliothèques qui prennent en charge cette opération. scipy.ndimage est l'un d'entre eux et a une fonction pour le remplissage de trous binaires.

En python pour un ensemble de données binaires fictif, comme vous l'avez décrit, cela transformerait les beignets en cercles :

depuis osgeo import gdal depuis scipy.ndimage.morphology import binary_fill_holes donut_array = gdal.Open("input.tif").ReadAsArray() filled_array = binary_fill_holes(donut_array, structure=np.ones((3,3)))

Cette méthode fonctionne également avec des beignets ouverts, selon la structure que vous utilisez pour le remplissage. J'ai fait un exemple de cahier comme preuve de concept et un article de blog montrant un exemple plus réel.


Convertissez le raster en polygones. Ne simplifiez pas les bords.

Sélectionnez donut comme des polygones en utilisant

Comment trouver si un polygone a un trou à l'aide de la calculatrice de terrain dans ArcGIS

Exécuter l'expression du calculateur de champ sur le champ Forme

def external(shp):border=shp.boundary() part=boundary.getPart(0) pgon=arcpy.Polygon(arcpy.Array(part)) return pgon

Pour l'appeler, utilisez :

extérieur( !Forme! )

Résultat:

Convertir des polygones en raster


Si vous souhaitez remplir uniquement le beignet fermé et ne souhaitez pas tester plusieurs éléments structurants comme pour la morphologie mathématique, voici une alternative :

1) Utilisez « groupe de régions » pour attribuer une valeur unique à chaque ensemble de pixels connectés

2) Utilisez la calculatrice raster pour définir tout sauf la valeur de votre arrière-plan à un.


Pour un ArcGIS, vous pouvez utiliserBloquer les statistiquesen utilisant le type de statistiquesMajorité. Peut-être qu'un peu d'essais et d'erreurs avec les statistiques du quartier est nécessaire. Par exemple, vous pouvez essayercercleou alorsirrégulieroptions avec des rayons différents pour garder spécifiquement le remplissage dans les beignets.


Voir la vidéo: Keiju Öljyakatemia - Munkin paisto (Octobre 2021).