Joh*_*ohn 7 java fft image-processing
我有一个图像,我想使用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 Library和Docs:https://sites.google.com/site/piotrwendykier/software/jtransforms
除了压缩下载之外,JTransforms的文档无法在线获取,这太糟糕了.这是非常完整和有用的,你应该检查出来!
回答你的问题:DoubleFFT_2D.realForwardFull(double[][] a)获取一组实数(你的像素).但是,FFT的结果将为每个输入值提供两个输出值 - 每个频率仓的实部和虚部.这就是为什么你的输入数组需要是实际图像数组的两倍,其中一半是空的/用零填充.
请注意,所有FFT函数a不仅用于输入,还用于输出 - 这意味着其中的任何图像数据都将丢失,因此可能需要复制到不同的/更大的数组!
您的方案的简单明显的修复方法是使用DoubleFFT_2D.realForward(double[][] a).这个只计算正谱,因为负侧将与它对称.这是因为您的输入值是真实的.
另外,RealFFTUtils_2D在JTransforms中查看该类,这将使您更容易从数组中检索结果:)