JTransforms FFT on Image

时间:2012-11-15 01:25:36

标签: java image-processing fft

我有一个想要使用FFT转换到频域的图像,似乎缺少适用于Java的库,但我找到了两个。一个是JTransforms,另一个是鲜为人知,没有名字。

对于不太知名的2D,2D只能具有2的幂的长度值,但是使用简单的方法,例如FastFourierTransform.fastFT(real, imaginary, true);,其中真实的是每个像素值和虚部的二维2D数组。是一个二维数组,大小相同,为零。布尔值取决于正向或反向变换。这对我来说是有意义的,它除了两个要求的力量之外起作用,它破坏了我所做的任何变换(我最初在图像周围添加了黑色空间以适应最接近的2的幂),我正在努力解决的是如何使用JTransforms的等效方法,并希望得到任何指导。我将陈述我目前正在做的事情。

我相信相关的类将是DoubleFFT_2D,它的构造函数需要多个行和列,我认为这些行和列是图像的宽度和高度。因为我的图像没有虚构部分,我想我可以使用doubleFFT.realForwardFull(real);将虚部处理为零,并传递完整像素的真实2D数组。不幸的是,这根本不起作用。 JavaDoc声明the input array must be of size rows*2*columns, with only the first rows*columns elements filled with real data但我不知道这与我的形象有什么关系以及为满足这一要求我必须做些什么。

对于冗长而糟糕的解释感到抱歉,如果需要任何其他信息,我很乐意提供。

JTransforms库和文档可以在这里找到:https://sites.google.com/site/piotrwendykier/software/jtransforms

1 个答案:

答案 0 :(得分:5)

除了压缩download之外,JTransforms的文档无法在线获取,这太糟糕了。这是非常完整和有用的,你应该看看它!

要回答您的问题:DoubleFFT_2D.realForwardFull(double[][] a)采用一系列实数(您的像素)。但是,FFT的结果将为每个输入值提供两个输出值 - 每个频率仓的实部和虚部。这就是为什么你的输入数组需要是实际图像数组的两倍,其中一半是空的/用零填充。

请注意,所有FFT函数都使用a不仅用于输入,还用于输出 - 这意味着其中的任何图像数据都将丢失,因此可能需要复制到不同的/更大的数组!

对于您的方案,简单而明显的修复方法是使用DoubleFFT_2D.realForward(double[][] a)代替。这个只计算正谱,因为负侧将与它对称。这是因为您的输入值是真实的。

另外,请查看JTransforms中的RealFFTUtils_2D类,这样可以更方便地从阵列中检索结果:)