MatLab - 使用FFT移动图像

Pyt*_*ice 8 matlab image fft image-processing ifft

我想使用fftexp 乘以(-j*2*pi*x*F)来移动图像(由2D矩阵表示),其中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)
Run Code Online (Sandbox Code Playgroud)

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

如果 input=

1 2 3 4 5
6 7 8 9 0
Run Code Online (Sandbox Code Playgroud)

和x = 2,我想要:

4 5 1 2 3
9 0 6 7 8
Run Code Online (Sandbox Code Playgroud)

ray*_*ica 13

您在1D中确定了要翻译/转换的属性.对于2D,它略有不同,但基于相同的原理.要在2D中实现平移,这是平移/移位属性,定义为:

在此输入图像描述

x0,y0将是你想要介绍的转变.因此,正值x0将使您的2D信号向右移动,而负值将向左移动.同样,正值y0会使您的2D图像向下移动,而负值会向上移动.

因此,给定2D中的傅里叶变换,您需要为指数添加一个附加项.此外,您必须标准化N2D信号或大小.这假设您的2D信号具有相同的行数和列数.如果不是这种情况,那么你必须采取u*x0,你将除以列数,v*y0并将除以行数.
现在,您F在上面的代码中感到困惑的原因是因为您不确定如何在2D中定义它.您必须为2D网格中的每个点定义一个频率值.由于您的fftshift呼叫,我们将定义-1和99之间的xy值,因为您的2D信号大小为200 x 200,这将使我们的2D信号居中.这实际上fftshift是在做什么.同样,ifftshift撤消由中心完成的工作fftshift.要在2D中定义这些点,我使用meshgrid.一旦定义了这些点,就可以获取每对(x,y)坐标,然后按照上面的属性创建复数指数.

因此,您的代码必须以这种方式进行修改.请记住,我已经摆脱了原始代码中的冗余fftshiftifftshift调用.你会打电话给fft,然后做fftshift中心频谱.我也改变了你的变量inputin,因为input是在MATLAB的功能,我们不希望有一个变量无意遮蔽功能.

我还将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));
Run Code Online (Sandbox Code Playgroud)

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

这是我得到的图像:

在此输入图像描述

正如您所看到的,图像确实正确地移动,如上面所见的属性所证实的那样.如果您想指定不同的班次,您只需要改变x0y0适合您的口味.在您的情况下,您可以指定y0 = 0,然后x0可以根据需要进行水平翻译.