Visualizando Clusters com o Google Earth Engine

Aug 28 2020

Estou usando o agrupamento kMeans para visuais 3 clusters de uma imagem NDVI. O agrupamento está sempre correto, mas valores menores podem ser verdes, quando eu quero que sejam vermelhos. Existe alguma maneira de garantir uma coloração consistente?

Eu tentei codificar valores para as classes e remapear eles. Ainda obtendo resultados aleatórios.

Eu adicionei índices como NDVI e NDRE como bandas para uma coleção de imagens do Sentinel-2 .

NDVI e NDVI agrupados (resultado esperado):

Usando Python, mas aceitará facilmente 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

Respostas

Blue101black Sep 01 2020 at 19:10

Os aglomerados estavam se formando corretamente, mas as cores não. Portanto, a solução para o problema era descobrir qual era o valor médio do pixel em cada grupo de cluster. Isso me permitiu classificar os clusters em ordem crescente.

A maneira como fiz isso foi criando uma coleção de recursos multipolígonos de cada grupo de cluster. Em seguida, usei um redutor de imagem para encontrar a média de cada cluster com um multipolígono como limites geométricos. Então, ordenei os clusters e mascarei cada cluster da imagem inicial para colori-lo e formei uma nova imagem combinando essas máscaras.