3 votos

Clasificando una imagen basada en los valores de EVI de vegetación

Soy muy nuevo en GEE y estoy tratando de clasificar una imagen basada en el rango de EVI de varias clases de vegetación. Por ejemplo, el Bambú puede tener un umbral mínimo de 0.6712 y máximo de 0.776 EVI. De esta forma tengo 10 clases. Obtuve la banda de EVI de mi imagen Landsat.

¿Cómo clasifico los píxeles y les asigno valores del 1 al 10 para las 10 clases?

Intenté usar el método ee.Algorithms.If:

    var bandaEVI = ee.Image(CFL598.select('EVI'));
    print("evi", bandaEVI);
    Map.addLayer(bandaEVI, {min:-0.10, max:0.8, bands:['EVI']}, 'Banda EVI');

    var diez = ee.Image(ee.Algorithms.If((bandaEVI.gte(0.6712).and(bandaEVI.lte(0.776))), bandaEVI.mask(ee.Number(10))));
    print("bambú", diez);
    Map.addLayer(diez);

Planeaba hacer esto para el resto de las 9 clases y usar addBands para crear una imagen completa, pero esto no funcionó.

6voto

korndog Puntos 108

EVIband.gte(0.6712).and(EVIband.lte(0.776) evalúa cada píxel y devuelve 1 si el valor del píxel cumple con las condiciones y 0 si no. Si desea asignar a los píxeles que cumplen esta condición algún número identificable, lo más fácil es multiplicar esta imagen por una constante ee.Image. Ejemplo:

var ten = EVIband.gte(0.6712).and(EVIband.lte(0.776).multiply(ee.Image(10))

Estoy de acuerdo, sumaría todas las imágenes binarias para obtener una banda de clases final. Si define una lista de umbrales de antemano, es posible aplicar una función a esta lista en lugar de adoptar un enfoque de fuerza bruta. Ejemplo de segmentación de una imagen de EVI (EVIband) en tres clases:

var T1 = ee.List([0,0.3,0.6]) // definir umbrales inferiores 
var T2 = ee.List([0.3,0.6,0.9]) // definir umbrales superiores 
var key = ee.List([1,2,3]) // "clave" única para asignar a cada clase 

var classband = ee.ImageCollection.fromImages(

  // mapear sobre la lista de índices 
  ee.List.sequence(0,T1.length().subtract(1)).map(function(index){

    // devuelve imagen binaria 
    return EVIband.gte(ee.Number(T1.get(index)))
      .and(EVIband.lt(ee.Number(T2.get(index))))
      .multiply(ee.Image.constant(key.get(index)))
      .toUint16()
    })
  )

   // sumar todas las imágenes 
  .sum() 

EDICIÓN para mayor claridad, ejemplo de enfoque de fuerza bruta:

var one = EVIband.gte(0).and(EVIband.lt(0.3)).toUint16()
var two = EVIband.gte(0.3).and(EVIband.lt(0.6)).multiply(ee.Image(2)).toUint16()
var three = EVIband.gte(0.6).and(EVIband.lt(0.9)).multiply(ee.Image(3)).toUint16()
var classband = ee.ImageCollection.fromImages([one,two,three]).sum()

que realmente necesita menos código que el ejemplo anterior, pero tal vez no sea tan elegante en el caso de tener 10 clases.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X