Próbuję dokonać rejestracji obrazu przy użyciu korelacji fazowej, jak opisano w artykule Reddy Chatterji . W moim przypadku obrazy mogą być skalowane i tłumaczone względem siebie.
Algorytm znajdowania skali względnej, tak jak ją rozumiem, jest (patrz: schemat blokowy z pracy ):
F1 = DFT(I1)
F2 = DFT(I2)
H1 = Highpass(F1)
H2 = Highpass(F2)
L1 = LogPolar(Magnitude(H1))
L2 = LogPolar(Magnitude(H2))
PC = PhaseCorrelate(L1,L2)
PM = norm(PC)
R = IDFT(PhaseCorr/PM)
P = Peak(R)
Scale = LogBase^P[1]
Skala daje mi pozornie bezsensowne wartości (bardzo różni się od obrazu do obrazu i nigdy nie są poprawne).
Ale ignorując skalę, to samo podejście korelacji fazowej działa dobrze w tłumaczeniu; i podejrzewam, że mam problem z moją transformacją logarytmiczno-biegunową. Oto przykład, w którym rozwiązałem tłumaczenie - lewy obraz jest oryginałem, a prawy został przycięty i przetłumaczony - rozwiązanie jest pokazane na orignalu:
W przypadku logarytmiczno-polarnej transformacji najpierw przekształcam się w przestrzeń polarną:
Oto przykładowe obrazy w przestrzeni logarytmicznej z (na wypadek, gdyby było coś rażąco złego):
Na koniec pokazuje to faktyczną transformację, przez którą przechodzą obrazy przed etapem korelacji faz (u góry znajduje się filtr po górnoprzepustowym wielkości DFT, u dołu jest w logarytmicznej przestrzeni polarnej):
Używam OpenCV, który ma metody LogPolar i PhaseCorrelate. Chociaż PhaseCorrelate, podobnie jak moja ręczna implementacja, daje mi poprawną odpowiedź na tłumaczenie, jest niepoprawna w skali. Ponieważ używanie OpenCV LogPolar lub mojego własnego nie wpływa na poprawność, muszę coś przeoczyć.
Każda pomoc będzie mile widziana.