Image MatLab-用FFT变换图像

Image MatLab-用FFT变换图像,image,matlab,image-processing,fft,ifft,Image,Matlab,Image Processing,Fft,Ifft,我想用exp(-j*2*pi*x*F)乘以图像的fft,移动图像(由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) 但是我很难识别/表示H[F]中的F,因为我的输入是一个二维数组。我怎么能这样做? 所需的输出将是我的原始图像在同一帧

我想用exp(-j*2*pi*x*F)乘以图像的
fft
,移动图像(由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)
但是我很难识别/表示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

您在1D中标识了平移/移位的属性。对于2D,它略有不同,但基于相同的原理。要在二维中实现平移,这是平移/移位属性,定义为:

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

因此,给定2D中的傅里叶变换,需要在指数中添加一个附加项。此外,必须通过
N
或2D信号的大小进行规格化。这是假设2D信号的行数和列数相同。如果不是这样,则必须取
u*x0
除以列数,
v*y0
除以行数。
现在,您之所以对上述代码中的
F
感到困惑,是因为您不确定如何在2D中定义它。必须为二维栅格中的每个点定义频率值。因为你的代码> fftSHIFT 调用,我们将定义<代码> x<代码>和<代码> y>代码>值在100到99之间,因为你的2D信号大小为200×200,这将使我们的2D信号处于中间。这实际上就是
fftshift
正在做的事情。类似地,
ifftshift
撤消由
fftshift
完成的定心。要在二维中定义这些点,我使用。定义这些点后,您将获取每对
(x,y)
坐标,然后创建复杂的指数,如上面属性中所示

因此,必须以这种方式修改代码。请记住,我在原始代码中去掉了冗余的
fftshift
ifftshift
调用。您可以调用
fft
,然后执行
fftshift
以使频谱居中。我还将变量
input
更改为
in
中的
,这是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));

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

这是我得到的图像:


正如您所看到的,正如上面看到的属性所验证的,图像确实正确地移动了。如果要指定不同的班次,只需更改
x0
y0
,以满足您的口味。在您的情况下,您可以指定
y0=0
,然后
x0
可以是任何您想要的水平翻译。

只是说,使用
circshift
不是更简单吗?是的。但原则上,这可以使用我感兴趣的所描述的方法来完成。(:@CeciliaGuerra-我同意
circshift
,但我假设您这样做是为了演示傅里叶变换的平移/移位属性。不管怎样,我已经写了一个答案。
circshift
仅在您以整数移位时才有用pixels@Sandino-真不敢相信我没注意到那个打字错误。我回答很久以前我就问过这个问题了。谢谢你的更正。