Visualiser les clusters avec Google Earth Engine

Aug 28 2020

J'utilise le clustering kMeans pour visualiser 3 clusters d'une image NDVI. Le regroupement est toujours correct, mais les valeurs inférieures peuvent être vertes, lorsque je veux qu'elles soient rouges. Est-il possible de garantir une coloration homogène?

J'ai essayé de coder en dur les valeurs des classes et de les remapper. Obtention toujours de sorties aléatoires.

J'ai ajouté des indices tels que NDVI et NDRE en tant que bandes à une collection d' images d'images Sentinel-2 .

NDVI et NDVI en cluster (résultat attendu):

Utilisation de Python, mais acceptera volontiers JavaScript

Code:

# Initalise the interactive map, centered on some coordinates.
myMap = geemap.Map()
myMap.centerObject(TimeSeries_AOI, 12);
myMap.add_basemap('HYBRID')

imageList = sentinel2_AOI.toList(sentinel2_AOI.size())
listSize = imageList.size().getInfo()

'''
averageBand is a function that can get the average band in a given list.

@ band: [string] mandatory string that the function uses to display a specific band.

Returns ee.Image
'''
def averageBand(band):
    image = ee.Image(imageList.get(0)).select(band)
    
    for i in range(1, listSize):
        if (i > 10):
            break
        image = (ee.Image(imageList.get(i)).select(band)).add(image)
                
    return image.divide(i)

def displayCluster(band, numClusters = 3):
    image = averageBand(band)

    #myMap.addLayer(ee.Image().paint(TimeSeries_AOI, 0, 4), {}, 'region');
    myMap.addLayer(image, visualise[band], band)
    #myMap.addLayer(image, {}, "NDVI")

    #Make the training dataset.
    points = image.sample(**{
        'scale': 10,
        'numPixels': 40000,
        'geometries': True
    })

    #myMap.addLayer(points, {}, 'training', False)

    # Instantiate the clusterer and train it.
    clusterer = ee.Clusterer.wekaKMeans(numClusters).train(points)
    
    result = image.cluster(clusterer, "kMean")
    
    classValues = [0, 1, 2, 3, 4]
    classPalette = ['F7A738', 'CDDA49', '7DB249', '327C36', '1FBCD2']
    
    newResult = result.set('kMean_class_values', classValues)
    newResult = newResult.set('kMean_class_palette', classPalette)
    newResult.remap([0, 1, 2, 3, 4], [1, 2, 3, 4, 5], 1, 'kMean')
    
    #class_values = result.get('kMean_class_values').getInfo()
    #print(result.select('kMean'))
    
    #print(newResult.select("data_type").getInfo())
    
    #subset = newResult.select("kMean").eq(2).selfMask();
    
    #geemap.ee_export_image(newResult, filename="Cluster2.tif", scale=90, file_per_band=True)
    
    myMap.addLayer(newResult, {}, band + ": Clustered")

displayCluster("NDVI")
displayCluster("NDRE")
#displayCluster("SAVI")
#displayCluster("NDWI")
#displayCluster("CCCI")
#displayCluster("MCARI")
#displayCluster("SAVI2")
#displayCluster("MSAVIhyper")
#displayCluster("RedEdge1")
#displayCluster("RedEdge2")

myMap

Réponses

Blue101black Sep 01 2020 at 19:10

Les grappes se formaient correctement, mais les couleurs ne l'étaient pas. La solution au problème consistait donc à déterminer la valeur moyenne des pixels sous chaque groupe de cluster. Cela m'a permis de trier ensuite les grappes par ordre croissant.

Pour ce faire, j'ai créé une collection d'entités multi-polygones de chaque groupe de grappes. Puis utilisé un réducteur d'image pour trouver la moyenne de chaque cluster avec un multi-polygone comme limites de géométrie. Ensuite, j'ai commandé les grappes et masqué chaque grappe de l'image initiale pour la colorer et j'ai formé une nouvelle image en combinant ces masques.