在DFT之后执行一项名为 Shift 的操作,将零频率分量移到频谱中心。
关于此操作,我有两个问题:
参考文献:
-fftw shift zero-frequency to the image center
-Why we shift the zero-frequency component to the center of the spectrum?
答案 0 :(得分:2)
DFT, by definition使用n=0..N-1
和k=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
的原点也将在中间。找到峰值后,我们需要进行一些计算以找出img1
和img2
之间的变化。 (并不是说这很复杂,但它表明换档不一定是有利的。)
进行卷积时,通常会有一个空间域内核,其起源在中间(例如在this recent question中)。在这种情况下,必须在计算DFT之前将原点移到左上角。但是,仅仅将频域信号的原点乘以它们,然后取消该偏移就没有意义。可以简单地将原点位于左上角的信号直接相乘:
kernel = ifftshift(kernel)
filtered = ifft( fft(img) * fft(kernel) )
请注意,有两个不同的移位函数,通常称为fftshift
和ifftshift
。一个将原点从左上方移动到中间,另一个将原点从中间移动到左上方。这两个函数对偶数大小的信号(图像)执行完全相同的操作,但是如果大小为奇数则不同。