Jeg har problemer med at identificere frekvenskomponenterne i et billede,
Her genererede jeg simpelthen, 256×256 binær- billede.
a = [zeros(256,128) ones(256,128)]; imshow(a);
Tager billedet FFT og skifter Nulfrekvensen til midten,
f = fft2(a) shft = fftshift(f); imshow(log(shft)) %stretching
vil resultere,
Hvordan identificerer jeg, hvor mange frekvenskomponenter der er, og hvad er disse frekvenser?
Også hvis jeg beregner FFT for en hvilken som helst 1-D-sekvens og plotter den sekvens der er visse værdier på negativ, hvad betyder det? Hvordan kunne der være negative frekvenser?
Kommentarer
- Relateret (mulig duplikat): dsp. stackexchange.com/q/1637/77
- En af de bedste måder at forstå, hvad en transformation gør, er at eksperimentere med den inverse transformation. Tegn en prik, og transformer den derefter omvendt for at se de bølger, den producerer. Prøv derefter en prik et andet sted, så en linje osv. Hvad angår negative frekvenser, se dsp.stackexchange.com/q/431/29
Svar
hvordan der kunne være negative frekvenser?
FFT-koefficienterne er ikke frekvenser, men komplekse amplituder. Koefficientmodulet angiver amplituden, argumentet for koefficienten angiver fasen.
Bemærk, at du skulle få en advarsel eller fejlmeddelelse fra Matlab til beregning af log(shft)
, da shft er en kompleks matrix, er resultatet ikke et reelt og kan ikke plottes som et billede.
Kommentarer
- Alt hvad du siger er sandt, men det sidelænser også spørgsmålet. Halvdelen af koefficienterne kan fortolkes til at svare til negative frekvenser.
Svar
Mit første forslag er, at du forstå FFT i 1 dimension, før du prøver at fortolke resultater i 2D.
Den diskrete Fourier-transformation (FFT er en implementering af DFT) er en kompleks transformation: den transformerer mellem 2 vektorer komplekse vektorer af størrelse N.
Så i 1D-tilfælde får du ikke kun negative værdier, men komplekse værdier generelt.
Det samme gælder i 2D. Imshow-funktionen tager sandsynligvis den reelle del af den komplekse matrix (det er ikke klart i imshow-dokumentationen).
Svar
Du mangler kommandoen abs
.
Prøv følgende:
f = fft2(a) shft = fftshift(abs(f)); imshow(log(shft)) %stretching