我尝试使用Java中的FFT Cooley-Tukey算法获得灰度图像的光谱。 我不确切知道如何形成算法的输入以及输出中用于形成光谱图像的值。
目前我的输入是一个复数数组,其中Re = 8bit灰度域中像素的值,Im = 0; 在运行算法之后,我获得了另一个复数数组,其中实部具有[0,255]范围和虚部0之外的许多值。 我试图从模数为256的实数数组中创建一个图像。
这是频谱的外观:
这就是我所拥有的:
显然我做了一件可怕的错事,但我不知道是什么。
答案 0 :(得分:2)
您没有提供源代码......
您的搜索结果类似于解析树
用于递归分辨率/频率信息缩放和特征提取而非 FFT !!!因此,您的递归可能是错误的,或者您重叠数据(就地编码 FFT 几乎是精神错乱)您应该从 1D 转换开始,然后将其用于 2D 并目视检查每个阶段(也是逆变换以匹配原始数据)
您的FFT输出应该具有非零虚部!!!
在这里查看How to compute Discrete Fourier Transform以及我的答案中的所有子链接
您的图像分辨率是否精确为2?
如果不是零填充它或 FFT 将无法正常工作
您的示例错误
这就是真实的样子:
你可以将它们组合到功率谱=sqrt(Re*Re+Im*Im)
重新和 Im 图像被放大以便看到,只有角落中的几个白点可见。这里还有一些例子:
您的预期结果看起来像是移动了图像分辨率的一半(因此对称中心位于图像的中心而不是角落中)
[Edit1] power and wrap
为我的应用添加了电源和换行功能,所以结果如下:
首先计算功率intensity=sqrt(Re^2+Im^2)
,然后通过将图像向右和向下移动一半来完成换行。什么是来自另一边的重叠,所以只需交换所有行swap((x,y),(x+xs/2,y))
中的所有点,然后对所有列swap((x,y),(x,y+ys/2))
进行相同的交换。现在,结果与OP中的结果匹配,应用为here