我正致力于使用FFT
来增强图像的应用程序。
我已经实现了FFT
的代码:
对于上图中的第一个公式,我实现了如下代码:
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框架后输入图像和输出图像:
输入图片
傅立叶变换
频率过滤器
输出
当我将它应用于指纹图像时,输入图像和输出图像之间的差异并不那么有效。即使在应用FFT之后,指纹图像中的脊和谷之间的对比也无法明显区分。所以有任何加法参数需要对指纹图像进行操作吗?
答案 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);