8

我想使用乘以 exp(-j*2*pi*x*F) 来移动图像(由 2D 矩阵表示fft),其中 x 是位移。我有:

input=peaks(200);
H=fftshift(fft2(fftshift(input)));
x=19;
H=H*exp(-1i*x*2*pi*F);
IF_image=fftshift(ifft2(fftshift(H)));
imshow(IF_image)

但是我在识别/表示 H[F] 中的 F 时遇到了麻烦,因为我的输入是一个二维数组。我怎么能这样做?所需的输出将是我在同一帧中沿水平轴(x 个单位)移动的原始图像,因此它将从 x+1 开始。举个例子:

如果input=

1 2 3 4 5
6 7 8 9 0

x=2,我想要:

4 5 1 2 3
9 0 6 7 8
4

1 回答 1

13

您确定了一维平移/移动的属性。对于 2D,它略有不同,但基于相同的原理。实现2D平移,这是translation/shift属性,定义为:

在此处输入图像描述

x0,y0将是您要介绍的转变。因此,正值x0会将您的 2D 信号向右移动,而负值将向左移动。类似地,正值y0会将您的 2D 图像向下移动,而负值将向上移动。

因此,鉴于您的二维傅立叶变换,您需要在指数中添加一个附加项。此外,您必须N按2D 信号的大小进行归一化。这是假设您的 2D 信号具有相同的行数和列数。如果不是这种情况,那么您将不得不u*x0除以列数并v*y0除以行数。
现在,您对上述代码感到困惑的原因F是您不确定如何在 2D 中定义它。您必须为 2D 网格中的每个点定义一个频率值。由于您的fftshift来电,我们将定义xy值介于 -100 和 99 之间,因为您的 2D 信号大小为 200 x 200,这将使我们的 2D 信号居中位于中间。这实际上fftshift是在做什么。同样,ifftshift撤消由 完成的居中fftshift。为了在 2D 中定义这些点,我使用meshgrid. 定义这些点后,您将获取每对(x,y)坐标,然后创建复指数,如您在上述属性中看到的那样。

因此,您的代码必须以这种方式进行修改。请记住,我摆脱了您原始代码中的冗余fftshiftifftshift调用。您将调用fft,然后fftshift将频谱居中。我还将您的变量更改inputin,就像inputMATLAB 中的函数一样,我们不想无意中用变量隐藏函数。

我还将x偏移定义为-35,将y偏移定义为-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));

请注意,我显示了结果图像的真实组件。这是因为一旦你进行傅里叶逆变换,可能会有一些数值不精确,而且信号的复杂部分实际上非常小。我们可以通过仅使用信号的实部来忽略这一点。

这是我得到的图像:

在此处输入图像描述

正如你所看到的,图像确实正确地移动了,正如上面看到的属性所验证的那样。如果你想指定不同的班次,你只需要改变x0y0适应你的口味。在您的情况下,您可以指定y0 = 0, thenx0可以是任何您想要的水平翻译。

于 2014-09-14T05:35:15.530 回答