FFT per il rilevamento della linea


8

Sto cercando di usare la FFT in un modo diverso da quello che la maggior parte delle persone chiede. Voglio essere in grado di scattare una foto di un grafico con linee verticali che si ripetono regolarmente e di elaborare l'immagine per determinare la distanza media tra le linee dei pixel. Ho provato il rilevamento intelligente del bordo e il rilevamento della linea hough e non credo di poter ottimizzare le immagini abbastanza da rilevare accuratamente solo le linee che mi interessano.

Quindi, il mio tentativo è di scansionare 10 righe dell'immagine e di accumulare i valori dei pixel in bin corrispondenti alla colonna di pixel. Ciò che risulta quando si rappresenta graficamente è una forma d'onda che appare molto bene. Quando eseguo un DFT o FFT su questo, posso trovare un picco che credo dovrebbe essere la frequenza della ripetizione della linea. (Questo può essere un presupposto errato)

La mia domanda è: a cosa corrisponde questo numero? cioè penso di essere confuso con quale sarebbe la mia frequenza di campionamento perché è in pixel. Penso che questo sia un uso valido della FFT, ma sto cadendo proprio qui nel momento in cui penso che dovrei avere successo.

Come esempio. Ho creato un'immagine con una larghezza di 300 pixel. Sono presenti linee di larghezza di 1 pixel disegnate a intervalli di 30 pixel esatti. Ho trovato 2 picchi, uno a 75 e uno a 225 (che sembrano simmetrici) per il componente reale. (Non credo che dovrebbe giocare il componente immaginario ??) So che le linee sono distanti 30 pixel. Come si collegano 75 e o 225?

Sto davvero cercando di ottenere questo risultato e sono grato per qualsiasi aiuto tu possa consigliare. A questo punto, sto rinunciando al rilevamento dei bordi e voglio provare questo approccio.

Grazie in anticipo.

image  opencv  fft  dft 

Grazie mille per le vostre risposte! La FFT non sembra funzionare. Come aggiungerei il componente immaginario? Il programma che uso (stat plus) sputa semplicemente una colonna di numeri reali e immaginari. Stavo tramando il reale sull'asse x, ma sono sicuro che esiste un modo migliore per includere numeri immaginari. Inoltre, ho intrapreso la strada dell'autocorrelazione e ho ottenuto un risultato! dolce !, ma solleva sempre più domande. Il risultato che ottengo è il doppio della dimensione dell'immagine (comprensibilmente), che ha oscillazioni molto più pulite vicino al centro. C'è qualche rima o motivo per

Risposte:


6

Potresti provare a provare l' autocorrelazione per questo. Ecco una risposta SO che descrive come eseguire l'autocorrelazione con Matlab utilizzando FFT. Questo potrebbe essere esteso per due dimensioni.

Ho implementato il tuo test case in modo intorpidito come segue:

a = np.zeros(300)
a[::30] = 1
plt.acorr(a, maxlags=50)

Questo dà la seguente trama:

inserisci qui la descrizione dell'immagine

Come puoi vedere, i picchi si aprono a +/- 30.


4

Se nell'immagine sono presenti 10 linee verticali, un FFT di una linea di scansione completamente orizzontale (300 pixel) dovrebbe mostrare un contenuto di grandezza attorno al cestino 10 o al cestino 11. Il cestino 75 su 300 indicherebbe che succede qualcosa ogni 4 pixel, oppure così.

Devi davvero guardare all'entità del risultato FFT, non solo al componente "reale" (in realtà il componente pari) perché, se le tue linee della griglia sono decentrate, il contenuto spettrale potrebbe apparire come strano (quindi "immaginario" nel risultato FFT).

Dato un reale input per un FFT, i risultati bin superiori a N / 2 (sopra 150 nel tuo caso) contengono solo ripetizioni degli stessi dati tranne il coniugato complesso. Quindi puoi ignorarli.


0

Non ho molta idea, ma per fare il FFT visivamente intuitivo, potresti provare a centrare il FFT (moltiplicando ciascun valore in FFT di (-1)(X+y)). Una volta fatto questo, il tuo componente DC appare al centro, con il tuttoFFT essendo simmetrico attorno ad esso.

Non ne sono molto sicuro, ma qualcosa mi dice che la distanza (in pixel) tra il picco e il centro indicherebbe quindi la periodicità. Una volta che hai la periodicità, puoi facilmente arrivare alla distanza tra ogni oggetto.

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.