在一幅图像中,其低频成分对应者图像变化缓慢的部分,对应着图像大致的相貌和轮廓,而其高频成分则对应着图像变化剧烈的部分,对应着图像的细节(图像的噪声也属于高频成分)。

低通滤波器

低频滤波器,顾名思义,就是过滤掉或者大幅度衰减图像的高频成分,让图像的低频成分通过。低频滤波器可以平滑图像,虑去图像的噪声,而与此相反的高频滤波器,则是过滤低频成分,通过高频成分,可以达到锐化图像的目的。
理想低通滤波器的滤波非常尖锐,而高斯低通滤波器的滤波则非常平滑。Butterworth低通滤波器则介于两者之间,当Butterworth低通滤波器的阶数较高时,接近于理想低通滤波器,阶数较低时,则接近于高斯低通滤波器。

理想低通滤波器在以原点为圆心、D0为半径的园内,通过所有的频率,而在圆外截断所有的频率。(圆心的频率最低,为变换的直流(dc)分量)。
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

高通滤波器

高通滤波器靠近频谱图中心的低频部分给舍弃掉,远离频谱图中心的高频部分保留。通常会保留物体的边界。其实图像的锐化往往也可以使用高通滤波器来实现,因为锐化的时候需要加强边界,而边界部分正是高频成分将lh设置为1代表高通滤波器
在这里插入图片描述

陷波滤波器

频率域技术滤除周期噪声可行的原因是周期噪声在对应于周期干扰的频率处,以集中的能量脉冲形式出现。滤除的方法之一是选择性滤波器(带阻、带通和陷波)。图像可能在生成、传输或者采集过程中夹带了噪声,去噪声是图像处理中常用的手法。通常去噪声用滤波的方法,比如中值滤波、均值滤波。但是那样的算法不适合用在处理字符这样目标狭长的图像中,因为在滤波的过程中很有可能会去掉字符本身的像素。
陷波滤波器阻止或通过事先定义的中心频率的邻域内的频率,由于傅立叶变换的对称性,陷波滤波器必须以关于原点对称的形式出现(如果陷波滤波器位于原点处陷波滤波器是其本身)。同样,也可以得到陷波带阻滤波器相对应的陷波带通滤波器通过而不是已知陷波区域中所包含频率的陷波滤波器。

各滤波器实验

1、理想低通滤波器

代码如下:

def low_pass_filter(img, radius=80):
    rows, cols = img.shape
    center = int(rows/2), int(cols/2)

    mask = np.zeros((rows, cols, 2), np.uint8)
    x, y = np.ogrid[:rows, :cols]
    mask_area = (x-center[0])**2+(y-center[1])**2 <= radius*radius
    mask[mask_area] = 1
    return mask

在这里插入图片描述

2、高斯滤波器

代码如下:

def gaus_filter(img, radius=80):
    rows, cols = img.shape
    center = int(rows/2), int(cols/2)

    mask = np.zeros((rows, cols, 2), np.float32)
    for i in range(rows):
        for j in range(cols):
            dist = (i-center[0])**2+(j-center[1])**2
            mask[i, j] = np.exp(-0.5*dist/(radius**2))
    return mask

在这里插入图片描述

3、巴特沃斯滤波器

代码如下:

def bw_filter(img, radius=80, n=2):
    rows, cols = img.shape
    center = int(rows / 2), int(cols / 2)

    mask = np.zeros((rows, cols, 2), np.float32)
    for i in range(rows):
        for j in range(cols):
            dist = (i - center[0]) ** 2 + (j - center[1]) ** 2
            mask[i, j] = 1/(1+(dist/radius)**(n/2))
    return mask

---

4、陷波滤波器

代码如下:

def notch_filter(img, h, w):
    rows, cols = img.shape
    center = int(rows / 2), int(cols / 2)

    mask = np.zeros((rows, cols, 2), np.float32)
    for u in range(rows):
        for v in range(cols):
            mask[u,v]=0
    for u in range(rows):
        for v in range(cols):
            if abs(u - center[0]) < h and abs(v - center[1]) < w:
                mask[u, v] = 1

    return mask

---

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐