कंपोज़िटिंग, मास्किंग, और मोज़ेकिंग

Landsat 8 TOA reflectance collection को l8 नाम के वैरिएबल में लोड करने पर, आपने देखा कि इस कोड से हाल ही की वैल्यू वाला कंपोज़िट मिलता है:

कोड एडिटर (JavaScript)

var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');
var landsat2016 = l8.filterDate('2016-01-01', '2016-12-31');
Map.addLayer(landsat2016, visParams, 'l8 collection');

इस कंपोज़िट में एक समस्या यह है कि इसमें बहुत सारे बादल हैं. कलेक्शन में मौजूद सिर्फ़ आखिरी पिक्सल को लेने के बजाय (जब मैप में कोई कलेक्शन जोड़ा जाता है, तो Earth Engine उस पर mosaic() को कॉल करता है), ImageCollection को कम किया जा सकता है (इमेज कलेक्शन को कम करने के बारे में ज़्यादा जानें).

रिड्यूसर के साथ कंपोज़िट करना

आपको सबसे पहले इमेज के किसी हिस्से के आंकड़े पाने के लिए, रिड्यूसर के बारे में बताया गया था. यह स्पेशल रिडक्शन था. इमेज के कलेक्शन को एक इमेज में बदलना, टेंपोरल रिडक्शन होता है. ऐसा तब होता है, जब कलेक्शन में समय के साथ ली गई इमेज शामिल हों. Reducer के टाइप से तय होता है कि Earth Engine, ओवरलैप होने वाले पिक्सल को कैसे मैनेज करता है. Landsat 8 हर 16 दिन में पृथ्वी पर एक ही जगह की निगरानी करता है. इसका मतलब है कि छह महीने की अवधि में, करीब 12 इमेज होंगी. साथ ही, जहां सीन ओवरलैप होंगे वहां ज़्यादा इमेज होंगी. मैप पर मौजूद हर पिक्सल, पिक्सल के स्टैक से लिया जाता है. यह स्टैक, दिखाए जा रहे कलेक्शन की हर इमेज से लिया जाता है.

मैप में कलेक्शन जोड़ने से, सबसे हाल का पिक्सल चुना जाता है. यह पिक्सल, स्टैक में मौजूद सबसे नई इमेज से चुना जाता है. Earth Engine के रिड्यूसर का इस्तेमाल करके, इस व्यवहार में बदलाव किया जा सकता है. उदाहरण के लिए, स्टैक से सबसे हाल का पिक्सल लेने के बजाय, Earth Engine को स्टैक में मौजूद मीडियन वैल्यू चुनने का निर्देश दिया जा सकता है. इससे बादलों (जिनकी वैल्यू ज़्यादा होती है) और परछाइयों (जिनकी वैल्यू कम होती है) को हटाने में मदद मिलती है. जब मीडियन रिड्यूसर का इस्तेमाल करके इमेज कलेक्शन को कम किया जाता है, तो कंपोज़िट वैल्यू, समय के साथ हर बैंड में मीडियन होती है. उदाहरण के लिए, 2016 में Landsat सीन का इस्तेमाल करके:

कोड एडिटर (JavaScript)

// Get the median over time, in each band, in each pixel.
var median = l8.filterDate('2016-01-01', '2016-12-31').median();

// Make a handy variable of visualization parameters.
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3};

// Display the median composite.
Map.addLayer(median, visParams, 'median');

इस कोड में नई चीज़, इमेज कलेक्शन पर लागू किया गया median() तरीका है. फ़िल्टर करने के तरीकों की तरह ही, यह इमेज कलेक्शन पर ज़्यादा सामान्य reduce() तरीके का शॉर्टकट है. यह ee.Reducer() को आर्ग्युमेंट के तौर पर लेता है. Earth Engine के सभी रिड्यूसर की सूची देखने के लिए, कोड एडिटर के Docs टैब में ee.Reducer पैकेज देखें. किसी इमेज कलेक्शन के लिए रिड्यूसर का इस्तेमाल करते समय, ध्यान रखें कि आउटपुट एक इमेज होती है. इसलिए, बिना अंकों वाले आउटपुट वाले रिड्यूसर, जैसे कि histogram या toList रिड्यूसर, इमेज कलेक्शन के साथ काम नहीं करेंगे.

Tutorial_api_06_median_composite
छठी इमेज. Landsat 8 मीडियन कंपोज़िट.

मीडियन कंपोज़िट को ज़ूम आउट करने पर, आपको इमेज 6 जैसा कुछ दिखेगा. यह पहले बनाए गए रीसेंट वैल्यू कंपोज़िट से काफ़ी बेहतर दिखना चाहिए. इस समय, यह जानना ज़रूरी है कि मीडियन कंपोज़िट बनाने के लिए क्या किया गया है. Earth Engine ने अमेरिका के पूरे महाद्वीप के लिए, Landsat 8 का पूरा कलेक्शन लोड किया है. साथ ही, हर पिक्सल के लिए मीडियन का हिसाब लगाया है. यह बहुत सारा डेटा है! ज़ाहिर है कि सालाना मीडियन की गणना की जा सकती है. इसके लिए, पहले कलेक्शन को फ़िल्टर करें, जैसा कि आपने पहले किया था. कहने का मतलब है कि अगर आपको ये सभी इमेज डाउनलोड करके, इस तरह की कंपोज़िट इमेज बनानी पड़े, तो यह एक बड़ा प्रोजेक्ट होगा. Earth Engine की मदद से, आपको कुछ ही सेकंड में नतीजा मिल जाता है!

कंपोज़िटिंग और मोज़ेकिंग के बारे में यहां ज़्यादा जानें.

मास्किंग

हालांकि, मीडियन कंपोज़िट, हाल ही की वैल्यू वाले कंपोज़िट से बेहतर है, लेकिन हो सकता है कि आपको इमेज के कुछ हिस्सों को मास्क करना पड़े. किसी इमेज में पिक्सल मास्क करने से, वे पिक्सल पारदर्शी हो जाते हैं और विश्लेषण में शामिल नहीं होते. किसी इमेज के हर बैंड के हर पिक्सल में एक मास्क होता है. जिनकी मास्क वैल्यू 0 या उससे कम होगी वे पारदर्शी होंगे. जिनकी मास्क वैल्यू 0 से ज़्यादा होगी उन्हें रेंडर किया जाएगा. इमेज का मास्क, image1.mask(image2) जैसे कॉल का इस्तेमाल करके सेट किया जाता है. यह कॉल image2 की वैल्यू लेता है और उन्हें image1 का मास्क बनाता है. image2 में मौजूद ऐसे पिक्सल जिनकी वैल्यू 0 है उन्हें image1 में पारदर्शी बना दिया जाएगा.

उदाहरण के लिए, मान लें कि आपको मीडियन कंपोज़िट में पानी के सभी पिक्सल मास्क करने हैं. हैन्सन और अन्य (2013) के बताए गए डेटासेट का इस्तेमाल करके, वॉटर मास्क बनाया जा सकता है. यह डेटासेट, Earth Engine के डेटा कैटलॉग में मौजूद है. (Hansen वगैरह के डेटासेट के बारे में ज़्यादा जानने के लिए, यह ट्यूटोरियल देखें.) इस डेटासेट में, पानी की वैल्यू 2 है, ज़मीन की वैल्यू 1 है, और 'कोई डेटा नहीं' की वैल्यू 0 है. मास्क इमेज बनाने के लिए, थोड़े से लॉजिक का इस्तेमाल करें. इस इमेज में, जहां ज़मीन नहीं है वहां शून्य होना चाहिए:

कोड एडिटर (JavaScript)

// Load or import the Hansen et al. forest change dataset.
var hansenImage = ee.Image('UMD/hansen/global_forest_change_2025_v1_13');

// Select the land/water mask.
var datamask = hansenImage.select('datamask');

// Create a binary mask.
var mask = datamask.eq(1);

// Update the composite mask with the water mask.
var maskedComposite = median.updateMask(mask);
Map.addLayer(maskedComposite, visParams, 'masked');

इस कोड में कुछ नई चीज़ें हैं, जिनके बारे में विस्तार से बताना ज़रूरी है. सबसे पहले, select() फ़ंक्शन किसी इमेज से काम के बैंड निकालने के लिए उपयोगी है. यहां हम सिर्फ़ उस बैंड को चुनते हैं जो हमारे काम का है: datamask. अगली नई चीज़ है लॉजिकल ऑपरेटर eq(), जिसका मतलब है "बराबर है." हम बाइनरी इमेज बनाने के लिए, eq(1) का इस्तेमाल करते हैं. इसमें, datamask बैंड में 1 की वैल्यू न रखने वाले सभी पिक्सल (वे पिक्सल जो पानी या डेटा नहीं हैं) को नतीजे वाली इमेज में 0 की वैल्यू मिलती है.

इस मास्किंग की वजह से, मीडियन कंपोज़िट में मौजूद वे सभी पिक्सल दिखते हैं जो ज़मीन पर हैं. ये पिक्सल, Hansen et al. डेटासेट के मुताबिक होते हैं. हालांकि, पानी (या nodata) पर मौजूद पिक्सल पारदर्शी होते हैं और उन्हें maskedComposite इमेज पर किए जाने वाले किसी भी विश्लेषण से बाहर रखा जाएगा.

मोज़ेकिंग

इमेज कलेक्शन, लॉजिकल ऑपरेटर, मास्किंग, और कंपोज़िटिंग के कॉन्सेप्ट को मिलाकर, कार्टोग्राफ़िक के दिलचस्प नतीजे हासिल किए जा सकते हैं. उदाहरण के लिए, मान लें कि आपको एक ऐसी इमेज चाहिए जिसमें ज़मीन के पिक्सल, असली रंग में दिखें और अन्य सभी पिक्सल, नीले रंग में दिखें. इसके लिए, ऐसा कुछ किया जा सकता है:

कोड एडिटर (JavaScript)

// Make a water image out of the mask.
var water = mask.not();

// Mask water with itself to mask all the zeros (non-water).
water = water.mask(water);

// Make an image collection of visualization images.
var mosaic = ee.ImageCollection([
  median.visualize(visParams),
  water.visualize({palette: '000044'}),
]).mosaic();

// Display the mosaic.
Map.addLayer(mosaic, {}, 'custom mosaic');

इस कोड में बहुत कुछ हो रहा है, इसलिए चलिए इसे अलग-अलग हिस्सों में बांटते हैं. सबसे पहले, हम not() लॉजिकल ऑपरेटर का इस्तेमाल करके, पहले बनाए गए मास्क को उलटते हैं. खास तौर पर, not() सभी शून्य को एक में और सभी गैर-शून्य को शून्य में बदल देता है. इस वैरिएबल को water कहना पूरी तरह से सही नहीं है, क्योंकि इसमें कुछ नोडेटा पिक्सल भी शामिल हैं. हालांकि, मौजूदा कार्टोग्राफ़िक कॉन्टेक्स्ट में ऐसा करना ठीक है. इसके बाद, "पानी" को मास्क करना होगा. इससे एक ऐसी इमेज बनती है जिसमें पानी के सभी पिक्सल 1 होते हैं और बाकी सब कुछ मास्क किया जाता है. आखिरी चरण में, mosaic() की मदद से इमेज को मर्ज करें. mosaic(), इमेज के कलेक्शन पर काम करता है. इसलिए, हम इमेज की एक सूची पास करते हैं, जिसे हम इमेज कलेक्शन कंस्ट्रक्टर में जोड़ना चाहते हैं. इसके बाद, आखिरी चरण के तौर पर mosaic() को कॉल करते हैं. उस सूची में इमेज का क्रम अहम होता है. खास तौर पर, आउटपुट इमेज में इनपुट कलेक्शन में मौजूद इमेज के स्टैक से, मास्क न किया गया आखिरी पिक्सल शामिल होगा. इस मामले में, यह तरीका काम करता है, क्योंकि पानी की लेयर, कलेक्शन की आखिरी (सबसे ऊपर) इमेज है. इसमें सिर्फ़ वे अनमास्क किए गए पिक्सल शामिल हैं जहां पानी मौजूद है.

ध्यान दें कि कलेक्शन में मौजूद इमेज, विज़ुअलाइज़ेशन इमेज होती हैं. किसी इमेज पर visualize() को कॉल करने पर, वह आपके पास किए गए विज़ुअलाइज़ेशन पैरामीटर के हिसाब से, 3-बैंड, 8-बिट इमेज में बदल जाती है. डिफ़ॉल्ट विज़ुअलाइज़ेशन पैरामीटर, 3-बैंड और 8-बिट वाली इमेज के लिए ठीक से काम करते हैं. इसलिए, मैप में इमेज जोड़ते समय आपको विज़ुअलाइज़ेशन पैरामीटर की ज़रूरत नहीं होती. नतीजा, इमेज 7 जैसा दिखना चाहिए.

Tutorial_api_07_mosaic.png
सातवीं इमेज. कस्टम मोज़ेक, जो पानी वाले इलाकों को एक ही रंग में दिखाता है.

अब तक आपने इमेज कलेक्शन को रीसेंट-वैल्यू कंपोज़िट के तौर पर विज़ुअलाइज़ करने के तरीके देखे हैं. साथ ही, आपने रिड्यूसर का इस्तेमाल करके इमेज कलेक्शन को कंपोज़िट करने के तरीके और इमेज के कलेक्शन को मास्क और मोज़ेक करके कस्टम कंपोज़िट बनाने के तरीके भी देखे हैं. अगले पेज पर, किसी कलेक्शन की हर इमेज में वेजिटेशन इंडेक्स जोड़ने का तरीका जानें. साथ ही, इंडेक्स का इस्तेमाल करके "सबसे हरा पिक्सल" कंपोज़िट बनाने का तरीका जानें.