gpt4 book ai didi

java - FFT 图像变换的输入和输出应该是什么?

转载 作者:行者123 更新时间:2023-12-02 05:18:32 24 4
gpt4 key购买 nike

我尝试使用Java中的FFT Cooley-Tukey算法获取灰度图像的频谱。我不确切知道如何形成算法的输入以及使用输出中的哪些值来形成频谱图像。

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

频谱应如下所示:enter image description here

这就是我所得到的:

enter image description here

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

最佳答案

您没有提供源代码...

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

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

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

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

  3. 您的图像分辨率是 2 的精确幂吗?

    如果不进行零填充,则FFT将无法正常工作

  4. 你的例子是错误的

    实际情况是这样的:

    2D FFT example

    • 左侧是输入图像(从您的问题复制)
    • 中间是实数部分
    • 右边是虚部

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

    more examples

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

[编辑1]力量和包裹

为我的应用程序添加了电源和包装功能,因此结果如下:

power and wrap result

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

关于java - FFT 图像变换的输入和输出应该是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26702187/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com