您在1D中确定了翻译/转移的属性.对于2D,它略有不同,但基于相同的原理.要在2D中实现平移,这是平移/移位属性,定义为:
x0,y0将是你要引入的转变.因此,x0的正值会使2D信号向右移动,而负值则会向左移动.同样,y0的正值会使2D图像向下移动,而负值会向上移动.
因此,给定2D中的傅里叶变换,您需要为指数添加一个附加项.此外,您必须通过N或2D信号的大小进行标准化.这假设您的2D信号具有相同的行数和列数.如果不是这种情况,那么你必须取u * x0,你将除以列数,v * y0除以行数.
现在,您在上面的代码中对F感到困惑的原因是因为您不确定如何在2D中定义它.您必须为2D网格中的每个点定义一个频率值.由于你的fftshift调用,我们将x和y值定义在-100和99之间,因为你的2D信号大小为200 x 200,这将使我们的2D信号居中.这实际上是fftshift正在做的事情.同样地,ifftshift取消了由fftshift完成的定心.要在2D中定义这些点,我使用meshgrid.一旦定义了这些点,就可以获取每对(x,y)坐标,然后按照上面的属性创建复数指数.
因此,您的代码必须以这种方式进行修改.请记住,我删除了原始代码中的冗余fftshift和ifftshift调用.您可以调用fft,然后进行fftshift以使频谱居中.我还将变量输入更改为in,因为input是MATLAB中的一个函数,我们不希望无意中用变量遮蔽函数.
我还将x shift定义为-35,y shift定义为-50.这意味着结果信号将向左移动35,然后向上移动50.
因此:
in=peaks(200); %// Define input signal
H=fftshift(fft2(in)); %// Compute 2D Fourier Transform
x0=-35; %// Define shifts
y0=-50;
%// Define shift in frequency domain
[xF,yF] = meshgrid(-100:99,-100:99);
%// Perform the shift
H=H.*exp(-1i*2*pi.*(xF*x0+yF*y0)/200);
%// Find the inverse Fourier Transform
IF_image=ifft2(ifftshift(H));
%// Show the images
figure;
subplot(1,2,1);
imshow(in);
subplot(1,2,2);
imshow(real(IF_image));
请注意,我显示了结果图像的实际组件.这是因为一旦你采用逆傅立叶变换,可能会有一些数值不精确,而信号的复杂部分实际上非常小.我们可以通过使用信号的实部来忽略这一点.
这是我得到的图像:
正如您所看到的,图像确实正确地移动,如上面所见的属性所证实的那样.如果您想指定不同的班次,您只需要更改x0和y0以适合您的口味.在您的情况下,您可以指定y0 = 0,然后x0可以是您想要的任何水平平移.