3 votos

¿Cuál es la mejor función para suavizar la capa de datos en el motor Google Earth?

Como se puede ver utilizando el código de abajo en Earth Engine, la resolución de las imágenes MODIS son cuadrados de 1 km que parecen bastante obtusos.

// Create a geometry representing an export region.
var features = ee.Geometry.Rectangle([-85.1417893413635, 45.31413490213395, -86.125065708551, 44.65070625463291]);
Map.addLayer(features);
print("features",features);

// This function clips images to the ROI feature collection
var clipToCol = function(image){
  return image.clip(features);
};

var dataset = ee.ImageCollection('MODIS/006/MYD11A2')
                  .filter(ee.Filter.date('2018-05-01', '2018-06-01'))
                  .map(clipToCol);
print("dataset",dataset);
var landSurfaceTemperature = dataset.select('LST_Day_1km');
print("lST",landSurfaceTemperature);
var landSurfaceTemperatureVis = {
  min: 14375.62,
  max: 15300.38,
  palette: [
    '040274', '040281', '0502a3', '0502b8', '0502ce', '0502e6',
    '0602ff', '235cb1', '307ef3', '269db1', '30c8e2', '32d3ef',
    '3be285', '3ff38f', '86e26f', '3ae237', 'b5e22e', 'd6e21f',
    'fff705', 'ffd611', 'ffb613', 'ff8b13', 'ff6e08', 'ff500d',
    'ff0000', 'de0101', 'c21301', 'a71001', '911003'
  ],
};
Map.setCenter(-85.60371794450282,44.93590436363271, 10);
Map.addLayer(
    landSurfaceTemperature.filterDate('2013-04-10', '2013-05-10'), landSurfaceTemperatureVis,
    'Land Surface Temperature 13');
Map.addLayer(
    landSurfaceTemperature.filterDate('2014-04-10', '2014-05-10'), landSurfaceTemperatureVis,
    'Land Surface Temperature 14');
Map.addLayer(
    landSurfaceTemperature.filterDate('2015-04-10', '2015-05-10'), landSurfaceTemperatureVis,
    'Land Surface Temperature 15');
Map.addLayer(
    landSurfaceTemperature.filterDate('2016-04-10', '2016-05-10'), landSurfaceTemperatureVis,
    'Land Surface Temperature 16');
Map.addLayer(
    landSurfaceTemperature.filterDate('2017-04-10', '2017-05-10'), landSurfaceTemperatureVis,
    'Land Surface Temperature 17');
Map.addLayer(
    landSurfaceTemperature.filterDate('2018-04-10', '2018-05-10'), landSurfaceTemperatureVis,
    'Land Surface Temperature 18');
Map.addLayer(
    landSurfaceTemperature.mean(), landSurfaceTemperatureVis,
    'Land Surface Temperature Mean May');

// Where I am having trouble is coding the export feature that would allow for an overlay to be placed into Google Earth. This is what I have now:
print(landSurfaceTemperature.mean());
// Visualize image
var imageRGB = landSurfaceTemperature.mean().visualize(landSurfaceTemperatureVis);

print(imageRGB);
Map.addLayer(
  imageRGB)

// Define a boxcar or low-pass kernel.
var boxcar = ee.Kernel.square({
  radius: 200, units: 'pixels', magnitude: true
});

// Smooth the image by convolving with the boxcar kernel.
var smooth = imageRGB.convolve(boxcar);
Map.addLayer(smooth, imageRGB, 'smoothed');

// Export the image, specifying scale and region.

Export.image.toDrive({
  image: imageRGB,
  description: 'Overlay',
  scale: 5,
  region: features,
  maxPixels: 400000000,
});

He estado explorando fórmulas de convolución para el suavizado lineal basado en una base por píxel dado un radio, sin embargo todos los ejemplos utilizan imágenes landsat que tienen múltiples bandas. En el caso de este código, ¿cómo lo estructuraría exactamente de forma que se consiguiera un nivel moderado de suavizado?

Esto es con lo que he trabajado:

// Define a boxcar or low-pass kernel.
var boxcar = ee.Kernel.square({
  radius: 200, units: 'pixels', magnitude: true
});

// Smooth the image by convolving with the boxcar kernel.
var smooth = imageRGB.convolve(boxcar);
Map.addLayer(smooth, imageRGB, 'smoothed');

Esto devuelve el siguiente error:

Argumento no válido especificado para ee.Number(): true

¿Qué estoy haciendo mal? ¿Es la convolución el método correcto para suavizar este conjunto de datos?

1voto

Peter Villar Puntos 11

El código que has escrito casi funciona. Faltaban tres cosas:

  1. el argumento "magnitud" debería ser un valor flotante en lugar de un booleano (verdadero/falso)

  2. un núcleo con un radio de 200 es demasiado grande. Ajústalo a 2-10 para que sea útil y funcione. Un píxel a 200 píxeles de distancia definitivamente no están relacionados entre sí.

  3. en Map.addLayer donde se añade la imagen suavizada al mapa, se establece una imagen como parámetro visible.

Abajo he añadido el trozo de código que debes reemplazar:

// Define a boxcar or low-pass kernel.
var boxcar = ee.Kernel.square({
  radius: 5, units: 'pixels', magnitude: 1
});

// Smooth the image by convolving with the boxcar kernel.
var smooth = imageRGB.convolve(boxcar);
Map.addLayer(smooth, {min: 0, max: 256}, 'smoothed');

Aquí encontrarás un enlace al código. He añadido también algunos textos explicativos cuando se imprimen las cosas a la consola y se volvió de las imágenes no relevantes para esta pregunta. Enlace al guión completo

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