การคอมโพสิต การมาสก์ และการโมเสก

เมื่อโหลดคอลเล็กชันการสะท้อน TOA ของ Landsat 8ลงในตัวแปรที่ชื่อ 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 วัน ซึ่งหมายความว่าในช่วง 6 เดือนจะมีรูปภาพประมาณ 12 รูป (และจะมีรูปภาพมากขึ้นในบริเวณที่ฉากทับซ้อนกัน) พิกเซลแต่ละพิกเซลบนแผนที่ได้มาจากกองพิกเซล - พิกเซลหนึ่งจากแต่ละรูปภาพในคอลเล็กชันที่แสดง

การเพิ่มคอลเล็กชันลงในแผนที่จะส่งผลให้ระบบเลือกพิกเซลล่าสุด ซึ่งก็คือพิกเซลจากรูปภาพล่าสุดในกอง ลักษณะการทำงานนี้อาจเปลี่ยนแปลงได้โดยใช้ตัวลดของ Earth Engine ตัวอย่างเช่น แทนที่จะใช้พิกเซลล่าสุดจากกองซ้อน คุณสามารถสั่งให้ Earth Engine เลือกค่ามัธยฐานในกองซ้อนได้ ซึ่งมีประโยชน์ในการนำเมฆ (ซึ่งมีค่าสูง) และเงา (ซึ่งมีค่าต่ำ) ออก เมื่อลดคอลเล็กชันรูปภาพโดยใช้ตัวลดค่ามัธยฐาน ค่าคอมโพสิตคือค่ามัธยฐานในแต่ละแบนด์เมื่อเวลาผ่านไป เช่น การใช้ฉาก Landsat ในปี 2016

โปรแกรมแก้ไขโค้ด (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() เป็นอาร์กิวเมนต์ ดูee.Reducerแพ็กเกจในแท็บเอกสารของโปรแกรมแก้ไขโค้ด เพื่อดูรายการตัวลดทั้งหมดของ Earth Engine เมื่อพิจารณาตัวลดสำหรับคอลเล็กชันรูปภาพ โปรดทราบว่าเอาต์พุตเป็นรูปภาพ ดังนั้นตัวลดที่มีเอาต์พุตที่ไม่ใช่ตัวเลข เช่น ตัวลด histogram หรือ toList จะใช้กับคอลเล็กชันรูปภาพไม่ได้

Tutorial_api_06_median_composite
รูปที่ 6 ภาพผสมค่ามัธยฐานของ Landsat 8

เมื่อซูมออกในค่ามัธยฐานแบบรวม คุณควรเห็นภาพคล้ายกับรูปที่ 6 ซึ่งควร ดูดีกว่าค่าผสมมูลค่าล่าสุดที่คุณสร้างไว้ก่อนหน้านี้อย่างมาก ในตอนนี้ เราควรย้อนกลับไปพิจารณาสิ่งที่ทำไปแล้วเพื่อสร้าง ค่ามัธยฐานแบบผสม Earth Engine ได้โหลดคอลเล็กชัน Landsat 8 ทั้งหมดใน สหรัฐอเมริกาภาคพื้นทวีป และคำนวณค่ามัธยฐานสำหรับทุกพิกเซล ซึ่งถือว่าเป็นข้อมูลปริมาณมหาศาลทีเดียว แน่นอนว่าคุณสามารถคำนวณค่ามัธยฐานรายปีได้โดยการกรองคอลเล็กชันก่อน ดังที่เคยทำ ประเด็นคือหากคุณต้องดาวน์โหลดภาพทั้งหมดนั้นและสร้างภาพคอมโพสิตนี้ ก็จะเป็น โปรเจ็กต์ขนาดใหญ่ Earth Engine ช่วยให้คุณได้รับผลลัพธ์ในไม่กี่วินาที

ดูข้อมูลเพิ่มเติมเกี่ยวกับการคอมโพสิตและการโมเสคที่นี่

การมาสก์

แม้ว่าค่ามัธยฐานแบบผสมจะดีกว่าค่าแบบผสมล่าสุด แต่คุณอาจต้องการมาสก์บางส่วนของรูปภาพ การมาสก์พิกเซลในรูปภาพจะทำให้พิกเซลเหล่านั้น โปร่งใสและไม่รวมพิกเซลเหล่านั้นในการวิเคราะห์ พิกเซลแต่ละพิกเซลในแต่ละแถบของรูปภาพจะมี มาสก์ ส่วนที่มีค่ามาสก์เป็น 0 หรือต่ำกว่าจะเป็นแบบโปร่งใส ส่วนที่มีมาสก์เป็น ค่าใดก็ตามที่มากกว่า 0 จะได้รับการแสดงผล มาสก์ของรูปภาพจะตั้งค่าโดยใช้การเรียกใช้ เช่น image1.mask(image2) การเรียกนี้จะใช้ค่าของ image2 และ ทำให้ค่าเหล่านั้นเป็นมาสก์ของ image1 พิกเซลใดๆ ใน image2 ที่มีค่าเป็น 0 จะทำให้โปร่งใสใน image1

เช่น สมมติว่าคุณต้องการมาสก์พิกเซลน้ำทั้งหมดในคอมโพสิตค่ามัธยฐาน คุณสร้างมาสก์น้ำได้โดยใช้ชุดข้อมูลที่อธิบายโดย Hansen et al. (2013) ซึ่งอยู่ใน แคตตาล็อกข้อมูล Earth Engine (ดูข้อมูลเพิ่มเติมเกี่ยวกับชุดข้อมูลของ Hansen และคณะได้ในบทแนะนำนี้) ในชุดข้อมูลนี้ น้ำมีค่า 2 ที่ดินมีค่า 1 และ "ไม่มีข้อมูล" มีค่า 0 ใช้ตรรกะเล็กน้อยเพื่อสร้างมาสก์ รูปภาพที่มีค่าเป็น 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');

โค้ดนี้มีสิ่งใหม่ๆ 2-3 อย่างที่ควรกล่าวถึงโดยละเอียด ก่อนอื่น ฟังก์ชัน select() มีประโยชน์ในการดึงแบนด์ที่สนใจจากรูปภาพ ในที่นี้ เราจะเลือกเฉพาะแถบความถี่ที่เราสนใจ datamask สิ่งใหม่ถัดไป คือโอเปอเรเตอร์ทางตรรกะ eq() ซึ่งหมายถึง "เท่ากับ" เราใช้ eq(1) เพื่อสร้างรูปภาพไบนารีซึ่งพิกเซลทั้งหมดที่ไม่มีค่า เป็น 1 ในแถบ datamask (พิกเซลที่เป็นน้ำหรือไม่มีข้อมูล) จะมีค่า เป็น 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() จะเปลี่ยนเลขศูนย์ทั้งหมดเป็น 1 และเปลี่ยนตัวเลขที่ไม่ใช่ศูนย์ทั้งหมดเป็น 0 การเรียกตัวแปรนั้นว่า water ไม่ถูกต้องนักเนื่องจากมีพิกเซลที่ไม่มีข้อมูลรวมอยู่ด้วย แต่ก็ใช้ได้ในบริบทการทำแผนที่ปัจจุบัน ขั้นตอนถัดไปคือการมาสก์ "น้ำ" ด้วยตัวเอง ซึ่งจะทำให้ได้รูปภาพที่พิกเซลน้ำทั้งหมดเป็น 1 และ ส่วนอื่นๆ ทั้งหมดจะถูกมาสก์ ขั้นตอนสุดท้ายคือการรวมรูปภาพด้วย mosaic() เนื่องจาก mosaic() ทำงานกับคอลเล็กชันรูปภาพ เราจึงส่งรายการรูปภาพที่ต้องการรวมไว้ในตัวสร้างคอลเล็กชันรูปภาพ จากนั้นเรียกใช้ mosaic() เป็นขั้นตอนสุดท้าย ลำดับของรูปภาพในรายการนั้นมีความสำคัญ กล่าวคือ รูปภาพเอาต์พุตจะมีพิกเซลสุดท้ายที่ไม่ได้มาสก์จาก กองรูปภาพในคอลเล็กชันอินพุต ในกรณีนี้ การดำเนินการดังกล่าวใช้ได้เนื่องจากเลเยอร์น้ำ เป็นรูปภาพสุดท้าย (บนสุด) ในคอลเล็กชัน และมีเฉพาะพิกเซลที่ไม่ได้มาสก์ซึ่งมีน้ำ

โปรดทราบว่ารูปภาพในคอลเล็กชันคือรูปภาพการแสดงภาพ เมื่อคุณเรียกใช้ visualize() ในรูปภาพ ระบบจะเปลี่ยนรูปภาพนั้นเป็นรูปภาพ 3 แถบ 8 บิตตามพารามิเตอร์การแสดงภาพ ที่คุณส่ง พารามิเตอร์การแสดงภาพเริ่มต้นใช้ได้ดีกับรูปภาพ 3 แถบ 8 บิต คุณจึงไม่จำเป็นต้องใช้พารามิเตอร์การแสดงภาพเมื่อเพิ่มรูปภาพลงใน แผนที่ ผลลัพธ์ควรมีลักษณะเหมือนรูปที่ 7

Tutorial_api_07_mosaic.png
รูปที่ 7 โมเสกที่กำหนดเองซึ่งทำให้พื้นที่น้ำมีสีเดียวกัน

ในตอนนี้ คุณได้เห็นวิธีแสดงภาพคอลเล็กชันรูปภาพเป็นค่าล่าสุด วิธีการคอมโพสิตคอลเล็กชันรูปภาพโดยใช้ตัวลด และวิธีการสร้าง คอมโพสิตที่กำหนดเองโดยการมาสก์และโมเสกคอลเล็กชันรูปภาพ ในหน้าถัดไป ให้ดูวิธี เพิ่มดัชนีพืชพรรณในทุกรูปภาพในคอลเล็กชัน และใช้ดัชนีเพื่อสร้าง คอมโพสิต "พิกเซลที่เขียวที่สุด"