在前两篇文章中,我们实现了图像的离散傅里叶变换与反变换,而这正是对图像频率域进行处理的前提。接下来这篇文章打算在已有工作的基础上实现高斯滤波器,对图像进行简单的频率域滤波。
一、频率域滤波基础
在上一篇关于FFT的文章中已经介绍到,相比于核数较大的空间域滤波来说,频率域滤波有着明显的优势。此外,频率域还有一些其他特性,如远离变换的原点时,低频对应于图像中变化缓慢的灰度分量;而更加远离原点时,较高的频率开始对应于图像中越来越快的灰度变化,它们是图像中由灰度急剧变化表征的物体边缘或其他分量。正是这些特性,能够让我们得到一些试验性的结果,后面我们可以看到。
那么如何进行频率域滤波呢。一般来说,其步骤是先修改一幅图像的傅里叶变换,然后计算其反变换,得到处理结果的空间域表示。因此,若已知大小为

式中,




简单来说,频率域的滤波过程可以总结为以下几步:1、进行傅里叶变换及中心化;2、构建一个传递函数

#实现滤波
def filter(img, trans):
#先转换至频域并中心化
F = fft_2d(img)
F_shift = fshift(F)
#与传递函数对应元素相乘
F_trans = F_shift * trans
#进行逆变换并得到实部
img_out = np.abs(ifft_2d(ifshift(F_trans)))
return img_out
二、高斯低通滤波器
可以看到,前面我们早就实现了傅里叶变换及反变换,现在最主要的问题就是构建滤波器函数。首先介绍低通滤波器,图像中的边缘和其他急剧的灰度变化(如噪声)主要影响其傅里叶变换的高频内容。因此,在频率域中时通过衰减高频(即低通滤波)来实现平滑模糊的。高斯低通滤波器(GLPF)传递函数有如下形式:

式中,





根据公式,代码实现如下。
#计算高斯低通滤波器的传递函数
def GLPF(h, w, D):
#获取索引矩阵及中心点坐标
x, y = np.mgrid[0:h, 0:w]
center = (int((h-1)/2), int((w-1)/2))
#计算中心距离矩阵
dis_square = (x-center[0])**2 + (y-center[1])**2
#计算变换矩阵
transfor = np.exp(- dis_square / (2*D**2))
return transfor
三、高斯高通滤波器
前面说过,衰减图像的傅里叶变换中的高频分量可以平滑图像。因为边缘和其他灰度的急剧变化与高频分量有关,因此可在频率域中通过高通滤波来实现图像锐化,高通滤波衰减傅里叶变换中的低频分量而不干扰高频信息。
高通滤波器的实现非常简单,在频率域中用1减去低通滤波器传递函数即可得到:
式中,
同样,下面展示了一个GHPF的透视图、图像和径向剖面。

下面是GHPF的代码实现,可以看到只是最后用1减去了GLPF。
#计算高斯高通滤波器的传递函数
def GHPF(h, w, D):
#获取索引矩阵及中心点坐标
x, y = np.mgrid[0:h, 0:w]
center = (int((h-1)/2), int((w-1)/2))
#计算中心距离矩阵
dis_square = (x-center[0])**2 + (y-center[1])**2
#计算变换矩阵
transfor = 1 - np.exp(- dis_square / (2*D**2))
return transfor
四、效果展示
展示下实验效果,用两张不同的图片分别测试了原图以及

(a)原图;(b)D值为2;(c)D值为5;(d)D值为10;(e)D值为20;(f)D值为50

(a)原图;(b)D值为2;(c)D值为5;(d)D值为10;(e)D值为20;(f)D值为50
五、多说两句
到此为止,我想写的关于图像处理领域的文章就写完了,后面这个专栏不会再更新了(大概),毕竟不管怎么说,图像处理也并不是我的兴趣领域。但如果后面同学有希望我介绍的东西,也可以私信或者发在评论区,我可以尽力去尝试一下。最后,这篇文章也参考了《冈萨雷斯 数字图像处理(第四版)》一书,感谢前辈大佬的总结。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/10593.html