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

图像频率的概念

图像的频率指的是空间频率,它和我们认知的物理频率是不同的,因此,要理解图像频率,就要将两者的定义脱离开。

图像可以看成是一个定义在二维平面上的信号,该信号的幅值对应像素的灰度(彩色图像对应 RGB 三个分量)。
如果仅仅考虑一帧图像的某一行像素,那么,可以看成是一维空间的信号。这种信号和我们常见的时域信号是很相似的,只不过时域信号是定义在时间域上的,而图像信号是定义在空间域的。

因此,图像的频率被称为空间频率,空间频率是指单位长度内亮度做周期性变化的次数,它反映了图像的像素灰度在空间中的变化情况,从傅里叶频谱上可以看到明暗不一的亮点,反映的就是某点与邻域间的差异程度。

举个例子,一帧图像的背景或者变化缓慢的区域,也就是灰度值分布比较平坦,那么,低频分量就比较强。图像的边缘、细节以及噪声的像素灰度在空间的变化非常剧烈。因此为高频分量。

根据傅里叶变换理论,频域中的频谱值都是由整幅图像计算出来的,因此,整个频谱范围内,低频分量集中在四个角,且其它地方的值只可能比这个值小。


图像变换

原图像:

这里写图片描述

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, []);

然后就到了感悟环节了

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

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReCclay

如果觉得不错,不妨请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值