matlab如何移动图像,MatLab – 使用FFT移动图像

您在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可以是您想要的任何水平平移.

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值