Earth Engine 圖像註冊演算法是用於對齊圖像的最終、後製、精細步驟。假設要註冊的圖片已完成初步對齊階段,因此彼此之間的旋轉角度相差不大,且只有少許的位移差異。註冊程序會使用「橡皮擦」技術,讓局部圖片扭曲,以便修正正射校正錯誤和先前處理作業產生的其他偽影。基礎對齊技術是圖像相關性,因此輸入和參考圖片的頻帶必須在視覺上相似,演算法才能計算出正確的對齊結果。
圖片位移
註冊圖片有兩個步驟:使用 displacement()
判斷位移圖片,然後使用 displace()
套用圖片。必要的輸入內容是需要註冊的圖片組合,以及最大位移參數 (maxOffset
)。
displacement()
演算法會使用參考圖片、最大位移參數 (maxOffset
),以及兩個用於修改演算法行為的可選參數。輸出內容是位移圖片,其中包含 dx
和 dy
頻帶,可提供每個像素位移向量 X 和 Y 元件的長度 (以公尺為單位)。
呼叫和參考圖像的所有頻帶都會用於註冊期間的比對,因此頻帶數量必須完全相同。輸入頻帶必須在視覺上相似,註冊才會成功。如果不是,您可以對圖片進行預處理 (例如平滑、邊緣偵測),讓圖片看起來更相似。系統會使用多尺度從粗到細的程序執行註冊運算,其中 (多尺度) 工作投影會依據提供給演算法的三個投影來運作:
- 呼叫圖片的預設投影 (Pc)
- 參照圖片的預設投影方式 (Pr)
- 輸出投影 (Po)
最高解析度的工作投影 (Pw) 會採用 Pr 的 CRS,其比例會根據這 3 個投影的粗略解析度決定,以盡量減少運算。接著,系統會對 Pr 的結果進行重新取樣,以便在輸入的「projection」參數中指定投影。
輸出內容是具有下列頻帶的位移圖片:
dx
- 對於指定的參考圖像像素位置,此頻帶包含必須在 X 方向上移動的距離,才能在呼叫圖像中找到相符的位置。單位為大地測量單位公尺。
dy
- 對於指定的參考圖片像素位置,這個頻帶會包含必須沿 Y 方向移動的距離,才能在呼叫圖片中找到相符的位置。單位為大地測量單位公尺。
confidence
- 這是每個像素的位移信心度估計值 (0 代表低信心,1 代表高信心),根據找到有效比對區域的相關性分數計算而得。在未找到任何相符項目的區域中,系統會使用高斯核函數,根據附近的相關性估算可信度,為附近的相關性提供較高的權重。
以下範例會計算兩張高解析度 Terra Bella 圖像之間的位移大小和角度:
// 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()
演算法會將具有 dx
和 dy
頻帶的位移圖片做為前兩個頻帶,並據此扭曲圖片。輸出圖片是根據位移圖片中的偏移值,扭曲輸入圖片的頻帶所產生的結果。使用先前範例中計算的位移:
// 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()
的捷徑。例如:
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()
控管用於計算位移的頻帶。