Jag har problem med att identifiera frekvenskomponenterna i en bild,
Här genererade jag helt enkelt, 256×256 binär- bild.
a = [zeros(256,128) ones(256,128)]; imshow(a);
Ta bilden FFT och flytta Nollfrekvensen till mitten,
f = fft2(a) shft = fftshift(f); imshow(log(shft)) %stretching
kommer att resultera,
Hur identifierar jag hur många frekvenskomponenter som finns och vilka är dessa frekvenser?
Även om jag beräknar FFT för någon 1-D-sekvens och plottar den sekvensen som finns vissa värden på negativa, vad betyder det? Hur kan det finnas negativa frekvenser?
Kommentarer
- Relaterade (möjlig duplikat): dsp. stackexchange.com/q/1637/77
- Ett av de bästa sätten att förstå vad en transformation gör är att experimentera med inversen -transformen. Rita en punkt och förvandla den sedan omvänd för att se vågorna som den producerar. Testa sedan en punkt på en annan plats, sedan en rad osv. När det gäller negativa frekvenser, se dsp.stackexchange.com/q/431/29
Svar
hur det kan finnas negativa frekvenser?
FFT-koefficienterna är inte frekvenser utan komplexa amplituder. Koefficientmodulen indikerar amplituden, argumentet för koefficienten indikerar fasen.
Observera att du borde få ett varnings- eller felmeddelande från Matlab för att beräkna log(shft)
, eftersom shft är en komplex matris är resultatet inte riktigt och kan inte plottas som en bild.
Kommentarer
- Allt du säger är sant, men det är också en sidotrappning av frågan. Hälften av koefficienterna kan tolkas så att de motsvarar negativa frekvenser.
Svar
Mitt första förslag är att du förstå FFT i en dimension innan du försöker tolka resultat i 2D.
Discrete Fourier Transform (FFT är en implementering av DFT) är en komplex transform: den omvandlar mellan två vektorer komplexa vektorer av storlek N.
Så i 1D-fallet får du inte bara negativa värden utan också komplexa värden i allmänhet.
Detsamma gäller i 2D. Imshow-funktionen tar antagligen den verkliga delen av den komplexa matrisen (det är inte klart i imshow-dokumentationen).
Svar
Du saknar kommandot abs
.
Testa följande:
f = fft2(a) shft = fftshift(abs(f)); imshow(log(shft)) %stretching