אלגוריתם הרישום של התמונות ב-Earth Engine נועד לשמש כשלב סופי ברמת פירוט גבוהה למישור תמונות לאחר עיבוד אורתוגונלי. ההנחה היא שהתמונות שרוצים לרשום כבר עברו שלבי התאמה ראשוניים, כך שהן כבר בזווית סיבוב של כמה מעלות זו מזו, וההבדל ביניהן הוא רק בתרגומים קטנים. ברשמה נעשה שימוש בשיטת 'יריעת גומי', שמאפשרת לעוות את התמונה באופן מקומי כדי לתקן שגיאות של אורתורקטיבציה וארטיפקטים אחרים שנוצרו בתהליך העיבוד הקודם. טכניקת ההתאמה הבסיסית היא קורלציית תמונות, ולכן ההדגשים של תמונות הקלט והתמונות של העזרה צריכים להיות דומים מבחינה ויזואלית כדי שהאלגוריתם יוכל לחשב התאמה מדויקת.
העברה של תמונה
יש שני שלבים לרישום תמונה: קובעים את התמונה של ההזזה באמצעות displacement()
, ואז מחילים אותה באמצעות displace()
. הקלט הנדרש הוא זוג התמונות שרוצים לרשום ופרמטר של העברה מקסימלית (maxOffset
).
האלגוריתם displacement()
מקבל תמונה של עזר, פרמטר של העברה מקסימלית (maxOffset
) ושני פרמטרים אופציונליים שמשמשים לשינוי התנהגות האלגוריתם. הפלט הוא תמונה של העברה עם הפס dx
ו-dy
, שמציגים את הרכיבים X ו-Y (במטרים) של וקטור ההעברה בכל פיקסל.
כל הפסים של התמונות של מבצע הקריאה והתמונות של העזר משמשים להתאמה במהלך הרישום, ולכן מספר הפסים צריך להיות זהה לחלוטין. כדי שהרישום יצליח, פס ההזנה צריך להיות דומה מבחינה חזותית. אם לא, יכול להיות שאפשר לעבד אותם מראש (למשל, החלקה, זיהוי קצוות) כדי שהם ייראו דומים יותר. חישובי הרישום מתבצעים באמצעות תהליך רב-רמות, גס-לדק, עם תחזיות עבודה (רב-רמות) שתלויות בשלושה מהתחזיות שסופקו לאלגוריתם:
- הקרנת ברירת המחדל של התמונה של מבצע הקריאה (Pc)
- הקרנה שמוגדרת כברירת מחדל של תמונת העזר (Pr)
- היטל הפלט (Po)
כדי לצמצם את החישובים, הקרנה עבודה ברזולוציה הגבוהה ביותר (Pw) תהיה ב-CRS של Pr, בקנה מידה שנקבע לפי הרזולוציה הגסה ביותר מבין 3 הקרנות האלה. לאחר מכן מתבצעת דגימה מחדש של התוצאות מ-Pr כדי שהן יהיו באותה הקרנה שצוינה בפרמטר הקלט 'projection'.
הפלט הוא תמונה של העברה עם הפסים הבאים:
dx
- במיקום פיקסל נתון בתמונה של העזר, ההרצועה הזו מכילה את המרחק בכיוון X שצריך לעבור כדי להגיע למיקום התואם בתמונה הקוראת. היחידות הן מטרים גיאודיים.
dy
- במיקום פיקסל נתון בתמונה לדוגמה, ההרצועה הזו מכילה את המרחק בכיוון Y שצריך לעבור כדי להגיע למיקום התואם בתמונה הקוראת. היחידות הן מטרים גיאודיים.
confidence
- זוהי הערכה של רמת האמינות להזזה לפי פיקסל (כאשר 0 הוא רמת אמינות נמוכה ו-1 הוא רמת אמינות גבוהה) על סמך ציוני המתאם באזורים שבהם נמצאו התאמות תקינות. באזורים שבהם לא נמצאו התאמות, רמת האמון משוערת על סמך קורלציות בסביבה באמצעות גרעין גאוסיאני, כדי לתת משקל גבוה יותר לקורלציות בסביבה.
בדוגמה הבאה מחושב הערך המוחלט והזווית של ההזזה בין שתי תמונות Terra Bella ברזולוציה גבוהה:
Code Editor (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);
עיוות תמונה
יש שתי דרכים לעוות תמונה כך שתתאים לתמונה אחרת: displace()
או
register()
. האלגוריתם displace()
מקבל תמונה של העברה (displacement) עם שתי הרצועות הראשונות dx
ו-dy
, ומעקם את התמונה בהתאם. התמונה בתפוקה תהיה תוצאה של עיוותו של פסגות התמונה בקלט לפי הזזות שמופיעות בתמונה עם הזזת הפיקסלים. באמצעות ההזזות שחושבו בדוגמה הקודמת:
Code Editor (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');
אם אתם לא צריכים את פס ההזזה, תוכלו להשתמש ב-method register()
ב-Earth Engine. זוהי קיצור דרך לקריאה ל-displacement()
ואז ל-displace()
. לדוגמה:
Code Editor (JavaScript)
var alsoRegistered = image2Orig.register({ referenceImage: image1Orig, maxOffset: 50.0, patchWidth: 100.0 }); Map.addLayer(alsoRegistered, visParams, 'Also Registered');
בדוגמה הזו, התוצאות של register()
שונות מהתוצאות של displace()
. הסיבה לכך היא שבשתי הגישות נעשה שימוש בקבוצות שונות של פסגות: ב-register()
תמיד נעשה שימוש בכל הפסגות של תמונות הקלט, ואילו בדוגמה displacement()
נעשה שימוש רק בפסגה האדומה לפני שהתוצאה הוזנה ל-displace()
. חשוב לזכור שכאשר משתמשים בכמה פסגות, אם השונות שלהן שונה מאוד, יכול להיות שהפסגות עם השונות הגבוהה יקבלו משקל גבוה מדי, כי הפסגות מתכווננות יחד כשמצרפים את ציוני המתאם המרחבי שלהן. הדוגמה הזו ממחישה את החשיבות של בחירת הלהקות שהכי דומות מבחינה ויזואלית בזמן הרישום. בדומה לדוגמה הקודמת, משתמשים ב-displacement()
וב-displace()
כדי לקבוע אילו פסים ישמשו לחישוב ההזזה.