Standardmäßig werden bei Reduzierern, die auf Bilder angewendet werden, die Eingaben entsprechend dem Maskenwert gewichtet.
Dies ist relevant im Zusammenhang mit Bruchteilen von Pixeln, die durch Vorgänge wie clip()
erstellt werden. Sie können dieses Verhalten anpassen, indem Sie unweighted()
auf den Reduzierer anwenden. Wenn Sie einen nicht gewichteten Reducer verwenden, haben alle Pixel in der Region dasselbe Gewicht. Das folgende Beispiel zeigt, wie sich die Pixelgewichtung auf die Ausgabe des Reducers auswirken kann:
// Load a Landsat 8 input image. var image = ee.Image('LANDSAT/LC08/C02/T1/LC08_044034_20140318'); // Create an arbitrary region. var geometry = ee.Geometry.Rectangle(-122.496, 37.532, -121.554, 37.538); // Make an NDWI image. It will have one band named 'nd'. var ndwi = image.normalizedDifference(['B3', 'B5']); // Compute the weighted mean of the NDWI image clipped to the region. var weighted = ndwi.clip(geometry) .reduceRegion({ reducer: ee.Reducer.mean(), geometry: geometry, scale: 30}) .get('nd'); // Compute the UN-weighted mean of the NDWI image clipped to the region. var unweighted = ndwi.clip(geometry) .reduceRegion({ reducer: ee.Reducer.mean().unweighted(), geometry: geometry, scale: 30}) .get('nd'); // Observe the difference between weighted and unweighted reductions. print('weighted:', weighted); print('unweighted', unweighted);
import ee import geemap.core as geemap
# Load a Landsat 8 input image. image = ee.Image('LANDSAT/LC08/C02/T1/LC08_044034_20140318') # Create an arbitrary region. geometry = ee.Geometry.Rectangle(-122.496, 37.532, -121.554, 37.538) # Make an NDWI image. It will have one band named 'nd'. ndwi = image.normalizedDifference(['B3', 'B5']) # Compute the weighted mean of the NDWI image clipped to the region. weighted = ( ndwi.clip(geometry) .reduceRegion(reducer=ee.Reducer.mean(), geometry=geometry, scale=30) .get('nd') ) # Compute the UN-weighted mean of the NDWI image clipped to the region. unweighted = ( ndwi.clip(geometry) .reduceRegion( reducer=ee.Reducer.mean().unweighted(), geometry=geometry, scale=30 ) .get('nd') ) # Observe the difference between weighted and unweighted reductions. display('weighted:', weighted) display('unweighted', unweighted)
Der Unterschied in den Ergebnissen ist darauf zurückzuführen, dass Pixel am Rand der Region aufgrund des Aufrufs von unweighted()
auf dem Reducer ein Gewicht von 1 erhalten.
Um eine explizit gewichtete Ausgabe zu erhalten, sollten Sie die Gewichte explizit mit splitWeights()
festlegen, das auf den Reducer aufgerufen wird. Ein von splitWeights()
modifizierter Reduzierer nimmt zwei Eingaben an, wobei die zweite Eingabe das Gewicht ist. Im folgenden Beispiel wird splitWeights()
durch Berechnung des gewichteten Mittelwerts des normierten differenzierten Vegetationsindexes (NDVI) in einer Region veranschaulicht. Die Gewichte werden durch den Wolkenbedeckungsgrad bestimmt (je mehr Wolken, desto niedriger das Gewicht):
// Load an input Landsat 8 image. var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_186059_20130419'); // Compute cloud score and reverse it such that the highest // weight (100) is for the least cloudy pixels. var cloudWeight = ee.Image(100).subtract( ee.Algorithms.Landsat.simpleCloudScore(image).select(['cloud'])); // Compute NDVI and add the cloud weight band. var ndvi = image.normalizedDifference(['B5', 'B4']).addBands(cloudWeight); // Define an arbitrary region in a cloudy area. var region = ee.Geometry.Rectangle(9.9069, 0.5981, 10.5, 0.9757); // Use a mean reducer. var reducer = ee.Reducer.mean(); // Compute the unweighted mean. var unweighted = ndvi.select(['nd']).reduceRegion(reducer, region, 30); // compute mean weighted by cloudiness. var weighted = ndvi.reduceRegion(reducer.splitWeights(), region, 30); // Observe the difference as a result of weighting by cloudiness. print('unweighted:', unweighted); print('weighted:', weighted);
import ee import geemap.core as geemap
# Load an input Landsat 8 image. image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_186059_20130419') # Compute cloud score and reverse it such that the highest # weight (100) is for the least cloudy pixels. cloud_weight = ee.Image(100).subtract( ee.Algorithms.Landsat.simpleCloudScore(image).select(['cloud']) ) # Compute NDVI and add the cloud weight band. ndvi = image.normalizedDifference(['B5', 'B4']).addBands(cloud_weight) # Define an arbitrary region in a cloudy area. region = ee.Geometry.Rectangle(9.9069, 0.5981, 10.5, 0.9757) # Use a mean reducer. reducer = ee.Reducer.mean() # Compute the unweighted mean. unweighted = ndvi.select(['nd']).reduceRegion(reducer, region, 30) # compute mean weighted by cloudiness. weighted = ndvi.reduceRegion(reducer.splitWeights(), region, 30) # Observe the difference as a result of weighting by cloudiness. display('unweighted:', unweighted) display('weighted:', weighted)
Beachten Sie, dass cloudWeight
vor dem Aufrufen von reduceRegion()
als Band hinzugefügt werden muss. Das Ergebnis zeigt, dass der geschätzte mittlere NDVI höher ist, da die Gewichtung von bewölkten Pixeln verringert wurde.