Textura

Earth Engine tiene varios métodos especiales para estimar la textura espacial. Cuando la imagen tiene valores discretos (no de punto flotante), puedes usar image.entropy() para calcular la entropía en un vecindario:

// Load a high-resolution NAIP image.
var image = ee.Image('USDA/NAIP/DOQQ/m_3712213_sw_10_1_20140613');

// Zoom to San Francisco, display.
Map.setCenter(-122.466123, 37.769833, 17);
Map.addLayer(image, {max: 255}, 'image');

// Get the NIR band.
var nir = image.select('N');

// Define a neighborhood with a kernel.
var square = ee.Kernel.square({radius: 4});

// Compute entropy and display.
var entropy = nir.entropy(square);
Map.addLayer(entropy,
             {min: 1, max: 5, palette: ['0000CC', 'CC0000']},
             'entropy');

Ten en cuenta que la banda NIR se ajusta a 8 bits antes de llamar a entropy(), ya que el cálculo de entropía toma entradas de valores discretos. Los elementos distintos de cero en el kernel especifican el vecindario.

Otra forma de medir la textura es con una matriz de coocurrencia de nivel de gris (GLCM). Con la imagen y el kernel del ejemplo anterior, calcula el contraste basado en el GLCM de la siguiente manera:

// Compute the gray-level co-occurrence matrix (GLCM), get contrast.
var glcm = nir.glcmTexture({size: 4});
var contrast = glcm.select('N_contrast');
Map.addLayer(contrast,
             {min: 0, max: 1500, palette: ['0000CC', 'CC0000']},
             'contrast');

image.glcm() genera muchas medidas de textura. Para obtener una referencia completa sobre los resultados, consulta Haralick et al. (1973) y Conners et al. (1984).

Las medidas locales de asociación espacial, como C de Geary (Anselin 1995), se pueden calcular en Earth Engine con image.neighborhoodToBands(). Con la imagen del ejemplo anterior:

// Create a list of weights for a 9x9 kernel.
var row = [1, 1, 1, 1, 1, 1, 1, 1, 1];
// The center of the kernel is zero.
var centerRow = [1, 1, 1, 1, 0, 1, 1, 1, 1];
// Assemble a list of lists: the 9x9 kernel weights as a 2-D matrix.
var rows = [row, row, row, row, centerRow, row, row, row, row];
// Create the kernel from the weights.
// Non-zero weights represent the spatial neighborhood.
var kernel = ee.Kernel.fixed(9, 9, rows, -4, -4, false);

// Convert the neighborhood into multiple bands.
var neighs = nir.neighborhoodToBands(kernel);

// Compute local Geary's C, a measure of spatial association.
var gearys = nir.subtract(neighs).pow(2).reduce(ee.Reducer.sum())
             .divide(Math.pow(9, 2));
Map.addLayer(gearys,
             {min: 20, max: 2500, palette: ['0000CC', 'CC0000']},
             "Geary's C");

Para ver un ejemplo del uso de la desviación estándar del vecindario para calcular la textura de la imagen, consulta la página Estadísticas de vecindarios de imágenes.