注册图片

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 图片之间的位移幅度和角度:

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() 算法会将以 dxdy 波段作为前两个波段的位移图像作为输入,并相应地扭曲该图像。输出图片是通过将输入图片的波段按位移图片中的偏移量进行扭曲而得出的。使用上例中计算的位移:

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');

如果您不需要位移带,Earth Engine 提供了 register() 方法,该方法是调用 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() 来控制用于计算位移的波段。