কম্পোজিটিং, মাস্কিং ও মোজাইকিং

l8 নামক ভেরিয়েবলে Landsat 8 TOA reflectance collection লোড করার পরে আপনি দেখেছেন যে নিম্নলিখিত কোডের ফলে সাম্প্রতিক-ভ্যালু কম্পোজিট তৈরি হয়:

কোড এডিটর (জাভাস্ক্রিপ্ট)

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 প্রতি ১৬ দিন অন্তর পৃথিবীর একই জায়গায় ফিরে আসে। এর অর্থ হল, ৬ মাসের সময়সীমার মধ্যে, প্রায় ১২টি ছবি (এবং যেখানে দৃশ্য ওভারল্যাপ করে সেখানে আরও বেশি) থাকবে। ম্যাপের প্রতিটি পিক্সেল, পিক্সেলের স্ট্যাক থেকে নেওয়া হয় - দেখানো হচ্ছে এমন সংগ্রহের প্রতিটি ছবি থেকে একটি করে।

ম্যাপে শুধু সংগ্রহ যোগ করলে, সবচেয়ে সাম্প্রতিক পিক্সেল বেছে নেওয়া হয় - স্ট্যাকের লেটেস্ট ছবি থেকে নেওয়া পিক্সেল। Earth Engine রিডিউসার ব্যবহার করে এই আচরণ পরিবর্তন করা যেতে পারে। যেমন, স্ট্যাক থেকে সবচেয়ে সাম্প্রতিক পিক্সেল নেওয়ার পরিবর্তে, Earth Engine-কে স্ট্যাকের মধ্যবর্তী মান বেছে নেওয়ার নির্দেশ দেওয়া যেতে পারে। এর ফলে মেঘ (যার ভ্যালু বেশি) ও ছায়া (যার ভ্যালু কম) সরিয়ে দেওয়া যায়। মিডিয়ান রিডিউসার ব্যবহার করে কোনও ইমেজ কালেকশন কমানো হলে, সময়ের সাথে সাথে প্রতিটি ব্যান্ডে কম্পোজিট ভ্যালু হল মিডিয়ান। যেমন, ২০১৬ সালে Landsat দৃশ্য ব্যবহার করা:

কোড এডিটর (জাভাস্ক্রিপ্ট)

// 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 রিডিউসারের তালিকা দেখতে Code Editor-এর Docs ট্যাবে ee.Reducer প্যাকেজ দেখুন। কোনও ইমেজ কালেকশনের জন্য রিডিউসার বিবেচনা করার সময়, মনে রাখবেন যে আউটপুট হল একটি ছবি, তাই সংখ্যাসূচক নয় এমন আউটপুট সহ রিডিউসার, যেমন histogram বা toList রিডিউসার, ইমেজ কালেকশনের সাথে কাজ করবে না।

Tutorial_api_06_median_composite
ছবি ৬. Landsat 8 মিডিয়ান কম্পোজিট।

মিডিয়ান কম্পোজিটে জুম-আউট করলে, আপনি ছবি ৬-এর মতো কিছু দেখতে পাবেন। এটি আগে আপনার তৈরি করা সাম্প্রতিক ভ্যালু কম্পোজিটের থেকে অনেক ভালো দেখাবে। এই পর্যায়ে, একটু পিছিয়ে গিয়ে এই মধ্যক কম্পোজিট তৈরি করার জন্য কী করা হয়েছে তা বিবেচনা করা প্রয়োজন। Earth Engine, মার্কিন যুক্তরাষ্ট্রের মহাদেশীয় অঞ্চল জুড়ে সম্পূর্ণ Landsat 8 কালেকশন লোড করেছে এবং প্রতিটি পিক্সেলের জন্য মধ্যক গণনা করেছে। প্রচুর ডেটা! অবশ্যই, আপনি প্রথমে সংগ্রহ ফিল্টার করে বার্ষিক মধ্যক গণনা করতে পারেন, যেমন আপনি আগে করেছেন। আসল কথা হল, আপনাকে যদি এই সব ছবি ডাউনলোড করে এই কম্পোজিট তৈরি করতে হত, তাহলে এটি একটি বড় প্রোজেক্ট হত। Earth Engine-এর মাধ্যমে আপনি কয়েক সেকেন্ডের মধ্যেই ফলাফল পেয়ে যাবেন!

কম্পোজিটিং ও মোজাইকিং সম্পর্কে এখান থেকে আরও জানুন।

মাস্কিং

যদিও সাম্প্রতিক-ভ্যালু কম্পোজিটের তুলনায় মিডিয়ান কম্পোজিট আরও উন্নত, আপনি ছবির কিছু অংশ মাস্ক করতে চাইতে পারেন। কোনও ছবিতে পিক্সেল মাস্কিং করলে সেই পিক্সেলগুলি স্বচ্ছ হয়ে যায় এবং বিশ্লেষণের সময় সেগুলি বাদ দেওয়া হয়। ছবির প্রতিটি ব্যান্ডের প্রতিটি পিক্সেলে একটি মাস্ক থাকে। মাস্ক ভ্যালু ০ বা তার কম হলে তা ট্রান্সপারেন্ট হবে। ০-এর বেশি যেকোনও ভ্যালুর মাস্ক রেন্ডার করা হবে। ছবির মাস্ক image1.mask(image2)-এর মতো কল ব্যবহার করে সেট করা হয়। এই কল image2-এর ভ্যালু নেয় এবং সেগুলিকে image1-এর মাস্ক হিসেবে ব্যবহার করে। image2-এর যেকোনও পিক্সেল যার ভ্যালু ০, সেটি image1-এ ট্রান্সপারেন্ট করা হবে।

যেমন, ধরুন আপনি মিডিয়ান কম্পোজিটে সব ওয়াটার পিক্সেল মাস্ক করতে চান। Earth Engine ডেটা ক্যাটালগে থাকা Hansen et al. (2013)-এর বর্ণনা করা ডেটাসেট ব্যবহার করে ওয়াটার মাস্ক তৈরি করা যেতে পারে। (Hansen et al. ডেটাসেট সম্পর্কে আরও জানুন এই টিউটোরিয়াল থেকে।) এই ডেটাসেটে, জলের ভ্যালু হল ২, জমির ভ্যালু হল ১ এবং 'কোনও ডেটা নেই' বিকল্পের ভ্যালু হল ০। মাস্ক ইমেজ তৈরি করতে একটু লজিক ব্যবহার করুন যেখানে কোনও জমি নেই সেখানে শূন্য আছে:

কোড এডিটর (জাভাস্ক্রিপ্ট)

// 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 ব্যান্ডে ১ ভ্যালু নেই এমন সব পিক্সেল (যেগুলি জল বা কোনও ডেটা নেই) ফলাফল ছবিতে ০ ভ্যালু পায়।

এই মাস্কিংয়ের ফলে, মিডিয়ান কম্পোজিটে থাকা সমস্ত পিক্সেল যা ভূমির উপরে রয়েছে (Hansen et al. ডেটাসেট অনুযায়ী) তা দেখা যায়, কিন্তু জলের উপরে থাকা পিক্সেল (বা nodata) স্বচ্ছ হয় এবং maskedComposite ছবিতে আপনার করা যেকোনও বিশ্লেষণ থেকে বাদ দেওয়া হবে।

মোজাইকিং

ইমেজ কালেকশন, লজিক্যাল অপারেটর, মাস্কিং ও কম্পোজিটিংয়ের ধারণা একত্রিত করে আপনি আকর্ষণীয় কার্টোগ্রাফিক ফলাফল পেতে পারেন। যেমন, ধরুন আপনি এমন একটি ছবি চান যেখানে ল্যান্ড পিক্সেল আসল রঙে এবং অন্যান্য সব পিক্সেল নীল রঙে দেখানো হবে, তাহলে আপনি এই ধরনের কিছু করতে পারেন:

কোড এডিটর (জাভাস্ক্রিপ্ট)

// 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 বলা সম্পূর্ণ সঠিক নয় কারণ এতে কিছু nodata পিক্সেলও রয়েছে, তবে বর্তমান কার্টোগ্রাফিক প্রসঙ্গে এটি ঠিক আছে। এর পরের কাজ হল "জল" শব্দটিকে মাস্ক করা। এর ফলে এমন একটি ছবি তৈরি হয় যেখানে সব ওয়াটার পিক্সেল 1's এবং অন্য সবকিছু মাস্ক করা থাকে। শেষ ধাপ হল mosaic()-এর সাথে ছবিগুলি একত্রিত করা। যেহেতু mosaic() একটি ইমেজ কালেকশনে কাজ করে, তাই আমরা ইমেজ কালেকশন কনস্ট্রাক্টরে যেসব ছবি একত্রিত করতে চাই তার একটি তালিকা পাস করি, তারপর চূড়ান্ত ধাপ হিসেবে mosaic() কল করি। তালিকায় ছবির ক্রম গুরুত্বপূর্ণ। বিশেষ করে, আউটপুট ছবিতে ইনপুট সংগ্রহের ছবির স্ট্যাক থেকে শেষ আনমাস্ক করা পিক্সেল থাকবে। এই ক্ষেত্রে, এটি কাজ করে কারণ জলের স্তরটি সংগ্রহের শেষ (শীর্ষ) ছবি এবং এতে শুধুমাত্র আন-মাস্কড পিক্সেল রয়েছে যেখানে জল দেখা যায়।

মনে রাখবেন যে কালেকশনে থাকা ছবিগুলি হল ভিজ্যুয়ালাইজেশন ছবি। আপনি কোনও ছবিতে visualize() কল করলে, আপনার পাস করা ভিজ্যুয়ালাইজেশন প্যারামিটার অনুযায়ী এটি ৩-ব্যান্ড, ৮-বিট ছবিতে পরিণত হয়। ডিফল্ট ভিজ্যুয়ালাইজেশন প্যারামিটার ৩-ব্যান্ড, ৮-বিট ছবির জন্য ভাল কাজ করে, তাই ম্যাপে ছবি যোগ করার সময় আপনার ভিজ্যুয়ালাইজেশন প্যারামিটারের প্রয়োজন নেই। ফলাফলটি ছবি ৭-এর মতো দেখতে হতে হবে।

Tutorial_api_07_mosaic.png
ছবি ৭. কাস্টম মোজাইক যা জলের অংশকে একটি অভিন্ন রঙে দেখায়।

এই পর্যায়ে, আপনি সাম্প্রতিক-ভ্যালু কম্পোজিট হিসেবে ইমেজ কালেকশন ভিজ্যুয়ালাইজ করার উপায়, রিডিউসার ব্যবহার করে ইমেজ কালেকশন কম্পোজিট করার পদ্ধতি এবং ইমেজের কালেকশন মাস্ক ও মোজাইক করে কাস্টম কম্পোজিট তৈরি করার পদ্ধতি দেখেছেন। পরের পৃষ্ঠায়, কীভাবে কোনও সংগ্রহের প্রতিটি ছবিতে উদ্ভিদ সূচক যোগ করতে হয় এবং সূচক ব্যবহার করে কীভাবে "সবচেয়ে সবুজ পিক্সেল" কম্পোজিট তৈরি করতে হয় তা জানুন।