本文主要讲述如何在MATLAB中实现频域滤波,那么,怎么实现呢,我们这里讲的所有的滤波都是通过傅里叶变换在频域中实现的,所有这部分和傅里叶变换渊源很深,至于傅里叶变换本身,我自己也不能解释的很清楚,我们只讲他如何在matlab中实现和应用。
深入了解傅里叶变换请戳文末链接!!!!
大佬介绍的深入浅出,每每有茅塞顿开之感,大家学完教材上有关傅里叶变换的,再看看文中所写,真的是柳暗花明,瞻仰大佬之余,大家别忘了切回来啊,我们继续讲MATLAB。
一、图像增强中的频域滤波(通过傅里叶变换实现)1.频域滤波的基本概念
空间域和频域线性滤波的基础都是卷积定理,该定理可以写作:
至于卷积定理本身是什么,大家可以看看知乎上另一个大佬的解释:
J Pan:“卷积”其实没有那么难以理解:
https://zhuanlan.zhihu.com/p/41609577
我们依旧是只讲述滤波问题,我们这里需要知道的是,频域滤波的目的是选择一个滤波器传递函数,以便按照指定的方式修改F(u,v)。
例如,图(a)所示的滤波器有一- 个传递函数,在乘以-一个居中处理后的函数F(u, 0)后,该传递函数会衰减F(u, v)的高频分量,而保持低频分量相对不变。具有这种特性的滤波器称为低通滤波器。低通滤波器的结果会导致图像出现模糊现象(平滑)。
基于卷积理论,我们知道为了在空间域中得到相应的滤波后的图像,仅需要计算积H(u, v),F(u, v)的傅里叶逆变换。应当记住,上述方法所得到的结果与我们在空间域中使用卷积所得到的结果是相同的,只要滤波掩模h(x,y)是H(u,v)的傅里叶变换。
2.函数介绍
paddedsize函数,他的作用是填充输入图像,需要注意的是,很多人的matlab文件里面没有这个函数,需要自己定义,所以调用的时候会显示错误,可以关注公众号Asoul水云天课堂,后台回复padd函数获取源代码,定义的步骤是,复制源代码,新建脚本,粘贴运行之后保存在matlab文件夹中。
freqz2函数
[H,f1,f2] = freqz2(h) 的返回值 H是h的64*64频率响应,f1和f2是长度为64的频率向量。h 是一个二维的有限脉冲响应滤波器(FIR filter),其形式为计算单元(computational molecule)。
3.freqz2函数和fft函数的比较
对于一个给定的空间滤波器h,生成一个频域滤波器H的明显方法是令H=fft2(h,PQ1,PQ2),而freqz2函数可以把空间滤波器转换成等价的频域滤波器,他可以求系统的频率响应。
4.DFT(离散傅里叶变换)滤波的基本步骤
Step1.使用函数paddedsize获得填充参数:
PQ = paddedsize (size(f)) ;
Step2.得到使用填充的傅里叶变换:
F = fft2(f, PQ(1), PQ(2)) ;
Step3.生成个大小为PQ(1) x PQ (2)的滤波函数H。该滤波函数的格式必须如图4.4(b)所示。另外,若它已居中,则在使用该滤波函数之前要令
H= fftshift (H)。
Step4.将变换乘以滤波函数:
G = H.*F;
Step5.获得G的傅里叶逆变换的实部:
g=real (ifft2(G));
Step6:将右上部的矩形修剪为原始大小
g=g(1:size(f,1),1:size(f,2));
如果看不懂没关系,后面会举例子。
二、空间滤波与频域滤波的比较这个实验比较有综合性,也能有助于我们更透彻的掌握滤波这部分的内容。
题目:空间滤波和频域滤波的比较
Step1:获得图像f的傅里叶频谱
g=imread('hh.jpg');
f=rgb2gray(g);
subplot(2,3,1);
imshow(f)
F=fft2(f);
S=fftshift(log(1 + abs(F)) ) ;
S = gscale(S) ;
subplot(2,3,2);
imshow(S)
Step2:生成滤波器
空间滤波器
h=fspecial('sobel')'
h=[1 0 -1;2 0 -2;1 0 -1];
freqz2(h) %查看滤波器图形
频域滤波器可以用如下函数生成:
PQ = paddedsize (size(f));
H = freqz2 (h,PQ(1),PQ(2)) ;
H1 = ifftshift(H);
subplot(2,2,1);
imshow(abs(H), [ ])
subplot(2,2,2);
imshow (abs (H1), [ ])
(以图像的形式显示了H和H1的绝对值)
Step3:生成滤波后的图像
在空间域中,我们使用
gs=imfilter(double(f),h);
频域中,注意这个函数也需要自己定义,可以关注公众号获取源代码
gf=dftfilt(f,H1);
让他们显示在一起
subplot(2,3,4);
imshow(gs)
subplot(2,3,5);
imshow(gf)
这就是分别进行两种滤波后的效果图, 图像中的灰色调是由于gs和gf存在负值,这会使得图像的平均值在使用命令imshow后增大。我们再进行操作
>> figure, imshow(abs(gs),[ ])>> figure, imshow (abs(gf), [])
这是上面两幅图片的绝对值
通过c创建一幅阈值二值图像,我们可以更清楚的看到边缘
subplot(1,2,1);
imshow(abs(gs)>0.2*abs(max(gs(:))));
subplot(1,2,2);
imshow(abs(gf)>0.2*abs(max(gf(:))));
使用空间域滤波和频域滤波得到的图像对所有实用目的来说,都是相同的。下面我们通过计算它们的关来确证这一点:
>>d = abs(gs - gf) ;
最大差和最小差别分别为
>> max(d(:) )
ans =
5.4015e-012
>> min(d(:) )
ans =
0
图像滤波分为空间域滤波和频域滤波,空间滤波的内容见本人的另一篇文章:
清逸:MATLAB中图像变换之线性空间滤波:
https://zhuanlan.zhihu.com/p/187517189
深入了解傅里叶变换请戳这里哦!!
Heinrich:傅里叶分析之掐死教程(完整版):
https://zhuanlan.zhihu.com/p/19763358
关于MATLAB的学习:
大家可以关注我们的知乎专栏——数据可视化和数据分析中matlab的使用:
https://zhuanlan.zhihu.com/c_1131568134137692160
欢迎大家加入我们的MATLAB学习交流群:953314432
这篇有点长,如果感觉对自己有用的话,可以点个赞,别老是偷偷的收藏哦。
▼往期精彩回顾▼图像处理中的代数运算及几何变换数据预处理——噪声值平滑处理数据预处理小结MATLAB中的非线性空间滤波基础扫码关注我们更多精彩等待你发现出品:Asoul水云天课堂工作室好看你就点点我