Visualización de clústeres con Google Earth Engine
Estoy usando la agrupación de kMeans para visualizar 3 grupos de una imagen NDVI. El agrupamiento es siempre correcto, pero los valores más bajos pueden ser verdes, cuando quiero que sean rojos. ¿Existe alguna forma de garantizar una coloración uniforme?
He intentado codificar valores para las clases y reasignarlos. Todavía obteniendo salidas aleatorias.
He agregado índices como NDVI y NDRE como bandas a una colección de imágenes de imágenes Sentinel-2 .
NDVI y NDVI agrupados (resultado esperado):
Usando Python, pero felizmente aceptará JavaScript
Código:
# 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
Respuestas
Los racimos se estaban formando correctamente, pero los colores no. Entonces, la solución al problema fue averiguar cuál era el valor de píxel promedio en cada grupo de clústeres. Esto me permitió luego ordenar los grupos en orden ascendente.
La forma en que hice esto fue haciendo una colección de características de múltiples polígonos de cada grupo de clústeres. Luego usó un reductor de imágenes para encontrar la media de cada grupo con un polígono múltiple como límites geométricos. Luego ordené los grupos y enmascaré cada grupo de la imagen inicial para colorearlo y formé una nueva imagen combinando esas máscaras.