Correlazione di fase - Scarse prestazioni su immagini rumorose / sfocate?


9

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:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

E correlazione di fase risultante (magnitudo, reale, immaginario):

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

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:

  1. Calcola 1D FT delle colonne dell'immagine sorgente e di destinazione ( a=FT(A), b=FT(B))
  2. Calcola spettro di potenza incrociata ( cross_power = a *. conj(b) / |a *. conj(b)|) - *.indica la mutliplicazione puntuale, conj(x)indica il coniugato complesso
  3. Correlazione della fase di calcolo ( phase = IFT(cross_power))
  4. Trova la massima magnitudine in ogni colonna di phase.
  5. 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:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Il singolo picco è chiaramente lì come dovrebbe essere:

inserisci qui la descrizione dell'immagine

Tuttavia, se eseguo un leggero smussamento (sfocatura gaussiana) per ridurre il rumore e effettivamente migliorare il risultato, la correlazione di fase risulta totalmente distorta:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Ecco la versione migliorata - il picco originale è più debole (perché ??) e sono comparsi nuovi picchi attorno a zero turni (perché ??):

inserisci qui la descrizione dell'immagine


Come vedo, sull'immagine correlata alla fase il picco massimo mostra lo spostamento corrispondente. Tuttavia, non so quali siano le reali ampiezze di correlazione incrociata tra quelle immagini.
Eddy_Em

@Eddy_Em Genererò immagini separate per la parte reale e immaginaria e le aggiungerò al post tra un po '. Finora ci sono solo informazioni sulla grandezza.
Libor,

Il tuo riferimento in Wikipedia dice di usare trasformazioni di Fourier 2D. Perché stai usando le trasformazioni 1D?
Peter K.

1
Bene, sì, ma devi confrontare le mele con le mele. Il solo confronto delle stesse colonne in ogni immagine non ti darà ciò che desideri. Se il movimento è abbastanza grande, non c'è alcuna correlazione tra le colonne. Devi considerare l'immagine nel suo insieme. Un modo che potrebbe funzionare è quello di sommare le righe in entrambe le immagini e fare il lavoro 1D su quello.
Peter K.

1
@PeterK. Questo era 2D - ho verificato che la correlazione di fase è emersa come nell'articolo Wiki, solo capovolta (probabilmente a causa di moltiplicatori capovolti durante il calcolo dello spettro di potenza incrociata o input / output capovolto). Ho scoperto che il livellamento (finestra gaussiana) danneggia davvero il risultato finale, ma non sono sicuro del perché. Utilizzerò infine la correlazione incrociata normalizzata, poiché la correlazione di fase sembra essere debole quando si tratta di dati a bassa frequenza.
Libor,

Risposte:


10

Versione monodimensionale

La versione monodimensionale che elenchi non funzionerà. Quando si verifica uno spostamento abbastanza ampio delle immagini (più di uno o due pixel nelle immagini del mondo reale), non ci sarà nulla in relazione ai pixel della colonna.

Per un esempio di questo, prova:

I5 = rand(100,100)*255;
I6 = zeros(100,100);
I6(11:100,22:100) = I5(1:90,1:79);

In modo che abbiamo I5:

inserisci qui la descrizione dell'immagine

e I6:

inserisci qui la descrizione dell'immagine

Quindi la correlazione di fase monodimensionale è solo:

inserisci qui la descrizione dell'immagine

mentre la correlazione di fase bidimensionale è:

inserisci qui la descrizione dell'immagine

È un po 'difficile da vedere, ma c'è un picco molto alto nell'angolo in basso a destra dell'immagine. Non esiste un picco chiaro nella versione monodimensionale.

Perché il livellamento non aiuta? 1 #

Ciò che la correlazione sta cercando di fare è trovare variazioni "simili" in ogni immagine. Se i segnali sottostanti sono sufficientemente casuali, allora funzionerà bene: la correlazione del rumore bianco con se stesso fornisce un picco molto bello all'origine e vicino allo zero altrove.

Lisciare un'immagine "casuale" con un gaussiano avrà l'effetto di appianare la correlazione che ti aspetti --- diffondere l'energia in qualsiasi picco su un'area più ampia.

Il livellamento ha l' effetto opposto del "pre-sbiancamento" dell'immagine. Il pre-sbiancamento (come suggerisce il nome) cerca di rendere l'immagine più simile al rumore bianco --- che ha la forma migliore se stiamo eseguendo un rilevamento basato sulla correlazione (in quanto il picco è ben localizzato).

Quello che stai meglio facendo è usare l' diffoperazione matlab per un modo semplicistico, ma sorprendentemente efficace, di pre-sbiancamento delle immagini.

Vedi questo esempio

Perché il livellamento non aiuta? 2 #

Perché il livellamento causa picchi extra?

Se leviga ogni immagine con un kernel k(x,y) quindi otteniamo:

ha=gakhb=gbk
dove è convoluzione.

Adesso,

Ha=KGaHb=KGbR=HaHb|HaHb|=|K|2GaGb|K|2|GaGb|=GaGb|GaGb|

Ciò che sospetto stia accadendo (anche se non sono sicuro) è che forse il tuo kernel ha valori quasi zero nel dominio della frequenza, causando problemi numerici?

Se applico un kernel:

K = one(5,5);

alle mie immagini casuali, quindi ottengo:

inserisci qui la descrizione dell'immagine

per la correlazione bidimensionale, che rende il picco più esteso, ma non mostra i problemi che stai vedendo.


Ottima risposta, grazie! Il problema che ho è che il picco non è solo mal localizzato, ma appare in una posizione completamente sbagliata. Alla fine ho letto JPLewis: "Correlazione incrociata normalizzata rapida" che dice che la correlazione di fase ha problemi con l'energia dell'immagine variabile in posizioni diverse e quindi dovrebbe essere applicato un pre-filtro - viene proposto un filtro Laplaciano per lo sbiancamento del segnale sebbene qualsiasi filtro passa alto farebbe. Il problema rimane che la frequenza di taglio non è nota in anticipo e che la soglia troppo alta o troppo bassa danneggerà nuovamente la corrispondenza. Ma ci proverò.
Libor,

1
Off Topic: È divertente che la ricerca di Google per "sbiancamento del segnale" ti insegnerà molto sul dentifricio: D
Libor

2

Il modo più semplice per ottenere buone prestazioni dalla correlazione di fase imbiancando il segnale è di prendere il registro della grandezza. Puoi anche filtrare il rumore dalla superficie di correlazione risultante. Per i dettagli, consultare "Miglioramento della correlazione di fase per la registrazione delle immagini", Atti di (ICVNZ2011) Image and Vision Computing New Zealand 2011, p.488-493,, http://www98.griffith.edu.au/dspace/bitstream/handle/ 10072/44512 / 74188_1.pdf? sequence = 1

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.