FFT图像转换的输入和输出应该是什么?

我尝试使用Java中的FFT Cooley-Tukey算法获得灰度图像的光谱。 我不知道如何形成算法的输入以及输出中用于形成光谱图像的值。

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

这是频谱的外观: 在此处输入图像描述

这就是我所拥有的:

在此处输入图像描述

显然,我做了一件可怕的错事,但我不知道是什么。

您没有提供源代码……

  1. 你的结果看起来像解析树

    用于递归分辨率/频率信息缩放和特征提取而不是FFT !!! 因此,您的递归可能是错误的,或者您的数据重叠(对于代码就地FFT几乎精神错乱)您应该从1D变换开始,然后将其用于2D并在视觉上检查每个阶段(也是逆变换以匹配原始数据)

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

    看看这里如何计算离散傅里叶变换以及我的答案中的所有子链接

  3. 你的图像分辨率是2的精确度吗?

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

  4. 你的榜样是错的

    这就是它在真实中的样子:

    2D FFT示例

    • 左边是输入图像(从你的问题中复制)
    • 中间是真实的一部分
    • 右边是想象中的一部分

    您可以将它们组合到功率谱=sqrt(Re*Re+Im*Im)ReIm图像放大以便看到,否则角落中的几个白点将是可见的。 这里有一些例子:

    更多例子

    您的预期结果看起来像是移动了​​图像分辨率的一半(因此对称中心位于图像的中心而不是角落中)

[Edit1]电源和包装

已添加电源和包装function到我的应用程序所以这是结果:

权力和包装结果

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