JTransforms FFT在图像上的应用

7
我有一张图片,想要使用FFT将其转换为频域。对于Java来说,似乎缺乏此类库,但我找到了两个:JTransforms和另一个不太知名的库。与后者相比,2D只能具有2的幂次方长度,但它具有易于使用的方法,例如FastFourierTransform.fastFT(real, imaginary, true);,其中real是由每个像素值填充的double类型的2D数组,而imaginary是相同大小的填充零的2D数组。布尔值取决于正向或反向变换。这对我很有意义,也有效果,除了必须为2的幂次方的要求之外(最初我在图像周围添加黑色空间以适应最接近的2的幂次方),我遇到的问题是如何使用JTransforms的等效方法,并且希望得到任何指导。我会陈述我目前正在做什么。
我认为相关的类应该是DoubleFFT_2D,它的构造函数需要行数和列数,我认为这应该是我的图像的宽度和高度。因为我的图像没有虚部,所以我认为可以使用doubleFFT.realForwardFull(real);,它将虚部视为零并传递实际的2D数组。不幸的是,这根本不起作用。JavaDoc说明了输入数组的大小必须为rows*2*columns,只有前rows*columns个元素填充了实际数据,但我不知道这与我的图像有什么关系,以及我需要做什么来满足这个要求。
抱歉解释冗长而差劲,如果需要任何其他信息,我很乐意提供。
JTransforms库和文档可以在此处找到:https://sites.google.com/site/piotrwendykier/software/jtransforms
1个回答

6
很遗憾,JTransforms的文档除了一个压缩下载链接download之外,在线上并不可用。它非常完整和有用,你应该去看看!
回答你的问题:DoubleFFT_2D.realForwardFull(double[][] a)需要一个实数数组(即像素)。但是,FFT的结果会对每个输入值产生两个输出值 - 每个频率区间的实部和虚部。这就是为什么你的输入数组需要比实际图像数组大两倍,其中一半为空/填充为零。
请注意,所有FFT函数都使用a作为输入,也作为输出 - 这意味着那里的任何图像数据都将丢失,因此最好将其复制到不同/更大的数组中!
对于您的情况,简单而明显的解决方法是改用DoubleFFT_2D.realForward(double[][] a)。这个函数只会计算正频谱,因为负面将对称于它。这是因为输入值是实数。
此外,请查看JTransforms中的RealFFTUtils_2D类,这将使您更容易从数组中检索结果 :)

实际上,最新的文档现在已经在Github上线了:http://wendykierp.github.io/JTransforms/apidocs/ - matt burns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接