FFT实现

时间:2013-10-17 09:45:17

标签: java fft

我正致力于使用FFT来增强图像的应用程序。

我已经实现了FFT的代码:

enter image description here

对于上图中的第一个公式,我实现了如下代码:

  void fft(int x , int y , int size) {

    for(int i=x; i<x+32 ; i++){
        for(int j=y ; j<y+32 ; j++){
            double kth = -2 * Math.PI * (((i*x)/size)+((j*y)/size));
            ComplexNumber expo = new ComplexNumber(Math.cos(kth),Math.sin(kth));
            output.values[i][j] = ComplexNumber.cMult(input.values[x][y],expo) ;
            intermediate.values[i][j] = output.values[i][j];
            input.values[i][j] = output.values[i][j];
        }

    }

}

我还实现了第二个和第三个公式的代码,但我得到的结果不正确。 我该怎么办 ?

第一个方程的代码是否正确?

被修改

我已尝试在指纹图像上使用Catalano框架中的建议功能。 应用Catalano框架后输入图像和输出图像:

输入图片

enter image description here

傅立叶变换

enter image description here

频率过滤器

enter image description here

输出

enter image description here

当我将它应用于指纹图像时,输入图像和输出图像之间的差异并不那么有效。即使在应用FFT之后,指纹图像中的脊和谷之间的对比也无法明显区分。所以有任何加法参数需要对指纹图像进行操作吗?

2 个答案:

答案 0 :(得分:5)

您可以在java中使用FFT,如下所示:

此链接已失效(http://blog.datasingularity.com/?p=53

http://introcs.cs.princeton.edu/java/97data/FFT.java.html

并且参考FFTW的信息是“西方最快的傅里叶变换”,并且有一些Java包装器:来自http://www.fftw.org/download.html

答案 1 :(得分:2)

您可以使用Catalano Framework

请参阅下面的代码和结果。

FastBitmap fb = new FastBitmap("c:\\files\\test.bmp");
fb.toGrayscale();
JOptionPane.showMessageDialog(null, fb.toIcon(), "Image", JOptionPane.PLAIN_MESSAGE); 

FourierTransform ft = new FourierTransform(fb);
ft.Forward();
fb = ft.toFastBitmap();
JOptionPane.showMessageDialog(null, fb.toIcon(), "Fourier Transform", JOptionPane.PLAIN_MESSAGE);

FrequencyFilter ff = new FrequencyFilter(0, 60);
ff.ApplyInPlace(ft);
fb = ft.toFastBitmap();
JOptionPane.showMessageDialog(null, fb.toIcon(), "Frequency Filter", JOptionPane.PLAIN_MESSAGE);

ft.Backward();
fb = ft.toFastBitmap();
JOptionPane.showMessageDialog(null, fb.toIcon(), "Result", JOptionPane.PLAIN_MESSAGE);

Original image

Fourier Transform

Frequency Filter

Result