Pracuję nad aplikacją do przetwarzania obrazu, która wykorzystuje dyskretną transformatę Fouriera do implementacji rozmycia / wyostrzania. Aplikacja działa mniej więcej tak, ale coś w mechanice nadal jest dla mnie mylące.
W szczególności odbywa się proces centrowania częstotliwości zerowych.
Przykład, który widziałem wstępnie przetwarza obraz wejściowy (o intensywności w skali szarości), mnożąc go przez macierz wielkości równą obrazowi wejściowemu, którego wartości to , gdzie jest rzędem, jest kolumna, a więc wzór na przemian i
Zgodnie z instrukcją, jest to równoznaczne z zamiana ćwiartki matrycy przez odwracanie przez i osi.
Rozumiem, dlaczego tak się dzieje i chciałbym podkreślić, że rozumiem, że mój kod / Fourier działa, po prostu nie rozumiem, dlaczego pomnożenie macierzy wejściowej przez 1 / -1 powoduje wyśrodkowanie komponentu zerowej częstotliwości wokół 0.
Dzięki
źródło
Odpowiedzi:
O! Co za fajna sztuczka! Działa z powodu twierdzenia o splotie (tj. Mnożenie w dziedzinie przestrzennej / czasowej jest równoważne splotowi w dziedzinie częstotliwości).
To nie jest przerzucanie całej i osi, to obraca obraz transformaty Fouriera (myślę o przeniesienie do połowy wokół cylindra). Sztuczka polega na tym, że naprzemienne -1, 1 w domenie przestrzennej jest sygnałem o najwyższej częstotliwości. Zatem transformata Fouriera tego obrazu jest pojedynczym punktem w dziedzinie częstotliwości. Splot o jeden punkt jest równoważny przesunięciu (obróceniu) obrazu o przesunięcie punktu względem częstotliwości zerowej.x y
Oto obraz testowy: . To transformata Fouriera wygląda następująco:
Zażycie transformaty Fouriera obrazu zmiennego ( ), to wyniki w jednym punkcie tuż przy centrum transformaty Fouriera: . (Przypomnijmy, że jeszcze nie wykonaliśmy rotacji, więc centrum transformacji Fouriera stanowią wysokie częstotliwości, a niskie częstotliwości są nadal na rogach.) Ale to jest „jądro rotacji!” Konwekcja z tym obrotem jądra przesuwa wszystko w dół i w prawo (ale rzeczy, które spadają z prawego dolnego rogu, obracają się w lewy górny róg).
Splatanie obrazu oryginalnego z jądrem rotacji (w domenie obrazu) daje: , podczas gdy splatanie transformaty Fouriera obrazu z jądrem rotacji (w dziedzinie częstotliwości) daje: .
I możemy sprawdzić, mnożąc testimage przez szachownicy w domenie obrazu daje , która ma transformacji Fouriera: .
źródło
fftshift
funkcji podobnej do? Czy to nie jest obliczeniowo tańsze, aby bezpośrednio przestawić 4 ćwiartki?fftshift
nie jest bardzo drogi, ale ta sztuczka może mieć lepsze zachowanie pamięci podręcznej. Mnożenie pikseli to tak naprawdę odwrócenie znaku co drugi piksel. Tak łatwe do wektoryzacji, zapis odczytu-modyfikacji-zapisu jest gwarantowanym trafieniem do pamięci podręcznej i procesor może łatwo pobrać odczyt.Odpowiedź Wandering Logic jest poprawna i szczegółowa. Pomyślałem, że chcesz zobaczyć matematykę zamiast zdjęć:
Jeśli spojrzymy na przypadek 1D, mnożymy dane wejściowe przez gdzie częstotliwość wynosi . To znaczy, mnożenie przesuwa widmo sygnału o połowę częstotliwości próbkowania.(−1)k=ejω ω 2π(k/2)
Skutkuje to tym, że częstotliwość zerowa - która wcześniej miała indeks 0 - jest teraz w połowie szerokości obrazu (lub wysokości, w zależności od tego, czy pomnożymy kolumny czy wiersze).
źródło