FFT图像转换的输入和输出应该是什么?
我尝试使用Java中的FFT Cooley-Tukey算法获得灰度图像的光谱。 我不知道如何形成算法的输入以及输出中用于形成光谱图像的值。
目前我的输入是一个复数数组,其中Re = 8bit灰度域中像素的值,Im = 0; 在运行算法之后,我获得了另一个复数数组,其中实部具有很多值,在[0,255]范围和虚部0之外。我试图从模数为256的实数数组创建一个图像。
这是频谱的外观:
这就是我所拥有的:
显然,我做了一件可怕的错事,但我不知道是什么。
您没有提供源代码……
-
你的结果看起来像解析树
用于递归分辨率/频率信息缩放和特征提取而不是FFT !!! 因此,您的递归可能是错误的,或者您的数据重叠(对于代码就地FFT几乎精神错乱)您应该从1D变换开始,然后将其用于2D并在视觉上检查每个阶段(也是逆变换以匹配原始数据)
-
你的FFT输出应该有非零虚部!!!
看看这里如何计算离散傅里叶变换以及我的答案中的所有子链接
-
你的图像分辨率是2的精确度吗?
如果不是零填充它或FFT将无法正常工作
-
你的榜样是错的
这就是它在真实中的样子:
- 左边是输入图像(从你的问题中复制)
- 中间是真实的一部分
- 右边是想象中的一部分
您可以将它们组合到功率谱
=sqrt(Re*Re+Im*Im)
将Re和Im图像放大以便看到,否则角落中的几个白点将是可见的。 这里有一些例子:您的预期结果看起来像是移动了图像分辨率的一半(因此对称中心位于图像的中心而不是角落中)
[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中的结果匹配,应用就在这里