Algorytm rejestracji obrazu w Earth Engine został zaprojektowany jako ostatni, dokładny krok dopasowywania obrazów po wykonaniu ortorektyfikacji. Zakładamy, że obrazy, które mają zostać zarejestrowane, przeszły już wstępne etapy wyrównywania, więc są już obrócone o kilka stopni względem siebie i różnią się tylko niewielkimi przesunięciami. Rejestracja wykorzystuje technikę „gumowego arkusza”, która umożliwia korygowanie lokalnego zniekształcenia obrazu w celu usunięcia błędów ortorektyfikacji i innych artefaktów powstałych podczas wcześniejszego przetwarzania. Podstawową techniką wyrównywania jest korelacja obrazu, więc pasma obrazów wejściowego i referencyjnego muszą być wizualnie podobne, aby algorytm mógł obliczyć dokładne wyrównanie.
Przemieszczenie obrazu
Rejestrowanie obrazu odbywa się w 2 etapach: określanie obrazu przesunięcia za pomocą funkcji displacement()
, a następnie zastosowanie go za pomocą funkcji displace()
. Wymagane
dane wejściowe to para obrazów do zarejestrowania oraz parametr maksymalnego przesunięcia (maxOffset
).
Algorytm displacement()
przyjmuje obraz referencyjny, parametr maksymalnego przesunięcia (maxOffset
) oraz 2 opcjonalne parametry, które modyfikują jego działanie. Wynikiem jest obraz przemieszczeń z pasmami dx
i dy
, które wskazują składowe X i Y (w metrach) wektora przemieszczeń w każdym pikselu.
Wszystkie pasma obrazów wywołującego i referencyjnego są używane do dopasowywania podczas rejestracji, więc liczba pasm musi być dokładnie taka sama. Aby rejestracja się powiodła, pasma wejściowe muszą być wizualnie podobne. Jeśli tak nie jest, można je wstępnie przetworzyć (np. wygładzić, wykryć krawędzie), aby były bardziej podobne. Obliczenia rejestracji są wykonywane za pomocą wieloskalowego procesu od ogólnego do szczegółowego z wieloskalowymi projekcjami roboczymi, które zależą od 3 projekcji podanych algorytmowi:
- domyślna projekcja obrazu dzwoniącego (Pc);
- domyślna projekcja obrazu odniesienia (Pr);
- rzut wyjściowy (Po);
Projekcja robocza o najwyższej rozdzielczości (Pw) będzie w układzie współrzędnych CRS Pr, w skali określonej przez najgrubszą rozdzielczość tych 3 projekcji, aby zminimalizować obliczenia. Wyniki z Pr są następnie ponownie próbkowane, aby uzyskać projekcję określoną przez parametr wejściowy „projection”.
Dane wyjściowe to obraz przemieszczeń z tymi pasmami:
dx
- W przypadku danej pozycji piksela obrazu odniesienia ten pas zawiera odległość w kierunku osi X, jaką należy pokonać, aby dotrzeć do odpowiadającej lokalizacji na obrazie wywołującym. Jednostki to metry geodezyjne.
dy
- W przypadku danego położenia piksela obrazu referencyjnego ten pas zawiera odległość w kierunku osi Y, jaką należy pokonać, aby dotrzeć do odpowiadającego miejsca na obrazie wywołania. Jednostki to metry geodezyjne.
confidence
- To szacowana wartość przemieszczeń na poziomie piksela (gdzie 0 oznacza niską ufność, a 1 – wysoką ufność) na podstawie wyników korelacji w regionach, w których znaleziono prawidłowe dopasowania. W regionach, w których nie znaleziono żadnych dopasowań, wskaźnik ufności jest szacowany na podstawie korelacji z najbliższymi regionami za pomocą jądra gaussowskiego, co zapewnia większą wagę korelacjom z najbliższymi regionami.
W tym przykładzie obliczamy wielkość i kąt przesunięcia między dwoma zdjęciami Terra Bella w wysokiej rozdzielczości:
// 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);
Przekształcanie obrazu
Obraz możesz zniekształcić, aby pasował do innego obrazu na 2 sposoby: displace()
lub register()
. Algorytm displace()
pobiera obraz przemieszczeń, który ma pasma dx
i dy
jako pierwsze 2 pasma, i odpowiednio zniekształca obraz. Obraz wyjściowy będzie wynikiem zniekształcenia pasm obrazu wejściowego o przesunięcia obecne w wymuszonym obrazie. Korzystając z przesunięcia obliczonego w poprzednim przykładzie:
// 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');
Jeśli nie potrzebujesz pasm przesunięcia, Earth Engine udostępnia metodę register()
, która jest skrótem wywołania metody displacement()
, po którym następuje displace()
. Na przykład:
var alsoRegistered = image2Orig.register({ referenceImage: image1Orig, maxOffset: 50.0, patchWidth: 100.0 }); Map.addLayer(alsoRegistered, visParams, 'Also Registered');
W tym przykładzie wyniki funkcji register()
różnią się od wyników funkcji displace()
. Dzieje się tak, ponieważ w obu podejściach użyto innego zestawu pasm: register()
zawsze używa wszystkich pasm obrazów wejściowych, a w przykładzie displacement()
przed przekazaniem wyniku do displace()
używane jest tylko pas czerwony. Pamiętaj, że jeśli używasz wielu pasm, a ich wariancje są bardzo różne, może to spowodować nadmierne obciążenie pasm o dużej zmienności, ponieważ są one wspólnie normalizowane podczas łączenia ich wyników korelacji przestrzennej. Pokazuje to, jak ważne jest wybranie pasm, które są wizualnie najbardziej podobne podczas rejestracji. Podobnie jak w poprzednim przykładzie, użyj parametrów displacement()
i displace()
, aby określić, które pasma mają być używane do obliczania przesunięcia.