我试图改变图像的相位,并对其进行傅里叶变换。但是这种相位的变化会导致X轴Y轴的功率泄漏。
假设我的图像是一个全一矩阵。如果我进行傅里叶变换,我得到。所有的能量都在中心。事实上,除非你放大,否则我们看不到全部。
现在假设我把矩阵乘以一个复杂的正弦曲线理想情况下,功率应该只是转移到正弦波的频率。但这就是我得到的
。注意沿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()
提前谢谢你的回答
最佳答案
如果绘制new_image
,您会发现它不是正弦:
下面是一个不使用复数创建正弦模式的强力方法:
# 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)
功率谱具有最小的泄漏,如果放大,可以看到峰值功率偏离原点,并且由于在直流附近反射,实际上有4个峰值。