註冊圖片

Earth Engine 圖像註冊演算法是用於對齊圖像的最終、後製、精細步驟。假設要註冊的圖片已完成初步對齊階段,因此彼此之間的旋轉角度相差不大,且只有少許的位移差異。註冊程序會使用「橡皮擦」技術,讓局部圖片扭曲,以便修正正射校正錯誤和先前處理作業產生的其他偽影。基礎對齊技術是圖像相關性,因此輸入和參考圖片的頻帶必須在視覺上相似,演算法才能計算出正確的對齊結果。

圖片位移

註冊圖片有兩個步驟:使用 displacement() 判斷位移圖片,然後使用 displace() 套用圖片。必要的輸入內容是需要註冊的圖片組合,以及最大位移參數 (maxOffset)。

displacement() 演算法會使用參考圖片、最大位移參數 (maxOffset),以及兩個用於修改演算法行為的可選參數。輸出內容是位移圖片,其中包含 dxdy 頻帶,可提供每個像素位移向量 X 和 Y 元件的長度 (以公尺為單位)。

呼叫和參考圖像的所有頻帶都會用於註冊期間的比對,因此頻帶數量必須完全相同。輸入頻帶必須在視覺上相似,註冊才會成功。如果不是,您可以對圖片進行預處理 (例如平滑、邊緣偵測),讓圖片看起來更相似。系統會使用多尺度從粗到細的程序執行註冊運算,其中 (多尺度) 工作投影會依據提供給演算法的三個投影來運作:

  1. 呼叫圖片的預設投影 (Pc)
  2. 參照圖片的預設投影方式 (Pr)
  3. 輸出投影 (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() 演算法會將具有 dxdy 頻帶的位移圖片做為前兩個頻帶,並據此扭曲圖片。輸出圖片是根據位移圖片中的偏移值,扭曲輸入圖片的頻帶所產生的結果。使用先前範例中計算的位移:

// 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() 控管用於計算位移的頻帶。