matlab选择合适的滤波器图像进行ditog滤波_傅里叶变换在MATLAB中的应用(频域滤波)...

图像滤波分为空间域滤波和频域滤波,空间滤波的内容见本人的另一篇文章:

清逸:MATLAB中的图像变换之线性空间滤波​zhuanlan.zhihu.com
19cd1ba6b3da2050459c1c1f6bdd985d.png

本文主要讲述如何在MATLAB中实现频域滤波,那么,怎么实现呢,我们这里讲的所有的滤波都是通过傅里叶变换在频域中实现的,所有这部分和傅里叶变换渊源很深,至于傅里叶变换本身,我自己也不能解释的很清楚,我们只讲他如何在matlab中实现和应用。深入了解傅里叶变换请戳:

Heinrich:傅里叶分析之掐死教程(完整版)更新于2014.06.06​zhuanlan.zhihu.com
e38579aac5b7b81b0930b06b503ef7c3.png

大佬介绍的深入浅出,每每有茅塞顿开之感,大家学完教材上有关傅里叶变换的,再看看文中所写,真的是柳暗花明,瞻仰大佬之余,大家别忘了切回来啊,我们继续讲MATLAB。

一,图像增强中的频域滤波(通过傅里叶变换实现)

1.频域滤波的基本概念

空间域和频域线性滤波的基础都是卷积定理,该定理可以写作:

4a54df6d02dbe58c24d512f78510ada8.png

至于卷积定理本身是什么,大家可以看看知乎上另一个大佬的解释:

J Pan:“卷积”其实没那么难以理解​zhuanlan.zhihu.com
762e6eb0313d6164ee9363e264875219.png

我们依旧是只讲述滤波问题,我们这里需要知道的是,频域滤波的目的是选择一个滤波器传递函数,以便按照指定的方式修改F(u,v)。例如,图(a)所示的滤波器有一- 个传递函数,在乘以-一个居中处理后的函数F(u, 0)后,该传递函数会衰减F(u, v)的高频分量,而保持低频分量相对不变。具有这种特性的滤波器称为低通滤波器。低通滤波器的结果会导致图像出现模糊现象(平滑)。

d22c93978b0b8abc5072e1b0b974c773.png

基于卷积理论,我们知道为了在空间域中得到相应的滤波后的图像,仅需要计算积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)

9c0105cd1f66f338fda748b1eb2795b6.png
原图像的灰度图和他的傅里叶频谱

Step2:生成滤波器

空间滤波器

h=fspecial('sobel')'
h=[1 0 -1;2 0 -2;1 0 -1];
freqz2(h)    %查看滤波器图形

0be9fc58c24c9e0a02038c90be1deae8.png

频域滤波器可以用如下函数生成:

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

0414441db434832282d1dbf58d9857ec.png
以图像的形式显示了H和H1的绝对值

Step3:生成滤波后的图像

在空间域中,我们使用

gs=imfilter(double(f),h);

频域中,注意这个函数也需要自己定义,可以关注公众号获取源代码

gf=dftfilt(f,H1);

让他们显示在一起

subplot(2,3,4);
imshow(gs)
subplot(2,3,5);
imshow(gf)

25610cbf68fce05ad2117747a17b0bcf.png

这就是分别进行两种滤波后的效果图, 图像中的灰色调是由于gs和gf存在负值,这会使得图像的平均值在使用命令imshow后增大。我们再进行操作

>> figure, imshow(abs(gs),[ ])>> figure, imshow (abs(gf), [])

5addfab17c6d07292676ca30547f0b35.png

这是上面两幅图片的绝对值

通过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(:))));

6450e5cc8ec6d17d9a7a717324c58943.png

使用空间域滤波和频域滤波得到的图像对所有实用目的来说,都是相同的。下面我们通过计算它们的关来确证这一点:

>>d = abs(gs - gf) ;

最大差和最小差别分别为

>> max(d(:) )
ans =
  5.4015e-012
>> min(d(:) )
ans =
     0

这篇有点长,如果感觉对自己有用的话,可以点个赞,别老是偷偷的收藏哦

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值