我尝试使用 Java 中的 FFT Cooley–Tukey 算法获得灰度图像的光谱。我不确切知道如何形成算法的输入以及输出中使用什么值来形成光谱图像。
目前我的输入是一个复数数组,Re = 8位灰度域中像素的值,Im = 0;运行算法后,我获得了另一个复数数组,其中实部有很多超出 [0,255] 范围的值,虚部为 0。我试图从实数数组模 256 创建图像。
这就是光谱的样子:
这就是我所拥有的:
显然我做错了什么,但我不知道是什么。
我尝试使用 Java 中的 FFT Cooley–Tukey 算法获得灰度图像的光谱。我不确切知道如何形成算法的输入以及输出中使用什么值来形成光谱图像。
目前我的输入是一个复数数组,Re = 8位灰度域中像素的值,Im = 0;运行算法后,我获得了另一个复数数组,其中实部有很多超出 [0,255] 范围的值,虚部为 0。我试图从实数数组模 256 创建图像。
这就是光谱的样子:
这就是我所拥有的:
显然我做错了什么,但我不知道是什么。
你没有提供你的源代码...
你的结果看起来像解析树
用于递归分辨率/频率信息缩放和特征提取而不是FFT !!! 所以可能是你的递归是错误的或者你重叠了数据(编码就地FFT几乎是疯狂的)你应该从一维变换开始,然后将它用于二维并目视检查每个阶段(也是匹配原始数据的逆变换)
你的 FFT 输出应该有非零虚部!
看这里如何计算离散傅里叶变换并进入我的那个答案中的所有子链接
您的图像分辨率是 2 的精确幂吗?
如果不是零填充,否则FFT将无法正常工作
你的例子是错误的
这是真实的样子:
您可以将它们组合起来形成功率谱=sqrt(Re*Re+Im*Im)
,放大Re和Im图像以使其可见,否则角落中只有几个白点可见。这里还有一些例子:
您的预期结果看起来像移动了图像分辨率的一半(因此对称中心位于图像中心而不是角落)
[Edit1] 电源和换行
已为我的应用程序添加了电源和包装功能,因此结果如下:
首先计算功率intensity=sqrt(Re^2+Im^2)
,然后通过将图像向右和向下移动一半大小来完成换行。什么是从另一侧回来的重叠,所以只需交换所有行中的所有点swap((x,y),(x+xs/2,y))
,然后所有列都相同swap((x,y),(x,y+ys/2))
。现在结果与应用程序在这里的 OP 匹配