5.31. Podudaranje pomaka

Podudaranje predloška odgovara na pitanje gdje se ovaj isječak nalazi unutar sličice; ocjenjivanje sličnosti odgovara na pitanje koliko su ove dvije slike sveukupno slične. Između njih stoji drukčije pitanje: dvije sličice prikazuju istu scenu, ali se kamera (ili scena) pomaknula između njih – za koliko? To je problem pomaka, a modul image ga rješava jednom metodom fazne korelacije.

5.31.1. Pomak faznom korelacijom

find_displacement() procjenjuje kruto poravnanje između dvije slike jednake veličine koristeći faznu korelaciju – metodu u frekvencijskoj domeni koja pokreće brzu Fourierovu transformaciju (FFT) na svakoj slici, unakrsno korelira njihove faze i locira vrhunac u rezultatu. Položaj vrhunca je translacija koja poravnava dvije slike:

d = img.find_displacement(template)

print("shift:", d.x_translation, d.y_translation,
      " response:", d.response)

Vraćeni Displacement nosi x_translation i y_translation – pomak u pikselima po svakoj osi – te response, ocjenu pouzdanosti od 0.0 do 1.0 gdje je 1.0 savršen vrhunac. Filtriranje detekcija ispod response > 0.3 odbacuje lažne rezultate u kojima fazna korelacija nikad nije pronašla čist vrhunac.

I rotation i scale u zadanom su načinu rada 0.0 odnosno 1.0; poprimaju stvarne vrijednosti samo kada je logpolar=True (vidi dolje).

Metoda nosi dva praktična ograničenja. Prvo su dimenzije koje su potencije broja dva: FFT u srcu fazne korelacije najbrži je – a na kameri i jedino potpuno podržan – pri veličinama poput 32 puta 32, 64 puta 64 i 128 puta 128. Najčišća je postava snimati izravno u jednoj od tih veličina, prosljeđivanjem razlučivosti metodi framesize() kao n-torke:

csi0.framesize((64, 64))

Aplikacija kojoj je potreban pomak iz veće sličice umjesto toga izrezuje isječak veličine potencije broja dva iz područja do kojeg joj je stalo i pokreće algoritam podudaranja na njemu.

Drugo su ulazi jednake veličine: roi i template_roi moraju odabrati identične širine i visine, inače algoritam podudaranja odbija poziv. Dvije snimke iste kamere u istoj konfiguraciji to automatski zadovoljavaju; snimljena sličica uspoređena s učitanom referencom najprije zahtijeva da oba budu izrezana na isječke jednakih veličina koje su potencije broja dva.

5.31.2. Rotacija i mjerilo putem log-polarne transformacije

Zadani način rada pronalazi samo translaciju. Kada se dvije sličice razlikuju i u rotaciji oko odabranog središta ili u mjerilu oko istog središta, pokretanje fazne korelacije na log-polarnoj reprojekciji svake slike pretvara te parametre u translaciju u log-polarnom koordinatnom sustavu – koju isti algoritam podudaranja faznom korelacijom može oporaviti:

d = img.find_displacement(template, logpolar=True)

print("rotation rad:", d.rotation,
      " scale:", d.scale,
      " response:", d.response)

Uz logpolar=True metoda pokreće isti cjevovod podudaranja nad log-polarno projiciranim slikama umjesto nad izvornicima. Polja rotation i scale rezultata vraćaju se popunjena: rotation je kut u radijanima između dvije sličice, scale je faktor mjerila između njih. x_translation i y_translation postaju besmisleni u ovom načinu rada (translacija duž log-polarnih osi ne odgovara linearnoj translaciji u izvoru).

Ključna riječ fix_rotation_scale=True pokriva međuslučaj: dvije se slike razlikuju i u translaciji i u rotaciji/mjerilu, a aplikaciji je potrebna samo translacija nakon ispravljanja rotacije i mjerila. Algoritam podudaranja najprije pokreće log-polarni prolaz da oporavi rotaciju i mjerilo, primjenjuje inverz na jednu od slika, a zatim pokreće prolaz translacije da oporavi preostali pomak. Zastavica ima smisla samo kada je logpolar=False – traži od algoritma podudaranja u načinu translacije da najprije ukloni rotaciju/mjerilo.

Uzorak iz Polarnih transformacija – kartezijski → polarni → podudaranje – ono je što find_displacement() uz logpolar=True radi u jednom pozivu. Aplikacija pri pokretanju pohranjuje referentni log-polarni isječak, snima i log-polarno transformira svaku sličicu uživo, a metoda oporavlja razliku u rotaciji i mjerilu između njih. Za aplikacije kojima je potreban pratitelj nepromjenjiv na rotaciju i mjerilo – robot za pristajanje čija se kamera naginje i zumira dok se približava cilju, stabilizirani gimbal koji treba znati kako se slika rotira u odnosu na referencu – ovo je standardna konstrukcija.

5.31.3. Klasična upotreba

Najčešća upotreba metode find_displacement() jest procjena pokreta iz sličice u sličicu u cjevovodu koji obrađuje kameru u pokretu. Kamera snima mali isječak veličine potencije broja 2 u sličici N, snima isječak iste veličine u sličici N+1, pokreće find_displacement() na njih dvije i očitava pomak u pikselima između njih. Pomak je procijenjeni pokret kamere (ili scene, ovisno o tome čiji referentni okvir je bitan) između dvije snimke, koristan za:

  • Osjetovanje u stilu optičkog toka – dron koji lebdi s kamerom usmjerenom prema dolje koristi pomak po sličici da procijeni svoj bočni pokret i vrati ga natrag u upravljač leta.

  • Stabilizaciju slike – pomak između uzastopnih sličica oduzima se od snimljene slike prije nego što se ona zabilježi ili prenese, čime se proizvodi glađi videostream.

  • Poravnanje pri inspekciji – kamera za skeniranje koja se kreće duž transportne trake koristi pomak po sličici da registrira svaku sličicu u odnosu na sljedeću i izgradi spojeni prikaz cijelog dijela.

Svaka od tih aplikacija poprima isti oblik: snimi, pomakni, akumuliraj u tekuću procjenu, snimi ponovno.