Mám potíže s identifikací frekvenčních složek obrázku,
Zde jsem jednoduše vygeneroval 256×256 binární- obrázek.
a = [zeros(256,128) ones(256,128)]; imshow(a);
Pořízení obrázku FFT a posunutí nulová frekvence do středu,
f = fft2(a) shft = fftshift(f); imshow(log(shft)) %stretching
bude výsledkem,
Jak zjistím, kolik frekvenčních složek existuje a jaké jsou tyto frekvence?
Také když vypočítám FFT libovolné 1-D sekvence a vykreslím tu sekvenci určité hodnoty záporné, co to znamená? Jak by mohly existovat záporné frekvence?
Komentáře
- Související (možný duplikát): dsp. stackexchange.com/q/1637/77
- Jedním z nejlepších způsobů, jak pochopit, co transformace dělá, je experimentovat s inverzní transformací. Nakreslete tečku a poté ji inverzně transformujte, abyste viděli vlny, které vytváří. Pak zkuste tečku na jiném místě, pak čáru atd. Pokud jde o záporné frekvence, přečtěte si dsp.stackexchange.com/q/431/29
odpověď
jak mohou existovat záporné frekvence?
FFT koeficienty nejsou frekvence, ale komplexní amplitudy. Modul koeficientu označuje amplitudu, argument koeficientu označuje fázi.
Všimněte si, že byste měli dostávat varování nebo chybové zprávy od Matlabu pro výpočet log(shft)
, protože shft je složitá matice, výsledek není skutečný a nelze jej vykreslit jako obrázek.
Komentáře
- Vše, co říkáte je pravda, ale je to také vedlejší otázka. Polovinu koeficientů lze interpretovat tak, aby odpovídala záporným frekvencím.
Odpověď
Můj první návrh je, že vy porozumět FFT v 1 dimenzi, než se pokusíte interpretovat výsledky ve 2D.
Diskrétní Fourierova transformace (FFT je implementací DFT) je komplexní transformace: transformuje mezi 2 vektory komplexní vektory velikosti N.
Takže v případě 1D získáte nejen záporné hodnoty, ale obecně složité hodnoty.
Totéž platí pro 2D. Funkce imshow pravděpodobně přebírá skutečnou část komplexní matice (v dokumentaci imshow to není jasné).
Odpověď
Chybí vám příkaz abs
.
Zkuste následující:
f = fft2(a) shft = fftshift(abs(f)); imshow(log(shft)) %stretching