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

Landsat 8 TOA रिफ़्लेक्टेंस कलेक्शन को 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 के सभी रिड्यूसर की सूची देखने के लिए, कोड एडिटर के दस्तावेज़ टैब में 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 के डेटा कैटलॉग में मौजूद है. (हैनसेन और अन्य लोगों के डेटासेट के बारे में ज़्यादा जानने के लिए, यह ट्यूटोरियल देखें.) इस डेटासेट में, पानी की वैल्यू 2 है, ज़मीन की वैल्यू 1 है, और 'कोई डेटा नहीं' की वैल्यू 0 है. ज़मीन न होने पर, मास्क इमेज में शून्य बनाने के लिए कुछ लॉजिक का इस्तेमाल करें:

कोड एडिटर (JavaScript)

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

// 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. के डेटासेट के मुताबिक होती है. हालांकि, पानी (या नोडेटा) पर मौजूद पिक्सल पारदर्शी होते हैं और 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() को कॉल करते हैं. उस सूची में मौजूद इमेज का क्रम अहम होता है. खास तौर पर, आउटपुट इमेज में इनपुट कलेक्शन में मौजूद इमेज के स्टैक से, बिना मास्क किया गया आखिरी पिक्सल शामिल होगा. इस मामले में, यह तरीका काम करता है. ऐसा इसलिए, क्योंकि पानी की लेयर, कलेक्शन में मौजूद आखिरी (सबसे ऊपर) इमेज है. इसमें सिर्फ़ ऐसे पिक्सल शामिल हैं जिन्हें मास्क नहीं किया गया है और जहां पानी मौजूद है.

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

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

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