Mam problem z identyfikacją składników częstotliwości obrazu,
Tutaj po prostu wygenerowałem binarny plik 256×256- obraz.
a = [zeros(256,128) ones(256,128)]; imshow(a);
Wykonywanie obrazu FFT i przesuwanie częstotliwość zerowa do środka,
f = fft2(a) shft = fftshift(f); imshow(log(shft)) %stretching
spowoduje,
Jak mogę zidentyfikować, ile jest składowych częstotliwości i jakie są te częstotliwości?
Również jeśli obliczę FFT dowolnej sekwencji 1-D i wykreślę tę sekwencję pewne wartości na minusie, co to oznacza? Jak mogą występować ujemne częstotliwości?
Komentarze
- Powiązane (możliwy duplikat): dsp. stackexchange.com/q/1637/77
- Jednym z najlepszych sposobów zrozumienia działania transformacji jest eksperymentowanie z transformacją odwrotną . Narysuj kropkę, a następnie odwróć ją, aby zobaczyć wytwarzane przez nią fale. Następnie wypróbuj kropkę w innym miejscu, potem linię itd. Jeśli chodzi o częstotliwości ujemne, zobacz dsp.stackexchange.com/q/431/29
Odpowiedź
jak mogą występować częstotliwości ujemne?
Współczynniki FFT nie są częstotliwościami, ale złożonymi amplitudami. Moduł współczynnika wskazuje amplitudę, argument współczynnika wskazuje fazę.
Zauważ, że powinieneś otrzymać ostrzeżenie lub komunikat o błędzie z Matlab do obliczania log(shft)
, ponieważ shft jest złożoną macierzą, wynik nie jest rzeczywisty i nie może być wykreślony jako obraz.
Komentarze
- Wszystko, co powiesz jest prawdą, ale jest to również kwestia pominięcia. Połowę współczynników można zinterpretować jako odpowiadające częstotliwościom ujemnym.
Odpowiedź
Moja pierwsza sugestia jest taka, zrozumieć FFT w 1 wymiarze, zanim spróbujesz zinterpretować wyniki w 2D.
Dyskretna transformata Fouriera (FFT jest implementacją DFT) jest złożoną transformacją: przekształca między 2 wektorami złożonymi wektorami o rozmiarze N. p>
Zatem w przypadku 1D otrzymasz nie tylko wartości ujemne, ale ogólnie wartości złożone.
To samo dotyczy 2D. Funkcja imshow prawdopodobnie pobiera rzeczywistą część złożonej macierzy (nie jest to jasne w dokumentacji imshow).
Odpowiedź
Brakuje polecenia abs
.
Spróbuj wykonać następujące czynności:
f = fft2(a) shft = fftshift(abs(f)); imshow(log(shft)) %stretching