Visualisierung von Clustern mit Google Earth Engine
Ich verwende kMeans-Clustering, um 3 Cluster eines NDVI-Bildes anzuzeigen. Die Clusterbildung ist immer korrekt, aber niedrigere Werte können grün sein, wenn ich möchte, dass sie rot sind. Gibt es überhaupt eine Garantie für eine gleichmäßige Färbung?
Ich habe versucht, Werte für die Klassen fest zu codieren und sie neu zuzuordnen. Immer noch zufällige Ausgaben.
Ich habe einer Bildersammlung von Sentinel-2- Bildern Indizes wie NDVI und NDRE als Bänder hinzugefügt .
NDVI und NDVI Clustered (erwartetes Ergebnis):
Mit Python, akzeptiert aber gerne 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
Antworten
Die Cluster bildeten sich korrekt, die Farben jedoch nicht. Die Lösung des Problems bestand also darin, herauszufinden, wie hoch der durchschnittliche Pixelwert unter jeder Clustergruppe war. Dadurch konnte ich die Cluster in aufsteigender Reihenfolge sortieren.
So habe ich eine Multi-Polygon-Feature-Sammlung für jede Clustergruppe erstellt. Verwenden Sie dann einen Bildreduzierer, um den Mittelwert jedes Clusters mit einem Multi-Polygon als Geometriegrenze zu ermitteln. Dann bestellte ich die Cluster und maskierte jeden Cluster aus dem Anfangsbild, um ihn einzufärben, und bildete ein neues Bild, indem ich diese Masken kombinierte.