为什么FFT不自动产生以零频率为中心的输出?

时间:2018-07-06 06:51:47

标签: image-processing fft

在DFT之后执行一项名为 Shift 的操作,将零频率分量移到频谱中心。

关于此操作,我有两个问题:

  1. 为什么DFT不能/不能自动将零频分量居中?
  2. 如果DFT之后我们不执行 Shift 操作会怎样?即它如何影响我们的其他图像处理任务?
  3. 有人可以向我提供一些资料来了解名为 Shift 的特定操作吗?

参考文献:
 -fftw shift zero-frequency to the image center
 -Why we shift the zero-frequency component to the center of the spectrum?

1 个答案:

答案 0 :(得分:2)

DFT, by definition使用n=0..N-1k=0..N-1,其中n是时域信号的索引,而k是频率域的索引,域信号。 k也对应于频率。 DFT的定义类似于傅里叶级数。

由于DFT中的频率是周期性的,因此可以想到k=N-1对应于k=-1。因此,移位函数将频率的上半部分移到原点的左侧,因此可以更容易地将它们解释为负频率。但这只是显示上的便利,因为它将频域信号带到我们更熟悉的形式(这可能是因为它使某些傅立叶分析更容易解释,因此教科书以此方式显示,因此,我们通过查看频率图(其原点在中间)来了解傅里叶。

对于图像处理中的大多数任务,我们不需要移动原点。再次,这只是为了显示,这既方便又美观。

例如,要计算互相关:

cc = ifft( fft(img1) * conj(fft(img2)) )

此处,cc的左上像素是原点。如果为img1==img2,则左上像素为最大值。如果我们有一个fft函数将原点移动到中间,那么互相关图像cc的原点也将在中间。找到峰值后,我们需要进行一些计算以找出img1img2之间的变化。 (并不是说这很复杂,但它表明换档不一定是有利的。)

进行卷积时,通常会有一个空间域内核,其起源在中间(例如在this recent question中)。在这种情况下,必须在计算DFT之前将原点移到左上角。但是,仅仅将频域信号的原点乘以它们,然后取消该偏移就没有意义。可以简单地将原点位于左上角的信号直接相乘:

kernel = ifftshift(kernel)
filtered = ifft( fft(img) * fft(kernel) )

请注意,有两个不同的移位函数,通常称为fftshiftifftshift。一个将原点从左上方移动到中间,另一个将原点从中间移动到左上方。这两个函数对偶数大小的信号(图像)执行完全相同的操作,但是如果大小为奇数则不同。