2014-11-02 50 views
0

我尝试使用Java中的FFT Cooley-Tukey算法获取灰度图像的光谱。 我不知道如何形成该算法的输入以及要使用哪些值来形成光谱图像。FFT图像变换的输入和输出应该是什么?

目前我的输入是一个复数的数组,Re = 8位灰度域中的像素值,Im = 0; 运行该算法后,我获得另一个复数数组,其中实数部分具有[0,255]范围和虚数部分0以外的很多值。 我试图从实数列数模256创建图像。

这是频谱应该是什么样子:enter image description here

这是我的本钱:

enter image description here

显然I'me做一些可怕的错误,但我不知道是什么。

+0

您必须发布一些代码,以便我们可以尝试找出错误的位置,您是在编写自己的FFT算法还是在使用库? – KillaKem 2014-11-03 11:53:30

+0

我已经实现了从[这里](http://example.com),用Java编写的算法。我不知道代码可能会如何帮助。 – mawus 2014-11-03 12:16:43

+0

该链接似乎被打破 – KillaKem 2014-11-03 12:51:37

回答

2

您没有提供源代码...

  1. 你的结果看起来像分辨率树

    用于递归解析/频率信息缩放和特征提取不FFT! !所以,可能是你的递归是错误的,或者您重叠数据(代码就地FFT几乎是疯狂),你应该先从1D变换,然后利用它来进行2D和目视检查每一个阶段(也逆变换以匹配原始数据)

  2. 您的FFT输出应该有非零虚部!!!

    这里看看How to compute Discrete Fourier Transform并进入我的这个答复所有子链接

  3. 是你的图像分辨率的2精确的力量?

    如果不是零填充它或FFT将无法​​正常

  4. 你的榜样工作是错误

    这是怎么看起来像在现实:

    2D FFT example

    • left是输入图像(c从你的问题)
    • 中间opied是真实的一部分
    • 右边是虚部

    你可以将它们结合起来,功率谱=sqrt(Re*Re+Im*Im)重新图像被放大,被其他人看到只有几角落中的白色点将可见。这里是一些例子:

    more examples

    您预期的结果看起来像移了图像分辨率的一半(所以对称的中心是图像的中心,而不是在角落)

[EDIT1]功率和包裹

添加功率和封装函数到矿井应用程序,以便在这里是结果:

power and wrap result

首先计算功率intensity=sqrt(Re^2+Im^2),然后通过将图像向右和向下移动一半来完成包装。什么是来自对方的重叠,所以只需交换所有行中的所有点swap((x,y),(x+xs/2,y)),然后对于所有列swap((x,y),(x,y+ys/2))都是相同的。现在结果与来自OP的应用程序相匹配:here