2012-11-15 11 views
6

Ho un'immagine che voglio trasformare nel dominio della frequenza usando FFT, sembra esserci una mancanza di librerie per questo per Java ma ne ho trovate due. Uno è JTransforms e l'altro era meno conosciuto e non ha un nome.JTransforms FFT on Image

Con il meno noto, il 2D poteva avere solo valori di lunghezza di potenze di due ma aveva metodi semplici da utilizzare come FastFourierTransform.fastFT(real, imaginary, true); con il reale essendo la matrice 2D di doppi pieni di ogni valore di pixel e la parte immaginaria essendo un 2D array della stessa dimensione piena di zeri. Il valore booleano dipende da una trasformazione diretta o inversa. Questo ha avuto senso per me e ha funzionato, tranne per il potere di due requisiti che hanno rovinato qualsiasi trasformazione che ho fatto (inizialmente ho aggiunto lo spazio nero attorno all'immagine per adattarlo alla potenza più vicina di due), quello a cui sto lottando è capire come utilizzare i metodi equivalenti per JTransforms e apprezzerebbe qualsiasi guida nel farlo. Dirò quello che sto facendo attualmente.

Credo che la classe rilevante sia DoubleFFT_2D, il suo costruttore prende un numero di righe e colonne che suppongo siano la larghezza e l'altezza della mia immagine. Poiché la mia immagine non ha parti immaginarie, penso di poter usare doubleFFT.realForwardFull(real);, che considera le parti immaginarie come zero e passa il vero array 2D pieno di pixel. Sfortunatamente questo non funziona affatto. Il JavaDoc afferma the input array must be of size rows*2*columns, with only the first rows*columns elements filled with real data Ma non vedo come questo sia collegato alla mia immagine e cosa dovrei fare per soddisfare questo requisito.

Siamo spiacenti per la lunga e scarsa spiegazione, se sono necessarie ulteriori informazioni sarei felice di fornirlo.

JTransforms Biblioteca e Documenti possono essere trovate qui: https://sites.google.com/site/piotrwendykier/software/jtransforms

risposta

5

Peccato la documentazione per JTransforms non è disponibile on-line diverso da una zip download. È molto completo e utile, dovresti verificarlo!

Per rispondere alla tua domanda: DoubleFFT_2D.realForwardFull(double[][] a) accetta una serie di numeri reali (i tuoi pixel). Tuttavia, il risultato della FFT avrà due valori di uscita per ciascun valore di input: una parte reale e quella immaginaria di ciascun scomparto di frequenza. Questo è il motivo per cui l'array di input deve essere due volte più grande dell'array di immagini effettivo, con metà vuoto/pieno di zeri.

Si noti che tutte le funzioni FFT utilizzano a non solo per l'input, ma anche per l'output - questo significa che qualsiasi dato di immagine in esso verrà perso, quindi potrebbe essere preferibile copiare su un array diverso/più grande comunque!

La soluzione facile e ovvia per il tuo scenario sarebbe utilizzare DoubleFFT_2D.realForward(double[][] a). Questo calcolerà solo lo spettro positivo, perché il lato negativo sarà simmetrico ad esso. Questo perché i valori di input sono reali.

Inoltre, controllare la classe RealFFTUtils_2D in JTransforms, che renderà molto più facile per voi per recuperare i risultati dalla matrice dopo :)

+0

In realtà, sembra che il (più recente) documenti sono ora on-line su github : http://wendykierp.github.io/JTransforms/apidocs/ –