1 votos

¿Extracción de parches de imagen cualificados en el motor de Google Earth?

Quiero extraer parches de imagen cualificados (por ejemplo, sin nubes) (por ejemplo, de tamaño 128x128) en una imagen grande (por ejemplo, 10000x10000) en Google Earth Engine. Estos parches de imagen pueden solaparse con otros parches calificados. A continuación, voy a alimentar estos parches de imagen a TensorFlow. Buscando en las APIs de Earth Engine, hasta ahora sólo he encontrado ee.Image.clip , ee.Image.clipToBoundsAndScale , ee.ImageCollection.getRegion que puede estar relacionado con mi objetivo. Pero todos ellos requieren alguna geometría o característica o colecciones de características en coordenadas de latitud/longitud como parámetro de límite.

¿Existe una forma de extraer los parches de imagen en Earth Engine como si se tratara de un subarray de una matriz numpy utilizando índices (por ejemplo, image[0:128, 0:128])?


El flujo general de Nicholas Clinton funciona. Hice algunos cambios menores en la máscara y los pasos de la muestra.

Para el paso de la máscara, he utilizado el ee.Image.fastDistanceTransform para calcular la distancia de Chebyshev a los píxeles con valor distinto de cero (intercambio de 0 y 1 en una máscara normal, es decir SwappedMask ) y crear la máscara con buffer estableciendo un umbral:

var Chebyshev_dist_to_Mask = SwappedMask
  .fastDistanceTransform({
    neighborhood: 46,
    units: 'pixels',
    metric: 'chebyshev'
  });
var BufferedMask = Chebyshev_dist_to_Mask
  .gt(ee.Image(33))
  .select(0)
  .toByte()
  .rename('buffered_mask');

enter image description here

Para el paso de la muestra, he utilizado ee.Image.stratifiedSample en lugar de ee.Image.sample para tomar muestras sólo en la clase de píxeles buenos.

1voto

Jeyanth Kumar Puntos 142

El flujo general es: enmascarar la imagen, convertirla en array, y luego muestrear los arrays en puntos. Aquí está un boceto de la solución en Python (donde classes es una imagen en la que cada píxel almacena una etiqueta entera 0, 1, 2.., composite es una imagen multibanda de bandas predictoras y KERNEL es la forma que quieras:

# Get only patches completely covered by the kernel.
connectedMask = classes.mask().reduceNeighborhood(
  reducer=ee.Reducer.min(), 
  kernel=KERNEL,
)

# Convert to an array per pixel
arrays = composite.addBands(classes).neighborhoodToArray(KERNEL)

# Sample the arrays
sample = arrays.updateMask(connectedMask).sample(
  numPixels=1000, 
  region=SOME_GEOMETRY, 
  scale=30)

# Export the result to a table.
task = ee.batch.Export.table.toCloudStorage(
  collection=sample, 
  description='Sample Export',
  fileNamePrefix='foo', 
  bucket=outputBucket,
  fileFormat='TFRecord', 
  selectors=listOfBands)
task.start()

0 votos

Gracias, Nicholas. Suponiendo que ya tenemos la "muestra", ¿podrías explicarnos cómo exportar la imagen del array al formato TFRecord? ¿Debo intentar exportar estos arrays píxel a píxel (es decir, en Export.image.toDrive , set dimensions: 1 , fileDimensions: [1,1] , skipEmptyTiles: true , fileFormat: 'TFRecord' , patchDimensions: [1,1] , sequenceData: true , maskedThreshold: 0.0 )? Estos ajustes provocan un largo tiempo de ejecución (>3 horas) antes de que se generen los archivos tfrecord. Además, ¿podría enseñarme también cómo configurar tensorDepths ? Gracias.

1 votos

He actualizado la respuesta, pero no sé si es lo que esperabas.

0 votos

Lo intentaré. Gracias.

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