J对图像进行FFT变换



我有一个图像,我想使用FFT将其转换到频域,Java似乎缺少用于此的库,但我找到了两个。一个是JTransforms,另一个不太为人所知,也没有名字。

对于不太为人所知的2D,2D只能具有2的幂的长度值,但具有简单易用的方法,如FastFourierTransform.fastFT(real, imaginary, true);,实数是充满每个像素值的二重的2D阵列,虚数部分是充满零的相同大小的2D阵列。布尔值将取决于正向或反向变换。这对我来说是有意义的,它起到了作用,除了二次方的要求破坏了我所做的任何转换(我最初在图像周围添加了黑色空间,使其接近二次方),我正在努力解决如何使用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

遗憾的是,除了压缩下载之外,JTransforms的文档无法在线获得。它非常完整和有用,你应该看看它!

为了回答您的问题:DoubleFFT_2D.realForwardFull(double[][] a)采用实数数组(您的像素)。然而,FFT的结果对于每个输入值将具有两个输出值——a每个频率仓的实部和虚部。这就是为什么输入数组需要是实际图像数组的两倍大,其中一半为空/填充了零。

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

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

此外,还可以查看JTransforms中的RealFFTUtils_2D类,这将使您以后更容易从数组中检索结果:)

最新更新