相移后进行傅立叶变换

时间:2015-09-23 13:14:02

标签: python numpy fft scientific-computing

我正在尝试更改图像的相位并对其进行傅立叶变换。但是这种相位变化会导致沿x轴和y轴的功率泄漏。

假设我的图像是全部矩阵。如果我采用傅立叶变换,我得到Spectrum of all ones。看到所有的力量都在中心。事实上,除非你放大,否则我们看不到它。

现在假设我将矩阵乘以复数正弦曲线。理想情况下,功率应该转移到正弦波的频率。但这就是我得到的 Spectra of phase multiplied image。注意沿x和y轴泄漏的功率..

为什么会这样?是因为信号的非连续性吗?

请参阅下面的python代码

import numpy as np
from matplotlib import pyplot as plt

# Init a all one array
base_image = np.ones([1024,1024])

#Generate a array so that we can make a sinusoid using it
x_cords = np.arange(base_image.shape[1]) - base_image.shape[1]/2
x_cords = np.transpose(x_cords)/512
x_cords = x_cords.astype(float)
x_cords = np.tile(x_cords, [base_image.shape[0], 1])
y_cords = np.transpose(x_cords)

#Generate the sinusoid
phase = np.exp(x_cords + y_cords)

#Apply this shift
new_image = base_image * phase

spec_base = np.fft.fftshift(np.fft.fft2(base_image))
spec_new = np.fft.fftshift(np.fft.fft2(new_image))

plt.imshow(np.log(np.abs(spec_base)))
plt.show()

plt.imshow(np.log(np.abs(spec_new)))
plt.show()

提前感谢您的回答

2 个答案:

答案 0 :(得分:4)

如果你绘制new_image,你会发现它不是正弦曲线:enter image description here

这是一种在不使用复数的情况下创建正弦曲线模式的强力方法:

# create a sinusoid
F=4 ## select the frequency -- use an even integer to minimize spectral "leakage"
new_image = np.ones([X,Y])
for y in xrange(Y):
   for x in xrange(X):
      new_image[y][x] = sin(x/float(X)*pi*F)*sin(y/float(Y)*pi*F)

enter image description here

功率谱具有最小的泄漏,如果放大,您可以看到峰值功率是非原点的,并且由于DC周围的镜像,实际上有4个峰值。

enter image description here

答案 1 :(得分:3)

几点:

  • 所有1都是一个非常特殊的情况 - 完全周期性,因此FFT没有显示频谱泄漏。
  • xcordsycords是真实的,这意味着phase是真实的 - 它不是正弦曲线。 exp的论点应该是虚构的。
  • 即使使用正确的phase,除非您选择phase在您的域名中完全定期,否则您将获得频谱泄漏。