Secara default, peredam yang diterapkan pada gambar menimbang input sesuai dengan nilai mask.
Hal ini relevan dalam konteks piksel fraksional yang dibuat melalui operasi seperti
clip(). Sesuaikan perilaku ini dengan memanggil unweighted() pada
pengurangan. Menggunakan peredam yang tidak berbobot akan memaksa semua piksel di wilayah memiliki bobot yang sama. Contoh berikut menggambarkan cara pembobotan piksel dapat memengaruhi output
penggabung:
Untuk pengurangan berbobot, bobot persimpangan piksel direpresentasikan secara internal sebagai bilangan bulat 8-bit (0 hingga 255). Hal ini menguantisasi cakupan piksel fraksional ke dalam 256 tingkat terpisah. Akibatnya, setiap fraksi cakupan yang kurang dari sekitar 1/256 (~0,4%) dibulatkan ke bawah menjadi bobot 0 (tidak valid). Lihat panduan Pengurangan Region untuk mengetahui detail selengkapnya tentang cara memberi bobot pada piksel di suatu region.
Editor Kode (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)
Perbedaan hasil disebabkan oleh piksel di tepi wilayah yang menerima bobot
satu sebagai hasil dari panggilan unweighted() pada peredam.
Untuk mendapatkan output yang diberi bobot secara eksplisit, sebaiknya tetapkan bobot
secara eksplisit dengan splitWeights() yang dipanggil di reducer. Pengurangan yang diubah oleh
splitWeights() mengambil dua input, dengan input kedua adalah bobot. Contoh berikut menggambarkan splitWeights() dengan menghitung rata-rata tertimbang Normalized Difference Vegetation Index (NDVI) di suatu wilayah, dengan bobot yang diberikan oleh skor awan (makin berawan, makin rendah bobotnya):
Editor Kode (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)
Perhatikan bahwa cloudWeight harus ditambahkan sebagai rentang sebelum memanggil
reduceRegion(). Hasilnya menunjukkan bahwa NDVI rata-rata yang diestimasi lebih tinggi karena penurunan bobot piksel berawan.