1 - 引言
在前面我们讨论了高通和低通滤波器对图像进行处理,它们都是在整个图像的频率矩阵上操作,但是在很多应用中,我们感兴趣是处理指定的频段或频率矩形的小区域,因此需要使用选择性滤波,选择性滤波主要有两类
- 带阻滤波器或带通滤波器
- 陷波滤波器
下面就让我们来介绍一下这两种滤波器
2 - 带阻滤波器和带通滤波器
这种类型的滤波器很容易使用前面的概念来构建,前面我们学习了理想、布特沃斯和高斯滤波器,则我们可以通过这些滤波器构建新的带阻滤波器
带通滤波器则为:
下面以图像的形式来展示一个高斯带通滤波器
这个滤波器本质上与前面的滤波器没有很大的改变,因此不再进行试验分析(详情可见之前的笔记)
3 - 陷波滤波器
陷波滤波器是更有用的选择性滤波器可以有效的去除周期性噪声。陷波滤波器可以用高通滤波器的乘积来构造。一般形式为:
其中,
和
是高通滤波器。
距离的计算:
和
例如,下面一个用理想低通滤波器,它包含两个陷波对
进行莫尔波纹的过滤
import cv2
import numpy as np
import matplotlib.pyplot as plt
#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
img = cv2.imread('images/2.jpg',0) #直接读为灰度图像
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
s1 = np.log(np.abs(fshift))
plt.subplot(221),plt.imshow(img,'gray'),plt.title('原始图像')
plt.subplot(222),plt.imshow(s1,'gray'),plt.title('中心频率域')
w , h = img.shape
"""设计理想陷波滤波器"""
flt = np.zeros(img.shape)
rx1 = w / 4
ry1 = h / 2
rx2 = w*3/4
ry2 = h/2;
r = min(w,h)/6 #半径
for i in range(1,w):
for j in range(1,h):
if ((i - rx1)**2 + (j - ry1)**2 >= r**2) and ((i - rx2)**2 + (j - ry2)**2 >= r**2):
flt[i,j] = 1
plt.subplot(223),plt.imshow(flt,'gray'),plt.title('陷波滤波器')
new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*flt)))
plt.subplot(224),plt.imshow(new_img,'gray'),plt.title('滤波后图像')
plt.show()
可以看到我们原始图像含有较多的莫尔波纹,我们可以通过构建不同的陷波滤波器对图像进行滤波
可见大部分的莫尔波纹已经被过滤,但是图片也因为滤波失去信息而变得平滑模糊,这时候我们可以选用不同数量和不同的单个滤波器种类来达到更好的效果。
4 - 小结
到这里,对于滤波器的学习可以做一个小结,我们学习了在空间域、频域的高通、低通滤波器对图像做增强操作,我们在以后的实践中,可以灵活的构建和使用多种滤波器为我们需要识别的图片进行预处理,以达到更好的识别效果。