图像处理:Gabor滤波器简介以及python实现

在图像处理中,以Dennis Gabor命名的Gabor滤波器是一种用于纹理分析的线性滤波器,本质上是指在分析点或分析区域周围的局部区域内,分析图像中是否存在特定方向的特定频率内容。Gabor滤波器的频率和方向表示被许多当代视觉科学家认为与人类视觉系统的频率和方向表示相似。它们被发现特别适合于纹理表征和辨别。
在空间域,二维Gabor滤波器是由正弦平面波调制的高斯核函数(见Gabor变换)。
一些作者声称,哺乳动物大脑视觉皮层中的简单细胞可以用Gabor函数来模拟。因此,用Gabor滤波器进行图像分析被一些人认为类似于人类视觉系统中的感知。

  1. 定义
    它的脉冲响应由正弦波(二维Gabor滤波器的平面波)乘以高斯函数定义。
    由于Gabor滤波器脉冲响应的乘法卷积性质(卷积定理),其傅里叶变换等于谐波函数(正弦函数)的傅里叶变换与高斯函数的傅里叶变换的卷积。滤波器有一个实分量和一个虚分量表示正交方向。这两个分量可以组成一个复数,也可以单独使用。
    请添加图片描述
    在这个公式中,图像处理:Gabor滤波器简介以及python实现
    这五个参数分别表示正弦因子的波长,Gabor函数的法线到平行条纹的方向,为相位偏移,高斯的sigma标准差,空间长宽比,Gabor函数支持的椭圆度。

  2. 小波空间
    Gabor滤波器与Gabor小波直接相关,因为它们可以被设计为许多膨胀和旋转。然而,一般情况下,对Gabor小波不进行展开,因为展开需要计算双正交小波,这可能非常耗时。因此,通常会创建一个由各种尺度和旋转的Gabor滤波器组成的滤波器组。滤波器与信号卷积,形成所谓的Gabor空间。
    图像处理:Gabor滤波器简介以及python实现
    上图Gabor滤波器在中文OCR中的应用演示。4个方向显示在右边0°,45°,90°和135°。原始的图片和所有四个方向的叠加显示在左边。

  3. 图像特征提取
    一组不同频率和方向的Gabor滤波器可能有助于从图像中提取有用的特征。在离散域中,二维Gabor滤波器由:
    图像处理:Gabor滤波器简介以及python实现
    其中B和C是待确定的归一化因子。
    二维Gabor滤波器在图像处理中有着丰富的应用,特别是在纹理分析和分割的特征提取方面。f定义了在纹理中寻找的频率。通过改变theta,我们可以寻找面向特定方向的纹理。通过改变sigma,我们改变了支持或被分析图像区域的大小。

  4. 2-D Gabor滤波器在图像处理的应用
    在图像处理中,Gabor特征是识别的理想选择。在文档图像处理中,Gabor特征是识别多语言文档中单词的脚本的理想选择由于文本具有丰富的高频成分,而图片本质上相对平滑,不同频率和不同方向的Gabor滤波器已被用于从复杂文档图像(包括灰色和彩色)中定位和提取纯文本区域。它还被应用于面部表情识别。Gabor滤波器在模式分析中也得到了广泛的应用。例如,它已被用于研究脊柱多孔海绵状小梁内的指向性分布。Gabor空间在光学字符识别、虹膜识别和指纹识别等图像处理应用中非常有用。特定空间位置的激活之间的关系在图像中的物体之间非常不同。此外,重要的激活可以从Gabor空间中提取,以创建一个稀疏的对象表示。

  5. 上例子
    这个代码有以下步骤(1)读图片(2)构造gabor不同方向的卷积核(3)进行gabor滤波

import cv2,os
import numpy as np
import matplotlib.pyplot as plt

def get_img(input_Path):
    img_paths = []
    for (path, dirs, files) in os.walk(input_Path):
        for filename in files:
            if filename.endswith(('.jpg','.png')):
                img_paths.append(path+'/'+filename)
    return img_paths

#构建Gabor滤波器
def build_filters():
    filters = []
    ksize = [7,9,11,13,15,17] # gabor尺度,6个
    lamda = np.pi/2.0         # 波长
    for theta in np.arange(0, np.pi, np.pi / 4): #gabor方向,0°,45°,90°,135°,共四个
        for K in range(6):
            kern = cv2.getGaborKernel((ksize[K], ksize[K]), 1.0, theta, lamda, 0.5, 0, ktype=cv2.CV_32F)
            kern /= 1.5*kern.sum() # 这里不是很理解
            filters.append(kern)
    plt.figure(1)

    #用于绘制滤波器
    for temp in range(len(filters)):
        plt.subplot(4, 6, temp + 1)
        plt.imshow(filters[temp])
    plt.show()
    return filters

#Gabor特征提取
def getGabor(img, filters):
    res = [] #滤波结果
    for i in range(len(filters)):
        # res1 = process(img, filters[i])
        accum = np.zeros_like(img)
        for kern in filters[i]:
            fimg = cv2.filter2D(img, cv2.CV_8UC1, kern)
            accum = np.maximum(accum, fimg, accum)
        res.append(np.asarray(accum))

    #用于绘制滤波效果
    plt.figure(2)
    for temp in range(len(res)):
        plt.subplot(4, 6, temp+1)
        plt.imshow(res[temp], cmap='gray' )
    plt.show()
    return res  #返回滤波结果,结果为24幅图,按照gabor角度排列

if __name__ == '__main__':
    #    input_Path = './content'
    filters = build_filters()
    #    img_paths = get_img(input_Path)
    #    for img in img_paths:
    img = cv2.imread('/Users/guoyuhang/Documents/GitHub/process_result/land_image/2018Su_44471_clip.tif')
    getGabor(img, filters)

待gabor滤波的原图:
图像处理:Gabor滤波器简介以及python实现
gabor不同方向不同尺寸的核:
请添加图片描述
经过gabor滤波的结果图:
请添加图片描述

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年3月10日
下一篇 2023年3月10日

相关推荐