基于傅里叶变换的图像旋转实验Matlab代码
时间: 2023-06-25 14:07:32 浏览: 92
以下是基于傅里叶变换的图像旋转实验Matlab代码:
```matlab
clc; clear all; close all;
% 读入图像并显示
img = imread('lena.png');
figure, imshow(img);
title('Original Image');
% 图像的傅里叶变换
F = fft2(img);
% 将图像中心移动到频域的中心
F_shift = fftshift(F);
% 计算图像的幅度谱和相位谱
Amp = abs(F_shift);
Phase = angle(F_shift);
% 定义旋转角度
theta = 30;
% 计算旋转后的频域图像
[nrows, ncols] = size(F_shift);
[X, Y] = meshgrid(1:ncols, 1:nrows);
X_center = ceil(ncols/2);
Y_center = ceil(nrows/2);
X_new = (X-X_center)*cosd(theta) - (Y-Y_center)*sind(theta) + X_center;
Y_new = (X-X_center)*sind(theta) + (Y-Y_center)*cosd(theta) + Y_center;
F_rot = interp2(X, Y, F_shift, X_new, Y_new);
% 将旋转后的频域图像移回原点
F_rot_shift = ifftshift(F_rot);
% 计算旋转后的图像的幅度谱和相位谱
Amp_rot = abs(F_rot_shift);
Phase_rot = angle(F_rot_shift);
% 对旋转后的图像进行傅里叶逆变换
img_rot = ifft2(F_rot_shift);
% 显示旋转后的图像
figure, imshow(uint8(img_rot));
title('Rotated Image');
% 比较旋转前后的幅度谱和相位谱
figure, subplot(221), imshow(uint8(Amp)), title('Original Amp');
subplot(222), imshow(uint8(Amp_rot)), title('Rotated Amp');
subplot(223), imshow(Phase, []), title('Original Phase');
subplot(224), imshow(Phase_rot, []), title('Rotated Phase');
```
运行以上代码,可以得到旋转前后的图像、幅度谱和相位谱的对比。需要注意的是,在将旋转后的频域图像移回原点时,需要使用 `ifftshift` 函数,而不是 `fftshift` 函数。
阅读全文