כברירת מחדל, הפונקציות של reducers שחלות על תמונות נותנות משקל לקלטים בהתאם לערך המסכה.
הדבר רלוונטי בהקשר של פיקסלים חלקיים שנוצרו באמצעות פעולות כמו clip()
. כדי לשנות את ההתנהגות הזו, צריך להפעיל את unweighted()
ב-reducer. שימוש במצמצם ללא משקל מאלץ את כל הפיקסלים באזור להיות בעלי אותו משקל. הדוגמה הבאה ממחישה איך שיוך משקל לתמונה יכול להשפיע על הפלט של המצמצם:
Code Editor (JavaScript)
// 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
Colab (Python)
# 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)
ההבדל בתוצאות נובע מפיקסלים בקצה האזור שמקבלים משקל של אחד כתוצאה מהקריאה ל-unweighted()
במצמצם.
כדי לקבל פלט עם משקלים מפורשים, עדיף להגדיר את המשקלים במפורש באמצעות קריאה ל-splitWeights()
במצמצם. Reducer שמשתנה לפי splitWeights()
מקבל שני מקורות קלט, כאשר הקלט השני הוא המשקל. בדוגמה הבאה מוסבר splitWeights()
באמצעות חישוב הממוצע המשוקלל של אינדקס ההפרש המנורמלי של צמחייה (NDVI) באזור, כאשר המשקלים ניתנים לפי ציון עננים (ככל שהעננות גבוהה יותר, כך המשקל נמוך יותר):
Code Editor (JavaScript)
// 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
Colab (Python)
# 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)
חשוב לזכור שצריך להוסיף את cloudWeight
כחבר בלהקה לפני שמפעילים את reduceRegion()
. התוצאה מראה שהערך הממוצע המשוער של NDVI גבוה יותר כתוצאה מהקטנת המשקל של פיקסלים מעוננים.