Google Earth Engine으로 클러스터 시각화

Aug 28 2020

kMeans 클러스터링을 사용하여 NDVI 이미지의 3 개 클러스터를 시각화하고 있습니다. 클러스터링은 항상 정확하지만 빨간색을 원할 때 낮은 값은 녹색 일 수 있습니다. 어쨌든 일관된 색상을 보장 할 수 있습니까?

클래스 값을 하드 코딩하고 다시 매핑 해 보았습니다. 여전히 무작위로 출력됩니다.

Sentinel-2 이미지 의 이미지 컬렉션에 NDVI 및 NDRE 와 같은 인덱스 를 밴드 로 추가 했습니다 .

NDVI 및 NDVI 클러스터링 (예상 결과) :

Python을 사용하지만 JavaScript는 기꺼이 받아들입니다.

암호:

# 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

답변

Blue101black Sep 01 2020 at 19:10

클러스터는 올바르게 형성되었지만 색상은 그렇지 않았습니다. 따라서 문제에 대한 해결책은 각 클러스터 그룹 아래에있는 평균 픽셀 값을 파악하는 것이 었습니다. 이를 통해 클러스터를 오름차순으로 정렬 할 수있었습니다.

제가 진행 한 방법은 각 클러스터 그룹의 다중 다각형 기능 모음을 만드는 것이 었습니다. 그런 다음 이미지 감속기를 사용하여 기하학 경계로 다중 다각형이있는 각 클러스터의 평균을 찾았습니다. 그런 다음 클러스터를 주문하고 초기 이미지에서 각 클러스터를 마스킹하여 색상을 지정하고 이러한 마스크를 결합하여 새로운 이미지를 형성했습니다.