通过对以下三个程序的实现,使我对MATLAB更为熟悉,且对图像的基本处理知识有更深的认识,有时候图像处理后的结果并不是认为可以想象到的,通过程序运行得到直观可见的结果一定有其必然性,下面我们就一起探索下小发现吧。
一、傅里叶变换及其逆变换
傅立叶变换(程序: fft_test.m)
将两幅 M×N 的灰度图像进行二维傅立叶变换,分别得到各自的幅度谱图像和相位谱图像,显示这4幅图像。将两幅图像的相位谱交换,进行反傅立叶变换,显示这两幅重建图像。
close all;
clc;
clear;
% 读入原始图像
img1 = imread('1.jpg');
img2 = imread('2.jpg');
I1 = rgb2gray(img1); %得到灰度图像
I2 = rgb2gray(img2);
figure(1);
imshow(I1); %显示灰度图像
title('图一的灰度图像');
figure(2);
imshow(I2);
title('图二的灰度图像');
% 求离散傅立叶频谱
f_fft_1 = fftshift(fft2(I1));
f_fft_2 = fftshift(fft2(I2));
f_magnitude_1 = log(abs(f_fft_1)); %计算幅度谱,加log便于显示
f_magnitude_2 = log(abs(f_fft_2));
f_phase_1 = angle(f_fft_1); %相位谱
f_phase_2 = angle(f_fft_2);
figure(3);
subplot(2,2,1);imshow(f_magnitude_1,[]); %显示幅度谱
title('图一的幅度谱');
subplot(2,2,2);imshow(f_phase_1,[]); %显示相位谱
title('图一的相位谱');
subplot(2,2,3);imshow(f_magnitude_2,[]); %显示幅度谱
title('图二的幅度谱');
subplot(2,2,4);imshow(f_phase_2,[]); %显示相位谱
title('图二的相位谱');
%互换相位谱后进行傅里叶反变换
f_phase_exp_1 = i.*f_phase_1;
f_phase_exp_2 = i.*f_phase_2;
f_phase_me_1 = abs(f_fft_1).*(exp(f_phase_exp_2));
f_phase_me_2 = abs(f_fft_2).*(exp(f_phase_exp_1));
f_ifft_1=real(ifft2(ifftshift(f_phase_me_1)));
f_ifft_2=real(ifft2(ifftshift(f_phase_me_2)));
figure(4);
imshow(im2uint8(mat2gray(f_ifft_1)));
title('图一幅度谱与图二相位谱的傅里叶反变换');
figure(5);
imshow(im2uint8(mat2gray(f_ifft_2)));
title('图二幅度谱与图一相位谱的傅里叶反变换');
这里贴上一组程序运行的结果图像,我使用的是600*450大小的图像进行实验。