Đăng ký hình ảnh

Thuật toán đăng ký hình ảnh của Earth Engine được thiết kế để trở thành bước cuối cùng, sau khi chỉnh sửa hình ảnh theo phương pháp trực quan và chi tiết trong quá trình căn chỉnh hình ảnh. Giả sử rằng các hình ảnh cần đăng ký đã trải qua các giai đoạn căn chỉnh ban đầu, vì vậy, các hình ảnh này đã nằm trong phạm vi xoay vài độ so với nhau và chỉ khác nhau về các phép dịch nhỏ. Quy trình đăng ký sử dụng kỹ thuật "tấm cao su", cho phép làm cong hình ảnh cục bộ để khắc phục lỗi chỉnh sửa hình ảnh và các cấu phần phần mềm khác từ quá trình xử lý trước đó. Kỹ thuật căn chỉnh cơ bản là tương quan hình ảnh, vì vậy, các dải cho hình ảnh đầu vào và hình ảnh đối chiếu phải tương tự nhau về mặt hình ảnh để thuật toán có thể tính toán được độ căn chỉnh chính xác.

Độ dịch chuyển hình ảnh

Có hai bước để đăng ký hình ảnh: Xác định hình ảnh dịch chuyển bằng displacement(), sau đó áp dụng hình ảnh đó bằng displace(). Dữ liệu đầu vào bắt buộc là cặp hình ảnh cần đăng ký và tham số dịch chuyển tối đa (maxOffset).

Thuật toán displacement() lấy một hình ảnh tham chiếu, một tham số dịch chuyển tối đa (maxOffset) và hai tham số không bắt buộc để sửa đổi hành vi của thuật toán. Kết quả là một hình ảnh dịch chuyển có các dải dxdy cung cấp các thành phần X và Y (tính bằng mét) của vectơ dịch chuyển tại mỗi pixel.

Tất cả các dải của hình ảnh gọi và hình ảnh đối chiếu được dùng để so khớp trong quá trình đăng ký, vì vậy, số lượng dải phải bằng nhau. Các dải đầu vào phải tương tự nhau về mặt hình ảnh để quá trình đăng ký thành công. Nếu không, bạn có thể xử lý trước các hình ảnh đó (ví dụ: làm mượt, phát hiện cạnh) để các hình ảnh đó trông giống nhau hơn. Các phép tính đăng ký được thực hiện bằng quy trình nhiều cấp, từ thô đến tinh, với các phép chiếu hoạt động (đa cấp) phụ thuộc vào 3 trong số các phép chiếu được cung cấp cho thuật toán:

  1. phép chiếu mặc định của hình ảnh gọi (Pc)
  2. phép chiếu mặc định của hình ảnh tham chiếu (Pr)
  3. phép chiếu đầu ra (Po)

Hình chiếu làm việc có độ phân giải cao nhất (Pw sẽ nằm trong CRS của Pr, theo tỷ lệ được xác định bằng độ phân giải thô nhất trong 3 hình chiếu này, để giảm thiểu việc tính toán. Sau đó, kết quả từ Pr được lấy mẫu lại để nằm trong phép chiếu do tham số đầu vào "projection" chỉ định.

Kết quả là một hình ảnh dịch chuyển có các dải sau:

dx
Đối với một vị trí pixel hình ảnh tham chiếu nhất định, dải này chứa khoảng cách theo hướng X mà bạn phải di chuyển để đến vị trí khớp trong hình ảnh gọi. Đơn vị là mét theo hình học geodesic.
dy
Đối với một vị trí pixel hình ảnh tham chiếu nhất định, dải này chứa khoảng cách theo hướng Y mà bạn phải di chuyển để đến vị trí khớp trong hình ảnh gọi. Đơn vị là mét theo hình học geodesic.
confidence
Đây là giá trị ước tính trên mỗi pixel về độ tin cậy của độ dịch chuyển (trong đó 0 là độ tin cậy thấp và 1 là độ tin cậy cao) dựa trên điểm tương quan trong các vùng tìm thấy kết quả trùng khớp hợp lệ. Trong các khu vực không tìm thấy kết quả trùng khớp, độ tin cậy được ước tính từ các mối tương quan lân cận bằng cách sử dụng hạt nhân Gaussian để cung cấp trọng số cao hơn cho các mối tương quan lân cận.

Ví dụ sau đây tính toán độ lớn và góc dịch chuyển giữa hai hình ảnh Terra Bella có độ phân giải cao:

Trình soạn thảo mã (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);

Cong vênh hình ảnh

Có hai cách để bóp méo hình ảnh sao cho khớp với hình ảnh khác: displace() hoặc register(). Thuật toán displace() lấy một hình ảnh dịch chuyển có các dải dxdy làm hai dải đầu tiên, đồng thời làm cong hình ảnh cho phù hợp. Hình ảnh đầu ra sẽ là kết quả của việc bóp méo các dải của hình ảnh đầu vào theo độ dời có trong hình ảnh dịch chuyển. Sử dụng các độ dời được tính toán trong ví dụ trước:

Trình soạn thảo mã (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');

Nếu bạn không cần các dải dịch chuyển, Earth Engine sẽ cung cấp phương thức register(). Đây là lối tắt để gọi displacement(), theo sau là displace(). Ví dụ:

Trình soạn thảo mã (JavaScript)

var alsoRegistered = image2Orig.register({
  referenceImage: image1Orig,
  maxOffset: 50.0,
  patchWidth: 100.0
});
Map.addLayer(alsoRegistered, visParams, 'Also Registered');

Trong ví dụ này, kết quả của register() khác với kết quả của displace(). Điều này là do hai phương pháp sử dụng các dải tần số khác nhau: register() luôn sử dụng tất cả dải tần số của hình ảnh đầu vào, trong khi ví dụ về displacement() chỉ sử dụng dải tần số màu đỏ trước khi đưa kết quả vào displace(). Xin lưu ý rằng khi sử dụng nhiều dải tần, nếu độ biến thiên của dải tần rất khác nhau, thì điều này có thể làm tăng trọng số của các dải tần có độ biến thiên cao, vì các dải tần được chuẩn hoá chung khi kết hợp điểm số tương quan không gian của các dải tần đó. Điều này minh hoạ tầm quan trọng của việc chọn(các) dải tần có hình ảnh tương tự nhất khi đăng ký. Như trong ví dụ trước, hãy sử dụng displacement()displace() để kiểm soát các dải tần số được dùng để tính toán độ dịch chuyển.