Ho problemi a identificare i componenti di frequenza di unimmagine,
Qui ho semplicemente generato, 256×256 binario- immagine.
a = [zeros(256,128) ones(256,128)]; imshow(a);
Prendendo limmagine FFT e spostandola la frequenza zero al centro,
f = fft2(a) shft = fftshift(f); imshow(log(shft)) %stretching
risulterà,
Come faccio a identificare quante componenti di frequenza ci sono e quali sono quelle frequenze?
Anche se calcolo FFT di qualsiasi sequenza 1-D e tracciato quella sequenza ci sono certi valori su negativo, cosa significa? Come potrebbero esserci frequenze negative?
Commenti
- Correlati (possibile duplicato): dsp. stackexchange.com/q/1637/77
- Uno dei modi migliori per capire cosa fa una trasformazione è sperimentare con la trasformazione inversa . Disegna un punto e poi trasformalo in senso inverso per vedere le onde che produce. Quindi prova un punto in un punto diverso, quindi una linea, ecc. Per quanto riguarda le frequenze negative, vedi dsp.stackexchange.com/q/431/29
Risposta
come potrebbero esserci frequenze negative?
I coefficienti FFT non sono frequenze, ma ampiezze complesse. Il modulo del coefficiente indica lampiezza, largomento del coefficiente indica la fase.
Nota che dovresti ricevere un messaggio di avviso o di errore da Matlab per il calcolo log(shft)
, poiché shft è una matrice complessa, il risultato non è reale e non può essere tracciato come immagine.
Commenti
- Tutto ciò che dici è vero, ma va anche dallaltra parte della questione. La metà dei coefficienti può essere interpretata in modo che corrisponda a frequenze negative.
Risposta
Il mio primo suggerimento è che tu comprendere FFT in 1 dimensione prima di provare a interpretare i risultati in 2D.
La trasformata discreta di Fourier (FFT è unimplementazione di DFT) è una trasformata complessa: trasforma tra 2 vettori vettori complessi di dimensione N.
Quindi, nel caso 1D, non otterrai solo valori negativi, ma valori complessi in generale.
Lo stesso vale in 2D. La funzione imshow sta probabilmente prendendo la parte reale della matrice complessa (non è chiaro nella documentazione di imshow).
Answer
Ti manca il comando abs
.
Prova quanto segue:
f = fft2(a) shft = fftshift(abs(f)); imshow(log(shft)) %stretching