הנחות משוקללות

כברירת מחדל, פעולות לצמצום נתונים שמופעלות על תמונות משוקללות לפי ערך המסכה. זה רלוונטי בהקשר של פיקסלים חלקיים שנוצרו באמצעות פעולות כמו clip(). כדי לשנות את ההתנהגות הזו, קוראים ל-unweighted() ב-reducer. שימוש בפונקציית צמצום ללא משקל מאלץ את כל הפיקסלים באזור לקבל את אותו משקל. בדוגמה הבאה אפשר לראות איך משקולות של פיקסלים יכולות להשפיע על הפלט של פונקציית ה-reducer:

במקרה של הפחתות משוקללות, המשקלים של נקודות החיתוך של הפיקסלים מיוצגים באופן פנימי כמספרים שלמים של 8 ביט (0 עד 255). הערך הזה מבצע קוונטיזציה של כיסוי פיקסלים חלקי ל-256 רמות נפרדות. לכן, כל שבר כיסוי שקטן בערך מ-1/256 (‎~0.4%) מעוגל כלפי מטה למשקל של 0 (לא תקין). פרטים נוספים על האופן שבו פיקסלים באזור מקבלים משקל זמינים במדריך בנושא הקטנת האזור.

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);

הגדרה של Python

בדף סביבת Python מפורט מידע על Python API ועל השימוש ב-geemap לפיתוח אינטראקטיבי.

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. פונקציית 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);

הגדרה של Python

בדף סביבת Python מפורט מידע על Python API ועל השימוש ב-geemap לפיתוח אינטראקטיבי.

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 גבוה יותר כתוצאה מהפחתת המשקל של פיקסלים מעוננים.