Filtrage basé sur les objets des classifications de pixels#

Mots clés méthodes de données ; segmentation d’image, méthodes de données ; GEOBIA

Aperçu#

L’analyse d’images basée sur des objets géographiques (GEOBIA) vise à regrouper les pixels en objets-images significatifs. Le flux de travail GEOBIA présente deux avantages : d’une part, nous pouvons réduire l’effet « sel et poivre » typique de la classification des pixels ; et d’autre part, nous pouvons augmenter l’efficacité de calcul de notre flux de travail en regroupant les pixels en objets moins nombreux, plus grands, mais plus significatifs. Une revue des tendances émergentes de GEOBIA peut être trouvée dans Chen et al. (2017).

Description#

Dans ce bloc-notes, nous prenons les classifications basées sur les pixels générées dans le bloc-notes « 4_Classify_satellite_data.ipynb » et filtrons les classifications par objets-images. Pour ce faire, nous devons d’abord effectuer une segmentation d’image à l’aide de la fonction « skimage.segmentation.quickshift ». La segmentation d’image est effectuée sur la sortie de la couche « NDVI » dans le bloc-notes précédent. Pour filtrer les observations de pixels, nous attribuons à chaque segment la classification de pixel majoritaire (mode) à l’aide du module « scipy.ndimage.measurements import _stats ».

  1. Exécuter la segmentation de l’image

  2. Visualiser les segments

  3. Calculer la statistique mode pour chaque segment

  4. Écrire la nouvelle classification basée sur les objets sur le disque en tant que COG

  5. Tracer le résultat


Commencer#

Pour exécuter cette analyse, exécutez toutes les cellules du bloc-notes, en commençant par la cellule « Charger les packages ».

Charger des paquets#

[1]:
import os
import scipy
import xarray as xr
import rioxarray
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import Markdown
from odc.geo.xr import write_cog
from scipy.ndimage._measurements import _stats
from skimage.segmentation import quickshift

Paramètres d’analyse#

  • pred_tif : le chemin et le nom de la sortie GeoTIFF de prédiction dans le notebook précédent.

  • tif_to_seg : Le géotiff à utiliser comme entrée pour la segmentation de l’image, dans l’exemple par défaut, il s’agissait d’une sortie de couche NDVI dans le dernier notebook.

  • « résultats » : un emplacement de dossier pour stocker les GeoTIFF classés.

[2]:
pred_tif = 'results/prediction.tif'

tif_to_seg = 'results/NDVI.tif'

results = 'results/'

Générer une classification basée sur les objets#

Exécuter la segmentation d’image#

[3]:
# Convert our mean NDVI xarray into a numpy array
ndvi = rioxarray.open_rasterio(tif_to_seg).squeeze().values

# Calculate the segments
segments = quickshift(ndvi,
                      kernel_size=2,
                      convert2lab=False,
                      max_dist=4,
                      ratio=1.0)

Visualiser les segments#

Pour nous aider à visualiser les segments, nous pouvons calculer la moyenne zonale NDVI pour chaque segment, puis nous tracerons une section agrandie de la région

[4]:
segments_zonal_mean_qs = scipy.ndimage.mean(input=ndvi,
                                            labels=segments,
                                            index=segments)
[5]:
fig,ax=plt.subplots(1,2, figsize=(16,8), sharey=True)
ax[0].imshow(ndvi[1000:2500,1000:2500], cmap='gist_earth_r', vmin=0.1, vmax=0.7)
ax[1].imshow(segments_zonal_mean_qs[1000:2500,1000:2500], cmap='gist_earth_r', vmin=0.1, vmax=0.7)
ax[0].set_title('Per pixel NDVI, zoomed in');
ax[1].set_title('Mean NDVI within segments, zoomed in')
plt.tight_layout();
../../../../_images/sandbox_notebooks_Real_world_examples_Scalable_machine_learning_5_Object-based_filtering_14_0.png

Prédictions ouvertes basées sur les pixels#

[6]:
pred = rioxarray.open_rasterio(pred_tif).squeeze().drop_vars('band')

Mode de calcul#

Au sein de chaque segment, la classification majoritaire est calculée et attribuée à ce segment.

[7]:
count, _sum =_stats(pred, labels=segments, index=segments)
mode = _sum > (count/2)
mode = xr.DataArray(mode,  coords=pred.coords, dims=pred.dims, attrs=pred.attrs).astype(np.int16)

Écrire le résultat sur le disque#

[8]:
write_cog(mode, results+ 'prediction_object.tif', nodata=-9999, overwrite=True)
[8]:
PosixPath('results/prediction_object.tif')

Résultat de l’intrigue#

Ci-dessous, nous traçons la classification basée sur les pixels parallèlement à la classification basée sur les objets nouvellement créée. Vous pouvez voir que l’effet « sel et poivre » des pixels individuels classés comme recadrage a été supprimé dans la classification basée sur les objets, ce qui donne une classification « plus propre ».

[9]:
fig, axes = plt.subplots(1, 2, sharey=True, figsize=(16, 8))
pred.plot(ax=axes[0], add_colorbar=False)
mode.plot(ax=axes[1], add_colorbar=False)
axes[0].set_title('Pixel-based Classification')
axes[1].set_title('Object-based Classification (mode)')
plt.tight_layout();
../../../../_images/sandbox_notebooks_Real_world_examples_Scalable_machine_learning_5_Object-based_filtering_22_0.png

Étapes suivantes recommandées#

Il s’agit du dernier bloc-notes du flux de travail « Scalable Machine Learning on the ODC » ! Pour consulter à nouveau l’un des autres blocs-notes, utilisez les liens ci-dessous.

  1. Extraction_des_données_de_formation

  2. Inspecter_les_données_de_formation

  3. Évaluer_optimiser_l’ajustement_classificateur

  4. Classifier_les_données_satellites

  5. Filtrage basé sur les objets (ce notebook)


Informations Complémentaires#

Licence Le code de ce notebook est sous licence Apache, version 2.0 <https://www.apache.org/licenses/LICENSE-2.0>`__.

Les données de Digital Earth Africa sont sous licence Creative Commons Attribution 4.0 <https://creativecommons.org/licenses/by/4.0/>.

Contact Si vous avez besoin d’aide, veuillez poster une question sur le canal Slack DE Africa <https://digitalearthafrica.slack.com/> ou sur le GIS Stack Exchange <https://gis.stackexchange.com/questions/ask?tags=open-data-cube> en utilisant la balise open-data-cube (vous pouvez consulter les questions posées précédemment `ici <https://gis.stackexchange.com/questions/tagged/open-data-

Si vous souhaitez signaler un problème avec ce notebook, vous pouvez en déposer un sur Github.

Version de Datacube compatible

Dernier test :

[10]:
from datetime import datetime
datetime.today().strftime('%Y-%m-%d')
[10]:
'2025-01-16'