欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Gabor滤波

程序员文章站 2022-07-11 23:47:16
...

最近在处理头部姿态问题中,用到了Gabor小波,写一篇文章来简单记录一下。

在图像处理中,Gabor函数是一个用于边缘提取的线性滤波器。Gabor滤波器的频率和方向表达同人类视觉系统类似。Gabor滤波器十分适合纹理表达和分离。在空间域中,一个二维Gabor滤波器是一个由正弦平面波调制的高斯核函数。

gabor公示如下所示:简单看看就好

Gabor滤波

 

gabor公式分为实部和虚部,用实部进行滤波后图像平滑;虚部滤波后用来检测边缘。确实存在Gabor的奇函数部分做边缘提取。例如我在翻阅头部姿态相关文章时,很多文献都写的是使用奇函数部分。例如Volker Krueger  Gerald Sommer  编写的:《Gabor Wavelet Networks for Effificient Head Pose Estimation》 文章中截屏如下所示:

Gabor滤波

Gabor滤波器的脉冲响应(第三张图),可以定义为一个正弦波(第一张图)(对于二维Gabor滤波器是正弦平面波)乘以高斯函数(第二张图)。如下图所示

Gabor滤波Gabor滤波Gabor滤波

由于乘法卷积性质,Gabor滤波器的脉冲响应的傅立叶变换是其调和函数的傅立叶变换和高斯函数傅立叶变换的卷积。该滤波器由实部和虚部组成,二者相互正交。一组不同频率不同方向的Gabor函数数组对于图像特征提取非常有用。

参数部分:

波长(λ):它的值以像素为单位指定,通常大于等于2.但不能大于输入图像尺寸的五分之一。通常用的是它的倒数频率f大于等于0.2。

方向(θ):这个参数指定了Gabor函数并行条纹的方向,它的取值为0到360度

相位偏移(φ):它的取值范围为-180度到180度。其中,0he180度分别对应中心对称的center-on函数和center-off函数,而-90度和90度对应反对称函数。

长宽比(γ):空间纵横比,决定了Gabor函数形状(support,我翻译为形状)的椭圆率(ellipticity)。当γ= 1时,形状是圆的。当γ< 1时,形状随着平行条纹方向而拉长。

还有一个σ,它的话,在代码实现里常常是滤波器大小的一半。

在实际使用gabor的话,我们一般用的是它的实数部分,也是就说,我们就是根据第三个公式求gabor滤波器的。

实验结果图片:在代码中,我们设置了六个波长,四个角度,所以会出现24张gabor处理图

Gabor滤波

代码,改一改图片地址就行:

# coding:utf-8
import cv2
import numpy as np
import pylab as pl
from PIL import Image


# 构建Gabor滤波器
def build_filters():
    filters = []
    ksize = [7, 9, 11, 13, 15, 17]  # gabor尺度 6个
    # ksize = [5, 10]
    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(2):
            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)
    return filters


# 滤波过程
def process(img, filters):
    accum = np.zeros_like(img)
    for kern in filters:
        fimg = cv2.filter2D(img, cv2.CV_8UC3, kern)
        np.maximum(accum, fimg, accum)
    return accum


# 特征图生成并显示
def getGabor(img, filters):
    image = Image.open(img)
    img_ndarray = np.asarray(image)
    res = []  # 滤波结果
    for i in range(len(filters)):
        res1 = process(img_ndarray, filters[i])
        res.append(np.asarray(res1))

    pl.figure(2)
    for temp in range(len(res)):
        pl.subplot(4, 6, temp + 1)  # 画4*6格子
        pl.imshow(res[temp], cmap='gray')
    pl.show()

    return res


if __name__ == '__main__':
    filters = build_filters()
    getGabor('75.png', filters)

 

参考:

https://www.cnblogs.com/MaiYatang/p/5135813.html

https://blog.csdn.net/ankertqf/article/details/81237375