公告:凡是在
2025 年 4 月 15 日前註冊使用 Earth Engine 的非商業專案,都必須
驗證非商業用途資格,才能繼續存取 Earth Engine。
加權折扣
透過集合功能整理內容
你可以依據偏好儲存及分類內容。
根據預設,套用至圖像的縮減器會根據遮罩值為輸入內容加權。這與透過 clip()
等運算所建立的部分像素相關。在 reducer 上呼叫 unweighted()
,即可調整這項行為。使用無權重的縮減器會強制將區域中的所有像素設為相同權重。以下範例說明像素權重如何影響縮減器輸出內容:
程式碼編輯器 (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()
後,會收到 1 的權重。
為了取得明確加權的輸出內容,建議您在 Reducer 上呼叫 splitWeights()
,明確設定權重。經 splitWeights()
修改的 reducer 會接收兩個輸入值,其中第二個輸入值是權重。以下範例說明 splitWeights()
,透過計算區域內的常態化差異植被指數 (NDVI) 加權平均值,並以雲量分數提供權重 (雲量越多,權重越低):
程式碼編輯器 (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 平均值會提高。
除非另有註明,否則本頁面中的內容是採用創用 CC 姓名標示 4.0 授權,程式碼範例則為阿帕契 2.0 授權。詳情請參閱《Google Developers 網站政策》。Java 是 Oracle 和/或其關聯企業的註冊商標。
上次更新時間:2025-07-25 (世界標準時間)。
[null,null,["上次更新時間:2025-07-25 (世界標準時間)。"],[[["\u003cp\u003eBy default, reducers in Earth Engine weight pixels based on their mask values, which can affect results when using operations like \u003ccode\u003eclip()\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003eThe \u003ccode\u003eunweighted()\u003c/code\u003e function forces all pixels in a region to have equal weight when applying a reducer.\u003c/p\u003e\n"],["\u003cp\u003eTo explicitly control pixel weights, use \u003ccode\u003esplitWeights()\u003c/code\u003e on the reducer and provide a separate weight band in the input image.\u003c/p\u003e\n"],["\u003cp\u003eUsing weighted reducers allows for more accurate analysis by adjusting the influence of specific pixels based on factors like cloud cover.\u003c/p\u003e\n"]]],["Reducers, by default, weight image inputs based on mask values, relevant for fractional pixels. The `unweighted()` method forces equal pixel weighting within a region. `splitWeights()` allows for explicit weighting, demonstrated by weighting a mean Normalized Difference Vegetation Index (NDVI) by cloud score, reducing cloudy pixel influence. The difference between using weighted, unweighted or splitweight methods is illustrated with examples of Landsat 8 imagery using `reduceRegion()`. Weights should be added as bands before using `reduceRegion()`.\n"],null,["# Weighted Reductions\n\nBy default, reducers applied to imagery weight the inputs according to the mask value.\nThis is relevant in the context of fractional pixels created through operations such as\n`clip()`. Adjust this behavior by calling `unweighted()` on the\nreducer. Using an unweighted reducer forces all pixels in the region to have the same\nweight. The following example illustrates how pixel weighting can affect the reducer\noutput:\n\n### Code Editor (JavaScript)\n\n```javascript\n// Load a Landsat 8 input image.\nvar image = ee.Image('LANDSAT/LC08/C02/T1/LC08_044034_20140318');\n\n// Create an arbitrary region.\nvar geometry = ee.Geometry.Rectangle(-122.496, 37.532, -121.554, 37.538);\n\n// Make an NDWI image. It will have one band named 'nd'.\nvar ndwi = image.normalizedDifference(['B3', 'B5']);\n\n// Compute the weighted mean of the NDWI image clipped to the region.\nvar weighted = ndwi.clip(geometry)\n .reduceRegion({\n reducer: ee.Reducer.mean(),\n geometry: geometry,\n scale: 30})\n .get('nd');\n\n// Compute the UN-weighted mean of the NDWI image clipped to the region.\nvar unweighted = ndwi.clip(geometry)\n .reduceRegion({\n reducer: ee.Reducer.mean().unweighted(),\n geometry: geometry,\n scale: 30})\n .get('nd');\n\n// Observe the difference between weighted and unweighted reductions.\nprint('weighted:', weighted);\nprint('unweighted', unweighted);\n```\nPython setup\n\nSee the [Python Environment](/earth-engine/guides/python_install) page for information on the Python API and using\n`geemap` for interactive development. \n\n```python\nimport ee\nimport geemap.core as geemap\n```\n\n### Colab (Python)\n\n```python\n# Load a Landsat 8 input image.\nimage = ee.Image('LANDSAT/LC08/C02/T1/LC08_044034_20140318')\n\n# Create an arbitrary region.\ngeometry = ee.Geometry.Rectangle(-122.496, 37.532, -121.554, 37.538)\n\n# Make an NDWI image. It will have one band named 'nd'.\nndwi = image.normalizedDifference(['B3', 'B5'])\n\n# Compute the weighted mean of the NDWI image clipped to the region.\nweighted = (\n ndwi.clip(geometry)\n .reduceRegion(reducer=ee.Reducer.mean(), geometry=geometry, scale=30)\n .get('nd')\n)\n\n# Compute the UN-weighted mean of the NDWI image clipped to the region.\nunweighted = (\n ndwi.clip(geometry)\n .reduceRegion(\n reducer=ee.Reducer.mean().unweighted(), geometry=geometry, scale=30\n )\n .get('nd')\n)\n\n# Observe the difference between weighted and unweighted reductions.\ndisplay('weighted:', weighted)\ndisplay('unweighted', unweighted)\n```\n\nThe difference in results is due to pixels at the edge of the region receiving a weight\nof one as a result of calling `unweighted()` on the reducer.\n\nIn order to obtain an explicitly weighted output, it is preferable to set the weights\nexplicitly with `splitWeights()` called on the reducer. A reducer modified by\n`splitWeights()` takes two inputs, where the second input is the weight. The\nfollowing example illustrates `splitWeights()` by computing the weighted mean\nNormalized Difference Vegetation Index (NDVI) in a region, with the weights given by\ncloud score (the cloudier, the lower the weight):\n\n### Code Editor (JavaScript)\n\n```javascript\n// Load an input Landsat 8 image.\nvar image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_186059_20130419');\n\n// Compute cloud score and reverse it such that the highest\n// weight (100) is for the least cloudy pixels.\nvar cloudWeight = ee.Image(100).subtract(\n ee.Algorithms.Landsat.simpleCloudScore(image).select(['cloud']));\n\n// Compute NDVI and add the cloud weight band.\nvar ndvi = image.normalizedDifference(['B5', 'B4']).addBands(cloudWeight);\n\n// Define an arbitrary region in a cloudy area.\nvar region = ee.Geometry.Rectangle(9.9069, 0.5981, 10.5, 0.9757);\n\n// Use a mean reducer.\nvar reducer = ee.Reducer.mean();\n\n// Compute the unweighted mean.\nvar unweighted = ndvi.select(['nd']).reduceRegion(reducer, region, 30);\n\n// compute mean weighted by cloudiness.\nvar weighted = ndvi.reduceRegion(reducer.splitWeights(), region, 30);\n\n// Observe the difference as a result of weighting by cloudiness.\nprint('unweighted:', unweighted);\nprint('weighted:', weighted);\n```\nPython setup\n\nSee the [Python Environment](/earth-engine/guides/python_install) page for information on the Python API and using\n`geemap` for interactive development. \n\n```python\nimport ee\nimport geemap.core as geemap\n```\n\n### Colab (Python)\n\n```python\n# Load an input Landsat 8 image.\nimage = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_186059_20130419')\n\n# Compute cloud score and reverse it such that the highest\n# weight (100) is for the least cloudy pixels.\ncloud_weight = ee.Image(100).subtract(\n ee.Algorithms.Landsat.simpleCloudScore(image).select(['cloud'])\n)\n\n# Compute NDVI and add the cloud weight band.\nndvi = image.normalizedDifference(['B5', 'B4']).addBands(cloud_weight)\n\n# Define an arbitrary region in a cloudy area.\nregion = ee.Geometry.Rectangle(9.9069, 0.5981, 10.5, 0.9757)\n\n# Use a mean reducer.\nreducer = ee.Reducer.mean()\n\n# Compute the unweighted mean.\nunweighted = ndvi.select(['nd']).reduceRegion(reducer, region, 30)\n\n# compute mean weighted by cloudiness.\nweighted = ndvi.reduceRegion(reducer.splitWeights(), region, 30)\n\n# Observe the difference as a result of weighting by cloudiness.\ndisplay('unweighted:', unweighted)\ndisplay('weighted:', weighted)\n```\n\nObserve that `cloudWeight` needs to be added as a band prior to calling\n`reduceRegion()`. The result indicates that the estimated mean NDVI is\nhigher as a result of decreasing the weight of cloudy pixels."]]