Gabor滤波及python实现

Fourier变换的不足
Fourier频率分析存在严重不足,它无法告知某些频率成分发生在哪些时间内,无法表示某个时刻信号频谱的分布情况。信号在某时刻的一个小的邻域内发生变化,那么信号的整个频谱都要受到影响,而频谱的变化从根本上来说无法标定发生变化的时间位置和发生变化的剧烈程度。傅里叶变换的时域和频域是完全分割开来的。
其实根本原因是傅里叶变换的三角基是全域性的,其局部化性质不好,因而只能得到信号的整个频谱,难以在任何有限频段上确定任意小范围内信号的局部特征

为了解决这种局部性的问题,1946年,DennisGabor提出了“窗口Fourier变换”的概念,即Gabor变换

1.Gabor 核作为图像特征
一个Gabor核能获取到图像某个频率邻域的响应情况,这个响应结果可以看做是图像的一个特征
用多个不同频率的Gabor核去获取图像在不同频率邻域的响应情况,最后就能形成图像在各个频率段的特征
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('./test.jpg')
    getGabor(img, filters)


参考文章:https://blog.csdn.net/wsp_1138886114/article/details/84841370

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2D-FFT的Gabor滤波是一种常用的图像处理方法,可以用于提取掌纹等生物特征。以下是使用 Python 实现 2D-FFT的Gabor滤波提取掌纹特征的示例代码: ```python import cv2 import numpy as np from scipy import fftpack # 读取图像 img = cv2.imread('input.jpg', 0) # 定义Gabor滤波器的参数 ksize = 31 theta = np.pi / 4 sigma = 2 * np.pi gamma = 0.5 psi = 0 # 生成Gabor滤波器的实部和虚部 kernel_real = cv2.getGaborKernel((ksize, ksize), sigma, theta, gamma, 1, psi, ktype=cv2.CV_32F) kernel_imag = cv2.getGaborKernel((ksize, ksize), sigma, theta, gamma, 1, psi + np.pi/2, ktype=cv2.CV_32F) # 对图像进行2D-FFT img_fft = fftpack.fft2(img) # 将滤波器转换为频率域 kernel_real_fft = fftpack.fft2(kernel_real, s=img.shape) kernel_imag_fft = fftpack.fft2(kernel_imag, s=img.shape) # 将滤波器应用于频率域图像 filtered_real = np.real(fftpack.ifft2(img_fft * kernel_real_fft)) filtered_imag = np.real(fftpack.ifft2(img_fft * kernel_imag_fft)) # 计算Gabor滤波器响应的幅值 gabor_response = np.sqrt(filtered_real ** 2 + filtered_imag ** 2) # 显示结果 cv2.imshow('input', img) cv2.imshow('gabor_response', gabor_response) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子中,我们首先使用 OpenCV 库中的 `cv2.imread()` 函数读取输入图像,并将其转换为灰度图像。然后,我们定义 Gabor 滤波器的参数,包括滤波器大小、方向、尺度、宽度和相位偏移等。 接下来,我们使用 OpenCV 库中的 `cv2.getGaborKernel()` 函数生成 Gabor 滤波器的实部和虚部。然后,我们使用 SciPy 库中的 `fftpack.fft2()` 函数对输入图像进行二维快速傅里叶变换,将其转换为频率域图像。 接下来,我们将 Gabor 滤波器转换为频率域,并使用 `fftpack.ifft2()` 函数将其应用于频率域图像。然后,我们计算 Gabor 滤波器响应的幅值,并使用 `cv2.imshow()` 函数显示输入图像和 Gabor 滤波器响应,并使用 `cv2.waitKey()` 和 `cv2.destroyAllWindows()` 函数等待用户按下键盘上的任意键以关闭窗口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值