Gabor 滤波

Gabor 变换

http://blog.sina.com.cn/s/blog_48a242d601000a3j.html

Gabor变换属于加窗傅立叶变换,Gabor函数可以在频域不同尺度、不同方向上提取相关的特征。另外Gabor函数与人眼的生物作用相仿,所以经常用作纹理识别上,并取得了较好的效果。

 

Gabor变换是短时Fourier变换中当窗函数取为高斯函数时的一种特殊情况.

 

Gabor变换的本质实际上还是对二维图像求卷积。因此二维卷积运算的效率就直接决定了Gabor变换的效率。在这里我先说说二维卷积运算以及如何通过二维傅立叶变换提高卷积运算效率.关于离散二维叠加和卷积的运算介绍的书籍比较多,我这里推荐William K. Pratt著,邓鲁华 张延恒 等译的《数字图像处理(第3版)》,其中第7章介绍的就是这方面的运算.

Gabor <wbr>变换(1)

A可以理解成是待处理的笔迹纹理,B可以理解成Gabor变换的核函数,现在要求A与B的离散二维叠加卷积,我们首先对A的右边界和下边界填充0(zero padding),然后将B进行水平翻转和垂直翻转,如下图:

Gabor <wbr>变换(1)

然后用B中的每个值依次乘以A中相对位置处的值并进行累加,结果填入相应位置处(注意红圈位置)。通常二维卷积的结果比A、B的尺寸要大。如下图所示:

Gabor <wbr>变换(1)

2、快速傅立叶变换卷积

根据傅立叶变换理论,对图像进行二维卷积等价于对图像的二维傅立叶变换以及核函数的二维傅立叶变换在频域求乘法。通过二维傅立叶变换可以有效提高卷积的运算效率。但在进行傅立叶变换时一定要注意“卷绕误差效应”,只有正确对原有图像以及卷积核填补零后,才能得到正确的卷积结果。

 

二维Gabor函数可以表示为:


 

Gabor <wbr>变换(1)


其中:


 

Gabor <wbr>变换(1)


v的取值决定了Gabor滤波的波长,u的取值表示Gabor核函数的方向,K表示总的方向数。参数Gabor <wbr>变换(1)决定了高斯窗口的大小,这里取Gabor <wbr>变换(1). 程序中取4个频率(v=0, 1, ..., 3),8个方向(即K=8,u=0, 1, ... ,7),共32个Gabor核函数。不同频率不同方向的Gabor函数可通过下图表示:

Gabor <wbr>变换(1)


Gabor <wbr>变换(1)Gabor <wbr>变换(1)


 图片来源:http://www.neuroinformatik.ruhr-uni-bochum.de/ini/VDM/research/computerVision/
imageProcessing/wavelets/gabor/gaborFilter.html


Gabor <wbr>变换(1)

所谓目标识别,从某种意义上说就是特征识别的问题。而红外图特征提取的角度一般可以从几何形状和上下文的判断中得到,比如说,当你在一幅图像中去搜索桥梁和机场的跑道的时候,我们可以从形状上发现他们都是一组平行线;然后基于上下文去判断,桥梁的长度肯定比跑道短,桥梁的两边一般是水域,而跑道的中间有一些联络道,而这些这些联络道本身也是平行线。

  

通常用这种仅仅利用图像本身的知识去判断的时候,时常由于经验的限制,识别率总是没有办法做到很好!虽然图像所一些早期的论文里都声称,识别率能够达到90%以上,但是那只是用自己搜集的有利于自己算法的图片得出来的结果而已!

 

言规正传,由于种种努力,我们发现了频率的概念,频率的本质就是反映变化快慢的物理量。因此当我们把一幅图像f(x,y)通过傅立叶变换变成F(u,v)进入频率域的时候,w=sqrt(u2+v2) 的大小,则直接体现了原图像中灰度值变化速率的大小。于是人们发现了滤波的方法,如通过低通滤波器将图像中的噪声去掉,同时把一些突变的地方变得平滑,而高通滤波器则可以把图像的边缘特征加以锐化。

 

但是很快大家就发现了傅立叶变换的一个缺陷,傅立叶变换在很大程度上只是一个体现大局观的概念,而无法反映图像局部的特点,因此我们无法通过傅立叶变换来对图像进行细节上更准确的操作。幸运的是,人们之后的研究中,发现了Gabor于1946年发表的论文《the Theory of Communication》,于是在识别的方法上,尤其在纹理识别上达到了一个新的高度。当然小波变换的应用也是差不多这个时间段开始的,由此我们也可以理解数学在图像领域的价值!

 

Gabor滤波的本质是提取图像的特征分量,通常应用的领域有指纹识别,虹膜识别,人脸识别等。

 

所谓gabor的价值由来是由于人们对傅立叶频率分析的需求来的,因此,当我们去使用gabor滤波器的时候,就一定要结合对图象频率的分析。这一点表面上简单而直接,实际却被大部分的研究者忽略。关于这部分的研究,可以在各大搜索引擎上检索关键:"fourier power spectrum"。如果使用matlab,可以使用下面的语句将图象转换到频率域:

function fps(I)  g=log(abs(fftshift(fft2(double(I)))));  %通过一定的技巧我们也可以将频率精度扩大

imview(g,[]); 注意不能用imshow;

      传统的gabor滤波器的思想,就是把图象不同的频率范围分别滤出来,然后提取滤波图象的特征分量加以分类。而一些对gabor滤波器的设计正是从这个角度来考虑。至于相邻的滤波器在频率区域的有效部分是相切还是重叠,则一直是争论的话题。甚至有些人因此从gabor小波的角度去设计。

       关于gabor滤波器的参数本身有4个(wf:center frequency  theta:angle  sigmax,sigmay:extend of gaussian function),90年代的时候,很多文献将sigmax=sigmay,于是参数变成3个;本世纪的时候,人们由于我在上面一段阐述的道理,将sigma与wf组成反比关系。参数又变成2个。这就是现在通用的关于尺度和角度的设计。

在这里我仍然不想去针对特定的纹理,比如指纹,虹膜,文字之类的具体实现来讲更多的东西;因为那实在是已经成熟的技术。只要你慢慢照着做,就一定能达到一定程度的成功率。我想说的是一些更有趣的东西,这就是频率域本身的矛盾性;即大部分信息包含在低频部分,但低频部分的范围却很小,难以区分,因此我们其实浪费了最大量的信息。关于角度的信息,我们只要侦察到特定的角度就一定可以从相当广的频率范围下找到;但是尺度信息的话,我们只能徘徊在一个很小的区间。并且有趣的是这里很多现象象极了物理上的衍射现象。而我们一旦想深入到低频部分的话,对滤波器的设计简直就是苛刻。滤波器的鲁棒性在这里没有价值,我们需要象狐狸一样敏感。但是我相信,如果能够解决这一问题,那么我们甚至可以摈弃纹理识别的概念,而是可以说对图象识别的成功率将到达一个新的高度。
### Gabor滤波原理 Gabor滤波是一种用于图像处理中的经典技术,主要用于提取图像的纹理特征。其核心思想是对输入图像施加一系列具有不同方向尺度的Gabor滤波器[^1]。这些滤波器能够捕捉到局部空间频率的信息,从而帮助区分不同的纹理模式。 #### 数学定义 Gabor滤波器可以通过以下公式表示: \[ g(x, y; \lambda, \theta, \psi, \sigma, \gamma) = \exp\left(-\frac{x'^2+\gamma^2y'^2}{2\sigma^2}\right)\cos(2\pi\frac{x'}{\lambda}+\psi) \] 其中: - \(x' = x \cos\theta + y \sin\theta\) \(y' = -x \sin\theta + y \cos\theta\) 是坐标系旋转后的变量; - \(\lambda\) 表示正弦因子的波长; - \(\theta\) 控制滤波器的方向; - \(\psi\) 是相位偏移; - \(\sigma\) 定义高斯包络的标准偏差; - \(\gamma\) 是空间纵横比参数,控制椭圆形状。 通过调整上述参数,可以构建多组Gabor滤波器以适应多种场景下的纹理分析需求。 --- ### 实现方式 在实际应用中,通常会利用编程库完成Gabor滤波的操作。以下是基于Python及其OpenCV库的一个典型实现案例。 #### 使用 OpenCV 的 `filter2D` 函数 OpenCV 提供了便捷的方法来创建并应用 Gabor 核。下面是一个完整的代码示例,展示如何使用 Gabor 滤波器对图像进行预处理以及后续的二值化操作[^4]。 ```python import cv2 import numpy as np import matplotlib.pyplot as plt # 创建Gabor核 def build_filters(ksize=31, sigma=1.0, theta=np.pi/4, lambd=np.pi*2., gamma=0.5): gabor_filter = cv2.getGaborKernel((ksize, ksize), sigma, theta, lambd, gamma, psi=0, ktype=cv2.CV_32F) return gabor_filter # 应用Gabor滤波器 def apply_gabor(image, filter_kernel): filtered_image = cv2.filter2D(image, cv2.CV_8UC3, filter_kernel) return filtered_image # 加载灰度图片 image = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE) # 构建Gabor滤波器 kernel = build_filters() # 对图像执行卷积运算 result = apply_gabor(image, kernel) # 显示原图与结果对比 plt.figure(figsize=(10, 5)) plt.subplot(121), plt.imshow(image, cmap='gray'), plt.title('Original Image') plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(result, cmap='gray'), plt.title('Filtered Image') plt.xticks([]), plt.yticks([]) plt.show() ``` 此脚本展示了如何生成自定义的Gabor核并通过`cv2.filter2D()`将其应用于目标图像上。最终得到的结果可用于进一步增强或分割感兴趣的区域。 --- ### Log-Gabor 滤波器简介 值得注意的是,在某些情况下,传统的Gabor滤波可能并不完全满足特定任务的需求。因此出现了改进版本——Log-Gabor滤波器。相比于标准形式,后者具备更优的表现力特别是在模拟人类视觉系统的响应方面更为接近真实情况[^3]。具体而言,它允许更加灵活地调节频谱范围内的权重分布,使得对于复杂背景下的细节保留能力更强一些[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值