一.傅里叶变换
1.首先,傅里叶变换有什么用呢?我们用两个生动的例子阐释傅里叶变换的作用:
【例子一】:现在一家餐厅研究了一个特殊的美食,作为美食家的你,想知道这个菜里面到底都有什么配料。那么,如果我们输入这个美食(这个美食就是我们的“时域信号”),通过傅里叶变换,就可以得到这份美食的配方(这个配方就是我们的“频域信号”)
如果我们输入的是这个美食的配方,就可以通过傅里叶反变换得到这份美食
【例子二】:下面请读者和我一起做一件事情:我将给出sin(3x)+sin(5x)sin(3x)+sin(5x)的曲线(你只知道这个曲线的样子,并不知道这个曲线的方程),那么应该如何去掉sin(5x)sin(5x)的成分呢?
想在时域中完成这个简直难于上青天,可以在频域中却很简单。
2.傅里叶变换的应用
傅立叶变换在图像处理中有非常非常的作用。因为不仅傅立叶分析涉及图像处理的很多方面,傅立叶的改进算法,比如离散余弦变换,gabor与小波在图像处理中也有重要的分量。
印象中,傅立叶变换在图像处理以下几个话题都有重要作用:
a.图像增强与图像去噪
绝大部分噪音都是图像的高频分量,通过低通滤波器来滤除高频——噪声; 边缘也是图像的高频分量,可以通过添加高频分量来增强原始图像的边缘;
b.图像分割之边缘检测
提取图像高频分量
c.图像特征提取:
形状特征:傅里叶描述子
纹理特征:直接通过傅里叶系数来计算纹理特征
其他特征:将提取的特征值进行傅里叶变换来使特征具有平移、伸缩、旋转不变性
d.图像压缩
可以直接通过傅里叶系数来压缩数据;常用的离散余弦变换是傅立叶变换的实变换;
2.我们再接着看看傅里叶变换本身是什么:
傅里叶变换是将时域信号分解为不同频率的正弦信号或余弦函数叠加之和。他的公式如下:
公式1:二维傅里叶变换公式(其实不用看它)
公式中参数说明:
M、N分别是图像的长和宽;
u、x范围从1到M-1;v、y范围从1到N-1。
公式看上去不难,但其实还是不太明确到底怎么用啊!它其实可以矩阵相乘的形式表示:
公式2中f是原始二维数据矩阵,G_{1}和G_{2}分别是如下:
大家观察一下,G_{1}和G_{2}这么有规律,很容易就编程出来了~ 然后3个矩阵做个乘积,就换到频率域了!二维傅里叶变换就很容易用matlab实现了。
二,MATLAB程序实现
1.主要函数介绍
主要用到的函数是fft2,其基本语法为:
Y = fft2(X)
它的含义是使用快速傅里叶变换算法返回矩阵的二维傅里叶变换, 这等同于计算fft(fft(X).').'。如果X是一个多维数组, fft2将采用高于 2 的每个维度的二维变换。输出Y的大小与X相同
Y = fft2(X,m,n)
将截断X
或用尾随零填充X
,以便在计算变换之前形成m
×n
矩阵。Y
是m
×n
矩阵。如果X
是一个多维数组,fft2
将根据m
和n
决定X
的前两个维度的形状,也就是说使用该语法fft2将使用所要求的0的个数对输入图像进行填充,以便结果函数的大小为m*n。
傅里叶频谱可以使用函数abs来获得:
S = abs(F)
该函数计算数组的每一个元素的幅度(实部和虚部平方和的平方根)。
2.程序实践
Step1:导入图像并显示
N=100
f=zeros(50,50);
f(15:35,23:28)=1;
subplot(2,3,1);
imshow(f);
title('原始图像')
Step2:计算傅里叶变换并显示其频谱
g= fft2(f); % matlab自带函数,来用对比
subplot(2,3,2);
imshow(real(g)); % 一般只要实部
title('fft2生成的"频域"图像');
S=abs(g);
subplot(2,3,3);
imshow(S)
title('傅里叶频谱')
Step3:居中频谱
Fc=fftshift(real(S)); %将零频分量移到频谱中心
subplot(2,3,4);
imshow(Fc)
title('居中的频谱')
Step4:使用对数变换进行视觉上的增强
S2=log(1+abs(Fc));
subplot(2,3,5);
imshow(S2)
title('使用对数变换进行视觉增强后的频谱');
了解更多matlab有关知识,可以关注公众号Asoul水云天。交流学习可以加qq群953314432.