Jeg har problemer med å identifisere frekvenskomponentene til et bilde,
Her genererte jeg ganske enkelt, 256×256 binær- bilde.
a = [zeros(256,128) ones(256,128)]; imshow(a);
Tar bildet FFT og skifter Nullfrekvensen til sentrum,
f = fft2(a) shft = fftshift(f); imshow(log(shft)) %stretching
vil resultere,
Hvordan identifiserer jeg hvor mange frekvenskomponenter som er og hva er disse frekvensene?
Også hvis jeg beregner FFT av en hvilken som helst 1-D-sekvens og plotter den sekvensen det er visse verdier på negative, hva betyr det? Hvordan kan det være negative frekvenser?
Kommentarer
- Relatert (mulig duplikat): dsp. stackexchange.com/q/1637/77
- En av de beste måtene å forstå hva en transformasjon gjør er å eksperimentere med invers transformasjonen. Tegn en prikk og transformer den deretter omvendt for å se bølgene den produserer. Prøv deretter en prikk et annet sted, deretter en linje osv. Når det gjelder negative frekvenser, se dsp.stackexchange.com/q/431/29
Svar
hvordan det kan være negative frekvenser?
FFT-koeffisientene er ikke frekvenser, men komplekse amplituder. Koeffisientens modul indikerer amplituden, argumentet til koeffisienten indikerer fasen.
Merk at du skulle få en advarsel eller feilmelding fra Matlab for beregning av log(shft)
, siden shft er en kompleks matrise, er resultatet ikke et reelt og kan ikke tegnes som et bilde.
Kommentarer
- Alt du sier er sant, men det er også sidesteggende spørsmålet. Halvparten av koeffisientene kan tolkes slik at de tilsvarer negative frekvenser.
Svar
Mitt første forslag er at du forstå FFT i 1 dimensjon før du prøver å tolke resultatene i 2D.
The Discrete Fourier Transform (FFT er en implementering av DFT) er en kompleks transformasjon: den transformerer mellom 2 vektorer komplekse vektorer av størrelse N.
Så i 1D-tilfellet får du ikke bare negative verdier, men komplekse verdier generelt.
Det samme gjelder i 2D. Imshow-funksjonen tar sannsynligvis den virkelige delen av den komplekse matrisen (det er ikke klart i imshow-dokumentasjonen).
Svar
Du mangler kommandoen abs
.
Prøv følgende:
f = fft2(a) shft = fftshift(abs(f)); imshow(log(shft)) %stretching