Rejestracja obrazu na podstawie niezmiennej skali Log-Polar DFT

10

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:

Samo tłumaczenie działa

W przypadku logarytmiczno-polarnej transformacji najpierw przekształcam się w przestrzeń polarną:

I^(ρ,θ)=I(r+ρcos(2πθNθ),rρsin(2πθNθ))
gdzie I to oryginalny obraz, r to promień obrazu (połowa szerokości) i Nθ to liczba próbek w θkierunek. Następnie próbkuję z tego, aby przekształcić w logarytmiczną przestrzeń polarną:
I^log(ρ,θ)=I^(logb(ρ),θ)
gdzie b=(2r)Nρjak opisano w 1, tak że obejmuje całą przestrzeń polarną.

Oto przykładowe obrazy w przestrzeni logarytmicznej z ρ=θ=256 (na wypadek, gdyby było coś rażąco złego):

Zaloguj się Polar

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):

Zaloguj Polar DFT

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.

Drew Cummins
źródło
1
Zrozumiałeś, co było nie tak?
Mr.WorshipMe
1
@ Mr.WorshipMe Niestety nie.
Drew Cummins,
@Drew Cummins, myślę, że było to spowodowane użytym obrazem testowym, ponieważ nastąpiło ostre przejście z tła. Co powiesz na inne obrazy testowe? Ponadto, z ostatniej figury, widoczne były różnice między dwiema wielkościami, dlatego lepiej jest wykonać odpowiednie wstępne przetwarzanie okienkowe przed DFT.
lxg
Kilka dni wcześniej znalazłem ten artykuł i próbowałem zaimplementować algorytm bez powodzenia. Zastanawiałem się, czy możesz podzielić się swoją implementacją z początkującym :)
Alexis España

Odpowiedzi:

1

Jeśli chcesz czegoś naprawdę solidnego, ale może to być bardziej kosztowne obliczeniowo, możesz sprawdzić algorytm, który tu zaimplementowałem . Implementuje artykuł „Solidna rejestracja obrazu za pomocą transformacji Log-Polar” ( pdf ). Ma również tę zaletę, że niezmiennie rotuje, oprócz translacji i niezmiennika skali. W mojej aplikacji (sztuce) było w stanie zarejestrować nawet podobne obrazy, a nie tylko przekształcone wersje tego samego obrazu.

użytkownik2348114
źródło
0

Myślę, że jest to spowodowane konkretnymi problemami z implementacją. Na przykład (1) lepiej jest wykonać wstępne przetwarzanie okienkowania przed DFT; (2) możesz sprawdzić funkcję Highpass () i możesz odnieść się do tej z papierowego równania Reddy Chatterji (23) - (24). Ponadto istnieje limit wartości skali i można wypróbować inne wartości skali.

lxg
źródło