天天看点

《精通Matlab数字图像处理与识别》一6.5 频域低通滤波器

本节书摘来自异步社区《精通matlab数字图像处理与识别》一书中的第6章,第6.5节,作者 张铮 , 倪红霞 , 苑春苗 , 杨立红,更多章节内容可以访问云栖社区“异步社区”公众号查看

精通matlab数字图像处理与识别

在频谱中,低频主要对应图像在平滑区域的总体灰度级分布,而高频对应图像的细节部分,如边缘和噪声。因此,图像平滑可以通过衰减图像频谱中的高频部分来实现,这就建立了空间域图像平滑与频域低通滤波之间对应关系。

1.理论基础

最容易想到的衰减高频成份的方法就是在一个称为“截止频率”的位置“截断”所有的高频成份,将图像频谱中所有高于这一截止频率的频谱成份设为0,低于截止频率的成份设为保持不变。能够达到这种效果的滤波器如图6.16所示,我们称之为理想低通滤波器。如果图像的宽度为m,高度为n,那么理想低通频域滤波器可形式化地描述为

《精通Matlab数字图像处理与识别》一6.5 频域低通滤波器

其中d 0表示理想低通滤波器的截止频率,滤波器的频率域原点在频谱图像的中心处,在以截止频率为半径的圆形区域之内的滤镜元素值全部为1,而该圆之外的滤镜元素值全部为0。理想低通滤波器的频率特性在截止频率处十分陡峭,无法用硬件实现,这也是我们称之为理想的原因,但其软件编程的模拟实现较为简单。

理想低通滤波器可在一定程度上去除图像噪声,但由此带来的图像边缘和细节的模糊效应也较为明显,其滤波之后的处理效果比较类似于5.3.1中的平均平滑。实际上,理想低通滤波器是一个与频谱图像同样尺寸的二维矩阵,通过将矩阵中对应较高频率的部分设为0,较低频率的部分(靠近中心)设为1,可在与频谱图像相乘后有效去除频谱的高频成份(由于是矩阵对应元素相乘,频谱高频成份与滤波器中的0相乘)。其中0与1的交界处即对应滤波器的截止频率。

《精通Matlab数字图像处理与识别》一6.5 频域低通滤波器

2.matlab实现

利用我们编写的imidealflpf函数可以得到截止频率为freq的理想低通滤波器。

上述程序的运行效果如图6.17和图6.18所示。

《精通Matlab数字图像处理与识别》一6.5 频域低通滤波器
《精通Matlab数字图像处理与识别》一6.5 频域低通滤波器

从图6.17和图6.18可见,当截止频率非常低时,只有非常靠近原点的低频成份能够通过,图像模糊严重;截止频率越高,通过的频率成份就越多,图像模糊的程度越小,所获得的图像也就越接近原图像。但可以看出,理想低通滤波器并不能很好地兼顾噪声滤除与细节保留两个方面,这和空域中采用平均模板时的情形比较类似。下面,我们将介绍频域的高斯低通滤波器,并比较它与理想低通滤波器的处理效果。

高斯低通滤波器的频率域二维形式由下式给出。

《精通Matlab数字图像处理与识别》一6.5 频域低通滤波器

高斯函数具有相对简单的形式,而且它的傅立叶变换和傅立叶反变换都是实高斯函数。为了简单起见,下面仅给出一个一维高斯函数的傅立叶变换和傅立叶反变换作为例子,式(6-52)告诉我们一维高斯函数的傅立叶反变换和正变换仍为高斯函数,该式的证明留给有兴趣的读者自己完成(提示:可以利用高斯分布的概率密度函数在定义域上积分为1的性质)。

《精通Matlab数字图像处理与识别》一6.5 频域低通滤波器

式中:σ是高斯曲线的标准差。

频域和与之对应的空域一维高斯函数的图形如图6.19所示。

《精通Matlab数字图像处理与识别》一6.5 频域低通滤波器
《精通Matlab数字图像处理与识别》一6.5 频域低通滤波器

从图6.19可以发现,当σ增大时,h(u)的图像倾向于变宽,而h(x)的图像倾向于变窄和变高。这也体现了频率域和空间域的对应关系。频率域滤波器越窄,滤除的高频成份越多,图像就越平滑(模糊);而在空间域,对应的滤波器就越宽,相应的卷积模板越平坦,平滑(模糊)效果就越明显。

我们在图6.20中分别给出σ取值为3和1时的频域二维高斯滤波器的三维曲面表示,可以看出频域下的二维高斯滤波器同样具有上述一维情况时的特点。

《精通Matlab数字图像处理与识别》一6.5 频域低通滤波器

f<code>`</code>javascript

unction out = imgaussflpf(i, sigma)

% imgaussflpf函数 构造频域高斯低通滤波器

% i参数 输入的灰度图像

% sigma参数 高斯函数的sigma参数

[m,n] = size(i);

out = ones(m,n);

for i=1:m

end

i = imread('../baby_noise.bmp'); %读入原图像

% 生成滤镜

ff = imgaussflpf (i, 20);

% 应用滤镜

out = imfreqfilt(i, ff);

figure (1);

subplot(2,2,1);

imshow(i);

title('source');

% 计算fft并显示

temp = fft2(double(i));

temp = fftshift(temp);

temp = log(1 + abs(temp));

figure (2);

imshow(temp, []);

subplot(2,2,2);

imshow(out);

title('gauss lpf, sigma=20');

temp = fft2(out);

title(' gauss lpf, sigma=20');

ff = imgaussflpf (i, 40);

subplot(2,2,3);

title('gauss lpf, sigma =40');

title(' gauss lpf, sigma =40');

ff = imgaussflpf (i, 60);

subplot(2,2,4);

title('gauss lpf, sigma =60');

title(' gauss lpf, sigma =60');

继续阅读