Ho testato con successo l' algoritmo di correlazione della fase 1D per determinare lo spostamento verticale tra due immagini sintetiche.
Quando mi sono trasferito a immagini reali, tuttavia, non è in grado di rilevare affatto la traduzione (il picco si trova a 0, il che è un risultato errato).
Ho le seguenti immagini:
E correlazione di fase risultante (magnitudo, reale, immaginario):
La prima linea di scansione dell'immagine è completamente bianca, ma lo spostamento è ovviamente più grande (20 pixel).
Il risultato atteso è una linea bianca sulla 20a fila, che si verifica solo su immagini sintetiche o rumore chiaro.
Il mio algoritmo è molto semplice - per ogni colonna di immagine:
- Calcola 1D FT delle colonne dell'immagine sorgente e di destinazione (
a=FT(A)
,b=FT(B)
) - Calcola spettro di potenza incrociata (
cross_power = a *. conj(b) / |a *. conj(b)|
) -*.
indica la mutliplicazione puntuale,conj(x)
indica il coniugato complesso - Correlazione della fase di calcolo (
phase = IFT(cross_power)
) - Trova la massima magnitudine in ogni colonna di
phase
. - Trova la posizione di picco del consenso (ad es. Mediana delle posizioni di picco rilevate)
Potete per favore consigliarmi come migliorare l'algoritmo di correlazione della fase di base per gestire le immagini del mondo reale (rumorose)?
Dovrei piuttosto usare NCC (Normalized Cross Correlation) invece della correlazione di fase basata su FFT?
AGGIORNARE
Stavo sperimentando lo zero padding per escludere errori introdotti dallo spostamento circolare (è desiderabile solo un semplice spostamento lineare delle immagini) e ho testato questo su immagini originali da Wikipedia:
Il singolo picco è chiaramente lì come dovrebbe essere:
Tuttavia, se eseguo un leggero smussamento (sfocatura gaussiana) per ridurre il rumore e effettivamente migliorare il risultato, la correlazione di fase risulta totalmente distorta:
Ecco la versione migliorata - il picco originale è più debole (perché ??) e sono comparsi nuovi picchi attorno a zero turni (perché ??):