如何将fft应用于图像,显示图像,然后对ifft执行相同的操作?

时间:2012-12-19 17:38:34

标签: java image fft ifft

enter image description here enter image description here enter image description here问题有点广泛。

这就是我所做的:

我有一种应用fft的方法。我不会发布它,因为它是正确的还是不正确的并不是真正的重点。

我通过该方法运行图像,然后尝试显示出两个相同大小的图像,一个用于实部,一个用于虚部。

这似乎工作得很好,除了我的方法产生的灰度值通常远大于255,因此我不确定我所看到的是什么。

然后我接受原始结果(不管我显示的像素值是什么,因为我假设它们以某种方式被修改以适应0到255之间)并通过与之前相同的方法运行它,但是通过符号更改来实现IFFT。

然后我尝试显示它。同样,大多数情况下原始值远大于255.

我的问题归结为: a。)我是否必须对fft进行一些缩放以使其适合0到255之间? b。)当我做ifft时,我是否必须反转这种缩放? c。)在申请ifft之前,我是否需要对fft进行任何翻译?

部分c源于这样一个事实:我已经阅读了一些关于fft角落居中的事情,但我并不确定这意味着什么。

一个较小的问题,第d部分,如果我在原始图像上应用2d fft,首先将1d fft应用于所有行,然后再应用于所有列,我是否需要应用ifft相同的订单或我是否需要撤销订单。

我认为现在一切都好。我一直在寻找答案,但似乎找不到任何帮助,所以感激。

编辑:我添加了一些图片,也许他们会有所帮助。第一个是原始图像,第二个是我的fft方法(幅度和虚部)的结果,第三个是中间图像上ifft的结果。

EDIT2:将图像更新为更新方法的图像。

2 个答案:

答案 0 :(得分:3)

人们通常认为分别查看实部和虚部非常有用,而是查看幅度,可能还有相位,但通常只是幅度。

a)通常,是的,无论您正在查看哪些组件,都需要应用缩放。图像的总功率与其FFT之间存在比例关系,但不是单个组件。此外,你经常想要做一些事情,比如记录数据,或忽略零组件等,所以最好只做你自己的缩放。

b)在 a 的部分中,您应该进行缩放以进行可视化,而不是缩放实际的FFT。您应该采用原始FFT的IFFT。

c)根据您的FFT例程,您可能需要除以2pi因子或样本中的点数,但这取决于FFT例程的工作方式。文档应该澄清这一点。首先,看看你的开始和结束之间是否存在2pi的因素。

答案 1 :(得分:0)

回答你的四个问题:

一个。您是否需要缩放FFT的结果才能查看它们?是。您需要获取幅度,然后缩小到0到25​​5之间的值。

湾你是否必须在IFFT之前反向缩放。只有当您想要查看FFT的结果时,才能回答A.您不能IFFT缩放数字。使用原始数字。

℃。在FFT和IFFT之间进行转换?否。

d。 FFT期间Row与Col的顺序是否重要?不.FFT的结果是一组实数和虚数。这是一个确定性的结果。您可以按任何顺序进行IFFT。

您可能遇到问题的一个关键方面是数学和可视化之间的差异。 IFFT处理浮动或双实数和虚数。图像需要0到255之间的整数。您必须在代码中处理此转换。你表示你认为它是“以某种方式修改”。更安全自己执行此转换。

最后同样关于tom10的回答。您可能需要缩放IFFT的结果。这取决于FFT和IFFT的实现。