อัลกอริทึมการลงทะเบียนรูปภาพของ Earth Engine ออกแบบมาเพื่อเป็นขั้นตอนสุดท้ายในการจัดแนวรูปภาพแบบละเอียดหลังการจัดแนว ระบบจะถือว่ารูปภาพที่จะลงทะเบียนผ่านขั้นตอนการจัดแนวขั้นต้นแล้ว ดังนั้นรูปภาพจะหมุนอยู่ในองศาที่ใกล้เคียงกันอยู่แล้ว และแตกต่างกันเพียงเล็กน้อยในการแปล การลงทะเบียนใช้เทคนิค "ยางยืด" ซึ่งช่วยให้การบิดเบือนของภาพในท้องถิ่นสามารถแก้ไขข้อผิดพลาดในการปรับภาพให้ตรงและข้อบกพร่องอื่นๆ จากการประมวลผลก่อนหน้านี้ เทคนิคการจัดแนวพื้นฐานคือความเกี่ยวข้องของรูปภาพ ดังนั้นแถบของรูปภาพอินพุตและรูปภาพอ้างอิงต้องมีลักษณะคล้ายกันเพื่อให้อัลกอริทึมคำนวณการจัดแนวได้อย่างถูกต้อง
การเปลี่ยนตำแหน่งรูปภาพ
การลงทะเบียนรูปภาพมี 2 ขั้นตอน ได้แก่ การกำหนดรูปภาพการเปลี่ยนตำแหน่งโดยใช้ displacement()
แล้วนำไปใช้กับ displace()
อินพุตที่จําเป็นคือคู่รูปภาพที่จะลงทะเบียน และพารามิเตอร์การกระจัดสูงสุด (maxOffset
)
อัลกอริทึม displacement()
จะใช้รูปภาพอ้างอิง พารามิเตอร์การกระจัดสูงสุด (maxOffset
) และพารามิเตอร์ที่ไม่บังคับ 2 รายการที่แก้ไขลักษณะการทํางานของอัลกอริทึม เอาต์พุตคือรูปภาพการกระจัดที่มีแถบ dx
และ dy
ซึ่งระบุองค์ประกอบ X และ Y (เป็นเมตร) ของเวกเตอร์การกระจัดที่แต่ละพิกเซล
ระบบจะใช้แถบทั้งหมดของรูปภาพเรียกใช้และรูปภาพอ้างอิงสำหรับการจับคู่ระหว่างการลงทะเบียน ดังนั้นจำนวนแถบต้องเท่ากันทุกประการ แถบอินพุตต้องมีลักษณะคล้ายกันเพื่อให้การลงทะเบียนสําเร็จ หากไม่ใช่กรณีนี้ คุณอาจประมวลผลรูปภาพก่อน (เช่น การปรับให้เรียบ การตรวจหาขอบ) เพื่อให้รูปภาพดูคล้ายกันมากขึ้นได้ การคํานวณการลงทะเบียนจะทําโดยใช้กระบวนการแบบหลายขนาดจากหยาบไปละเอียด โดยมีโปรเจ็กชันที่ใช้งานได้ (หลายขนาด) ซึ่งขึ้นอยู่กับโปรเจ็กชัน 3 รายการที่ส่งไปยังอัลกอริทึม ดังนี้
- การฉายภาพเริ่มต้นของรูปภาพการโทร (Pc)
- การฉายภาพเริ่มต้นของรูปภาพอ้างอิง (Pr)
- การฉายภาพเอาต์พุต (Po)
การฉายภาพที่ใช้ทำงานที่มีความละเอียดสูงสุด (Pw) จะอยู่ใน CRS ของ Pr ที่มาตราส่วนซึ่งกำหนดโดยความละเอียดที่หยาบที่สุดของการฉายภาพ 3 รูปแบบนี้ เพื่อลดการคำนวณ จากนั้นระบบจะสุ่มตัวอย่างผลลัพธ์จาก Pr อีกครั้งเพื่อให้อยู่ในโปรเจ็กชันที่ระบุโดยพารามิเตอร์ "projection" ของอินพุต
เอาต์พุตคือภาพการกระจัดที่มีย่านความถี่ต่อไปนี้
dx
- สำหรับตําแหน่งพิกเซลของรูปภาพอ้างอิงหนึ่งๆ แถบนี้จะมีระยะทางในทิศทาง X ที่ต้องเดินทางเพื่อไปยังตําแหน่งที่ตรงกันในรูปภาพที่เรียก หน่วยเป็นเมตรเชิงเรขาคณิต
dy
- สำหรับตําแหน่งพิกเซลของรูปภาพอ้างอิงหนึ่งๆ แถบนี้จะมีระยะทางในทิศทาง Y ที่ต้องเดินทางเพื่อไปยังตําแหน่งซึ่งตรงกันในรูปภาพที่เรียกใช้ หน่วยเป็นเมตรเชิงเรขาคณิต
confidence
- ค่านี้เป็นค่าประมาณความเชื่อมั่นในการเปลี่ยนตำแหน่งต่อพิกเซล (โดยที่ 0 คือความเชื่อมั่นต่ำและ 1 คือความเชื่อมั่นสูง) โดยอิงตามคะแนนการเชื่อมโยงในภูมิภาคที่พบการจับคู่ที่ถูกต้อง ในภูมิภาคที่ไม่มีการจับคู่ ระบบจะประมาณความเชื่อมั่นจากการเชื่อมโยงที่อยู่ใกล้เคียงโดยใช้ Kernel แบบกaussian เพื่อเพิ่มน้ำหนักให้กับการเชื่อมโยงที่อยู่ใกล้เคียง
ตัวอย่างต่อไปนี้จะคํานวณขนาดและมุมของการกระจัดระหว่างรูปภาพ Terra Bella ความละเอียดสูง 2 รูป
เครื่องมือแก้ไขโค้ด (JavaScript)
// Load the two images to be registered. var image1 = ee.Image('SKYSAT/GEN-A/PUBLIC/ORTHO/MULTISPECTRAL/s01_20150502T082736Z'); var image2 = ee.Image('SKYSAT/GEN-A/PUBLIC/ORTHO/MULTISPECTRAL/s01_20150305T081019Z'); // Use bicubic resampling during registration. var image1Orig = image1.resample('bicubic'); var image2Orig = image2.resample('bicubic'); // Choose to register using only the 'R' band. var image1RedBand = image1Orig.select('R'); var image2RedBand = image2Orig.select('R'); // Determine the displacement by matching only the 'R' bands. var displacement = image2RedBand.displacement({ referenceImage: image1RedBand, maxOffset: 50.0, patchWidth: 100.0 }); // Compute image offset and direction. var offset = displacement.select('dx').hypot(displacement.select('dy')); var angle = displacement.select('dx').atan2(displacement.select('dy')); // Display offset distance and angle. Map.addLayer(offset, {min:0, max: 20}, 'offset'); Map.addLayer(angle, {min: -Math.PI, max: Math.PI}, 'angle'); Map.setCenter(37.44,0.58, 15);
การบิดเบือนรูปภาพ
การบิดรูปภาพให้ตรงกับรูปภาพอื่นทำได้ 2 วิธี ได้แก่ displace()
หรือ
register()
อัลกอริทึม displace()
จะใช้รูปภาพการกระจัดที่มีแถบ dx
และ dy
เป็นแถบ 2 แถบแรก และบิดเบือนรูปภาพตามความเหมาะสม รูปภาพเอาต์พุตจะเป็นผลจากการบิดเบือนแถบของรูปภาพอินพุตตามออฟเซตที่มีอยู่ในรูปภาพการเปลี่ยนตำแหน่ง โดยใช้ค่าความคลาดเคลื่อนซึ่งคํานวณในตัวอย่างก่อนหน้า
เครื่องมือแก้ไขโค้ด (JavaScript)
// Use the computed displacement to register all original bands. var registered = image2Orig.displace(displacement); // Show the results of co-registering the images. var visParams = {bands: ['R', 'G', 'B'], max: 4000}; Map.addLayer(image1Orig, visParams, 'Reference'); Map.addLayer(image2Orig, visParams, 'Before Registration'); Map.addLayer(registered, visParams, 'After Registration');
หากไม่ต้องการแถบการเปลี่ยนตำแหน่ง Earth Engine มีregister()
วิธี ซึ่งใช้เป็นทางลัดในการเรียก displacement()
ตามด้วย displace()
เช่น
เครื่องมือแก้ไขโค้ด (JavaScript)
var alsoRegistered = image2Orig.register({ referenceImage: image1Orig, maxOffset: 50.0, patchWidth: 100.0 }); Map.addLayer(alsoRegistered, visParams, 'Also Registered');
ในตัวอย่างนี้ ผลลัพธ์ของ register()
แตกต่างจากผลลัพธ์ของ
displace()
เนื่องจากมีการใช้ชุดแถบที่แตกต่างกันใน 2 แนวทาง โดย register()
ใช้แถบทั้งหมดของรูปภาพอินพุตเสมอ ส่วนตัวอย่าง displacement()
ใช้เฉพาะแถบสีแดงก่อนที่จะส่งผลลัพธ์ไปยัง displace()
โปรดทราบว่าเมื่อใช้หลายย่านความถี่ หากความแปรปรวนของย่านความถี่แตกต่างกันมาก ก็อาจทำให้ย่านความถี่ที่มีความแปรปรวนสูงมีน้ำหนักมากเกินไป เนื่องจากย่านความถี่ได้รับการทำให้เป็นมาตรฐานร่วมกันเมื่อรวมคะแนนการเชื่อมโยงเชิงพื้นที่ ตัวอย่างนี้แสดงให้เห็นถึงความสำคัญของการเลือกย่านความถี่ที่คล้ายกันมากที่สุดเมื่อลงทะเบียน เช่นเดียวกับตัวอย่างก่อนหน้านี้ ให้ใช้ displacement()
และ
displace()
เพื่อควบคุมว่าจะใช้ย่านความถี่ใดในการคํานวณการกระจัด