Visualizzazione di cluster con Google Earth Engine

Aug 28 2020

Sto usando il clustering kMeans per visualizzare 3 cluster di un'immagine NDVI. Il raggruppamento è sempre corretto, ma i valori più bassi potrebbero essere verdi, quando voglio che siano rossi. Esiste comunque per garantire una colorazione coerente?

Ho provato i valori di hard-coding per le classi e rimappandole. Ricevo ancora output casuali.

Ho aggiunto indici come NDVI e NDRE come bande a una raccolta di immagini di immagini Sentinel-2 .

NDVI e NDVI raggruppati (risultato previsto):

Usando Python, ma accetterà felicemente JavaScript

Codice:

# 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

Risposte

Blue101black Sep 01 2020 at 19:10

I grappoli si stavano formando correttamente, ma i colori no. Quindi la soluzione al problema era capire quale fosse il valore medio dei pixel in ogni gruppo di cluster. Questo mi ha permesso di ordinare i cluster in ordine crescente.

Il modo in cui ho proceduto è stato quello di creare una raccolta di feature multi-poligono di ciascun gruppo di cluster. Quindi ha utilizzato un riduttore di immagine per trovare la media di ogni cluster con un multi-poligono come limiti geometrici. Quindi ho ordinato i cluster e mascherato ogni cluster dall'immagine iniziale per colorarlo e ho formato una nuova immagine combinando quelle maschere.