Earth Engine の画像登録アルゴリズムは、画像の調整における最終的なオルソ後精密なステップとして設計されています。登録する画像はすでに初期の調整段階を経ているため、互いに数度の回転以内で、わずかな変換しか異ならないことが前提とされます。登録では「ラバーシート」手法が使用され、ローカル画像の歪みにより、オルソ補正エラーや前処理によるその他のアーティファクトを修正できます。基盤となるアライメント手法は画像相関であるため、アルゴリズムが正確なアライメントを計算するには、入力画像と参照画像のバンドが視覚的に類似している必要があります。
画像のずれ
画像を登録するには、displacement()
を使用して変位画像を決定し、displace()
で適用するという 2 つの手順があります。必要な入力は、登録する画像のペアと最大変位パラメータ(maxOffset
)です。
displacement()
アルゴリズムは、参照画像、最大変位パラメータ(maxOffset
)、アルゴリズムの動作を変更する 2 つのオプション パラメータを受け取ります。出力は、各ピクセルの移動ベクトルの X 成分と Y 成分(メートル単位)を示すバンド dx
と dy
を含む変位画像です。
呼び出し元画像と参照画像のすべてのバンドが登録時のマッチングに使用されるため、バンドの数は完全に同じである必要があります。登録を成功させるには、入力バンドが視覚的に類似している必要があります。そうでない場合は、前処理(スムージング、エッジ検出など)を行うことで、より類似した画像にすることができます。登録計算は、マルチスケールの粗い順から細かい順のプロセスを使用して実行されます。このプロセスでは、アルゴリズムに提供される 3 つの投影に依存する(マルチスケールの)作業投影が使用されます。
- 呼び出し元の画像のデフォルト プロジェクション(Pc)
- 参照画像のデフォルトの投影(Pr)
- 出力投影(Po)
計算を最小限に抑えるために、解像度が最も高い作業用投影(Pw)は Pr の CRS に、これらの 3 つの投影の最も粗い解像度によって決定されるスケールで配置されます。Pr の結果は、入力の「projection」パラメータで指定された投影に再サンプリングされます。
出力は、次のバンドを含む変位画像です。
dx
- 特定の参照画像のピクセル位置について、このバンドには、呼び出し元の画像内の一致する位置に到達するために移動する必要がある X 方向の距離が含まれます。単位は測地学メートルです。
dy
- 特定の参照画像のピクセル位置に対して、このバンドには、呼び出し元の画像内の一致する位置に到達するために移動する必要がある Y 方向の距離が含まれます。単位は測地学メートルです。
confidence
- これは、有効な一致が見つかった領域の相関スコアに基づく、ピクセル単位の移動信頼度の推定値です(0 は低信頼度、1 は高信頼度)。一致が見つからなかった領域では、ガウス カーネルを使用して近接する相関から信頼度が推定され、近接する相関に高い重み付けが適用されます。
次の例では、2 つの高解像度 Terra Bella 画像間の変位の量と角度を計算します。
コードエディタ(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()
の 2 つの方法があります。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()
を使用して、変位の計算に使用するバンドを制御します。