我如何将 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 执行相同的操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OpenCV 将梯度/幅度应用于图像?

如何将半径应用于颤动的图像?

图像变换

传递对 fft 函数的引用时,输出数组的大小应该是多少?图像处理

如何在悬停时将过渡速度应用于缩放图像?

设置缩小的相机预览以相对于宽度具有正确的图像纵横比