2012-11-15 15 views
6

Mam obraz, który chcę przekształcić do domeny częstotliwości za pomocą FFT, wydaje się, że brakuje w tym bibliotek dla Javy, ale znalazłem dwa. Jednym z nich jest JTransforms, a drugi jest mniej znany i nie ma nazwy.JTransforms FFT na obrazku

Z mniej znanych jednej 2D może mieć tylko długość dolinach potęgi dwójki, ale miał prosty w użyciu metod jak FastFourierTransform.fastFT(real, imaginary, true); z prawdziwym bycie tablica 2D podwaja pełnymi każdych wartości pikseli i część urojona jest 2D tablica o takim samym rozmiarze pełnym zer. Wartość logiczna zależy od transformacji do przodu lub do tyłu. To miało dla mnie sens i zadziałało, z wyjątkiem mocy dwóch wymagań, które zrujnowały jakąkolwiek transformację, którą zrobiłem (początkowo dodałem czarną przestrzeń wokół obrazu, aby dopasować ją do najbliższej potęgi dwóch), z czym walczę, pracuję nad tym, jak używać równoważnych metod dla JTransforms i doceniłby wszelkie wskazówki w tym zakresie. Powiem, co robię obecnie.

Wierzę, że odpowiednią klasą byłaby DoubleFFT_2D, jej konstruktor pobiera liczbę wierszy i kolumn, które zakładam, że będą szerokości i wysokości mojego obrazu. Ponieważ mój obraz nie ma części urojonych, myślę, że mogę użyć doubleFFT.realForwardFull(real);, który traktuje części wyobrażone jako zero i przekazuje rzeczywistą tablicę 2D pełną pikseli. Niestety to w ogóle nie działa. JavaDoc mówi: the input array must be of size rows*2*columns, with only the first rows*columns elements filled with real data. Nie widzę jednak, jak to jest związane z moim wizerunkiem i co powinienem zrobić, aby spełnić ten wymóg.

Przepraszam za długie i złe wyjaśnienie, jeśli potrzebne są dodatkowe informacje, chętnie go przedstawię.

JTransforms Biblioteka i Docs można znaleźć tutaj: https://sites.google.com/site/piotrwendykier/software/jtransforms

Odpowiedz

5

Szkoda dokumentacja dla JTransforms nie jest dostępna online inne niż skompresowanego download. Jest bardzo kompletny i pomocny, powinieneś to sprawdzić!

Aby odpowiedzieć na pytanie: DoubleFFT_2D.realForwardFull(double[][] a) pobiera tablicę liczb rzeczywistych (Twoje piksele). Jednak wynik FFT będzie miał dwie wartości wyjściowe dla każdej wartości wejściowej - rzeczywistej i urojonej części każdego przedziału częstotliwości. Dlatego twoja macierz wejściowa musi być dwa razy większa od rzeczywistej tablicy obrazów, z czego połowa jest pusta/wypełniona zerami.

Zauważ, że wszystkie funkcje FFT używać a nie tylko dla wejścia, ale również dla wyjścia - oznacza to wszelkie dane obrazu w nie zostaną utracone, więc to może być pożądane, aby skopiować do innej/większej tablicy tak!

Prostą i oczywistą poprawką do scenariusza będzie użycie zamiast tego DoubleFFT_2D.realForward(double[][] a). Ten tylko obliczy dodatnie widmo, ponieważ strona ujemna będzie dla niego symetryczna. Dzieje się tak dlatego, że twoje wartości wejściowe są prawdziwe.

również sprawdzić klasę RealFFTUtils_2D w JTransforms, które sprawiają, że dużo łatwiej jest odzyskać swoje wyniki z tablicy później :)

+0

Faktycznie, wydaje się, że (nowsze) docs są obecnie online w github : http://wendykierp.github.io/JTransforms/apidocs/ –