我如何将 fft 应用于图像,显示图像,然后对 ifft 执行相同的操作?
Posted
技术标签:
【中文标题】我如何将 fft 应用于图像,显示图像,然后对 ifft 执行相同的操作?【英文标题】:How do i apply the fft to an image, display the image, and then do the same with the ifft? 【发布时间】:2012-12-19 17:38:34 【问题描述】:这个问题有点笼统。
这是我所做的:
我有一个应用 fft 的方法。我不会发布它,因为它是否正确不是这里的重点。
我通过该方法运行一个图像,然后尝试显示两个相同大小的图像,一个用于实部,一个用于虚部。
这似乎工作正常,只是我的方法得出的灰度值通常远大于 255,因此我不确定我看到的是什么。
然后我获取原始结果(不是我显示的任何像素值,因为我假设它们以某种方式被修改以适应 0 到 255 之间)并通过与以前相同的方法运行它,但改变符号以实现好不好。
然后我也尝试显示它。同样,大部分原始值远大于 255。
我的问题归结为: a.) 我是否必须对 fft 进行一些缩放以使其适合 0 到 255 之间? b.) 当我做 ifft 时,我是否必须反转这个缩放比例? c.) 在申请 ifft 之前,我需要在 fft 上做任何翻译吗?
c 部分源于我已经阅读了一些关于将 fft 的角居中的内容,但我不确定这是什么意思。
d 部分的一个较小的问题是,如果我通过首先将 1d fft 应用于所有行然后再次应用于所有列来在原始图像上应用 2d fft,我是否需要在相同的顺序还是我需要颠倒顺序。
我想暂时就这些了。我一直在寻找答案,但似乎找不到太多,因此不胜感激。
编辑:我添加了一些图片,也许它们会有所帮助。第一个是原始图像,第二个是我的fft方法的结果(幅度和虚部),第三个是中间图像上的ifft结果。
EDIT2:将图像更新为来自较新方法的图像。
【问题讨论】:
您的问题听起来像是显示数据的标准化之一。你试过什么? 我想我真正想知道的是正确的程序,所以我知道在哪里修复我的方法。我尝试将每个值乘以 255,然后除以要标准化的最大值。结果并不正确,但就像我说的,我不太确定从哪里开始故障排除 @Mason:我投票结束这个问题。首先,您问了一个关于标准化和绘图的简单问题,该问题已得到解答,您现在有了自己的绘图。作为回应,您已经完全改变了问题的目标,因此我们似乎应该查看您的图像并调试您的 fft 实现。这个新问题的表述过于模糊,也不适合 SO。 如果你愿意,可以投票关闭它,但我的问题是一样的。我想要的只是回答我最初提出的 4 个问题。我不希望任何人调试我的 fft,这就是我没有为此发布代码的原因。我只是张贴图片来说明我的观点。我发布的图像没有缩放,所以我想获得一些关于未缩放图像的反馈。此外,第二张图片旨在说明翻译问题,因为在我看来,象限可能更有意义。也许下次你投票结束时,你应该先澄清一下。 【参考方案1】:人们通常不觉得分开查看实部和虚部很有用,而是查看幅度,可能还有相位,但通常只查看幅度。
a) 一般来说,是的,无论您正在查看哪些组件,您都需要应用缩放。图像的总功率和它的 FFT 之间存在比例关系,而不是单个分量。此外,您通常需要执行一些操作,例如记录数据日志,或忽略零分量等,因此最好自己进行缩放。
b) 在 a 部分中,您应该进行缩放以进行可视化,而不是缩放实际的 FFT。您应该取原始 FFT 的 IFFT。
c) 根据您的 FFT 例程,您可能需要除以 2pi 或样本中的点数,但这取决于您的 FFT 例程的工作方式。文档应该澄清这一点。首先,看看你开始和结束之间是否有 2pi 的因子。
【讨论】:
我想我明白你在说什么。我展示虚部的唯一原因是为了我自己的验证。我已经尝试了您建议的所有内容,但您确实提出了一个有趣的问题。你提到了幅度。我假设您指的是平方分量之和的平方根。那么,我的新问题是,我应该将 ifft 应用于这个量级,还是应该将其应用于我从 fft 获得的虚数本身?另外,我没有为此使用库,我正在尝试自己实现它,所以没有文档。 您应该将 IFFT 应用于原始(虚构)FFT 数据,而不是幅度。【参考方案2】:回答你的四个问题:
一个。您是否必须缩放 FFT 的结果才能查看它们?是的。您需要取幅值,然后缩小到 0 到 255 之间的值。
b.您是否必须在 IFFT 之前反向缩放。仅当您想查看 FFT 的结果时才回答 A。您不能 IFFT 缩放数字。使用原始数字。
c。在 FFT 和 IFFT 之间进行转换?没有。
d。 FFT 期间 Row 与 Col 的顺序是否重要?不,FFT 的结果是一组实数和虚数。这是一个确定性的结果。您可以按任意顺序进行 IFFT。
您可能遇到问题的关键方面之一是数学和可视化之间的差异。 IFFT 适用于浮点数或双实数和虚数。图像需要 0 到 255 之间的整数。您必须在代码中处理此转换。您表示您认为它已“以某种方式修改”。自己执行此转换更安全。
最后同上 tom10 的答案。您可能需要缩放 IFFT 的结果。这取决于 FFT 和 IFFT 的实现。
【讨论】:
以上是关于我如何将 fft 应用于图像,显示图像,然后对 ifft 执行相同的操作?的主要内容,如果未能解决你的问题,请参考以下文章