Matlab对图像的傅里叶变换初探

原图像:

这里写图片描述

clc;
clear;
I=imread('1.jpg');      % 读取图像
I=rgb2gray(I);          % RGB图像转换为灰度图 - (可试试去掉然后做对比)
I=im2double(I);         % 图像转换为double,此时图像的数值范围由原来的【0,255】转化为【0,1】 -(可试试去掉然后做对比)
F=fft2(I);              % 进行傅里叶变换
F=fftshift(F);          % 傅里叶变换后的图像进行象限转换
F=abs(F);               % 求傅里叶变换的模。变换后的结果是一个复数,有实部和虚部,abs求其模。 - 并且如果没这一句的会有警告!
T=log(F+1);             % 上一步得到了傅里叶变换的模,但是这个值一般是非常大的,为了更好的观察图像我们对其进行缩放。
figure;                 % 创建图像            
imshow(T,[]);           % imshow显示的只有0~1的值。尽管我们进行了缩放,凡是还是部分值大于1,后面加了[]是为了大于1的值相应的映射到0~1这个区间里!

FT后的图像

这里写图片描述


FT变换的更进一步探讨

clc;
clear;
I=imread('1.jpg');      % 读取图像
figure;                 % 创建一个图像句柄
subplot(2,2,1);         % 对应显示的子图位置
imshow(I);              % 原图显示
title('原图');
I=rgb2gray(I);          % RGB图像转换为灰度图 - (可试试去掉然后做对比)
subplot(2,2,2)          % 对应显示的子图位置
imhist(I);              % 显示图像灰度直方图
title('灰度直方图'); 
%I=im2double(I);         % 图像转换为double,此时图像的数值范围由原来的【0,255】转化为【0,1】 所以可以理解为二值化-(可试试去掉然后做对比)
F=fft2(I);              % 进行傅里叶变换
IF = F;                 % 句柄备份为了傅里叶逆变换
F=fftshift(F);          % 傅里叶变换后的图像进行象限转换
F=abs(F);               % 求傅里叶变换的模。变换后的结果是一个复数,有实部和虚部,abs求其模。 - 并且如果没这一句的会有警告!
T=log(F+1);             % 上一步得到了傅里叶变换的模,但是这个值一般是非常大的,为了更好的观察图像我们对其进行缩放。        
subplot(2,2,3)          % 对应显示的子图位置
imshow(T,[]);           % imshow显示的只有0~1的值。尽管我们进行了缩放,凡是还是部分值大于1,后面加了[]是为了大于1的值相应的映射到0~1这个区间里!
title('傅里叶变换后的频谱图');
R=uint8(real(ifft2(IF)));% 进行IFFT变换使图像复原
subplot(2,2,4)          % 对应显示的子图位置
imshow(R,[]);           % 显示傅里叶逆变换后的图像
title('傅里叶逆变换后的复原图像');
suptitle('FT相关变换图像');

这里写图片描述

把程序I=im2double(I);取消屏蔽后,再来看下对应的图像。

这里写图片描述

也就不难理解这个imdouble,其实就是个二值化函数,把图像进行二值化!

关于几个重要函数这里也再说明下:

FFT函数:FFT(Fast Fourier Transformation)为一阶快速傅里叶变换函数,高速傅里叶变换(FFT)的实质是“分而治之”,利用对称性、周期性和可约性将某些项合并,将DFT序列分解为短序列,降低运算次数,提高运算速度。

IFFT函数:为傅里叶的逆变换,IFFT算法(x)为FFT算法相同(X),除了改变符号,N =长度比例因子(X)。由于FFT、IFFT执行时间取决于变换长度。这是最快的两个权力。这是几乎一样快,只有小素数的长度。它通常是几倍的速度的长度是总理或具有大素数因子。


关于编程中需要注意的细节:

1、imshow(T,[]);

figure;imshow(T,[]);,具体对应到程序中就是ff2iff2后的图像显示方法了。之所以用imshow(T,[]);而不是imshow(T)。是因为即使经过对数变换后T的取值范围仍然大于[0,1],比如,maxT=12.23,minT=0.009。
imshow(T)只会显示[0,1]的值,而imshow(T,[]) 会根据灰度图的数值范围来显示图像,相当于将[0.09,12.23]映射到[0,1]显示。

2、经过ff2后的句柄,到imshow显示还得进行中间处理。

总结为:

F = fft2(I);
log(abs(ff2shift(F))+1);
imshow(T, []);

然后就到了感悟环节了

关于傅里叶变换的应用愚钝的我也仅仅知道这不过是冰山一角罢了,这个图像的变换然后再还原什么应用呢?明显,在图像的压缩大有用武之地!

图像显然缩小了,不是吗?

猜你喜欢

转载自blog.csdn.net/recclay/article/details/80404116