因为最近毕设要用到 Gabor 特征提取,所以来总结一下对 Gabor 滤波器的理解,以及在 OpenCV 中的应用。
1 对 Gabor 滤波器的理解
Fourier 变换是一种信号处理中的有力工具,可以将图像从空域转换到频域,并提取到空域上不易提取的特征。但是 Fourier 变换缺乏时间和位置的局部信息。
Gabor 变换是一种加窗短时 Fourier 变换(简单理解起来就是在特定时间窗内做 Fourier 变换),是短时 Fourier 变换中当窗函数取为高斯函数时的一种特殊情况。因此,Gabor 滤波器可以在频域不同尺度、不同方向上提取相关的特征。另外 Gabor 函数与人眼的生物作用相仿,所以经常用作纹理识别上,并取得了较好的效果。
在二维空间中,使用一个三角函数(如正弦函数)与一个高斯函数叠加,我们就得到了一个 Gabor 滤波器。如下图所示:
2 Gabor 函数以及参数含义
二维 Gabor 函数的数学表达如下(OpenCV 里好像只用到了实数部分):
复数表达
实数部分
虚数部分
其中
下面介绍公式中各个参数的含义:
波长 (λ):表示 Gabor 核函数中余弦函数的波长参数。它的值以像素为单位指定,通常大于等于2,但不能大于输入图像尺寸的五分之一。
方向 (θ):表示 Gabor 滤波核中平行条带的方向。有效值为从0到360度的实数。
相位偏移 (φ):表示 Gabor 核函数中余弦函数的相位参数。它的取值范围为-180度到180度。其中,0度和180度对应的方程与原点对称,-90度和90度的方程分别于原点成中心对称。
长宽比 (γ):空间纵横比,决定了 Gabor 函数形状的椭圆率。当 γ=1 时,形状是圆的;当 γ<1 时,形状随着平行条纹方向而拉长。通常该值为0.5。
带宽 (b):Gabor 滤波器的半响应空间频率带宽 b 和 σ/ λ 的比率有关,其中 σ 表示 Gabor 函数的高斯因子的标准差。三者的关系如下:
σ 的值不能直接设置,它仅随着带宽 b 变化。带宽值必须是正实数,通常为1,此时,标准差和波长的关系为 σ=0.56λ。带宽越小,标准差越大,Gabor 形状越大,可见平行条纹数量越多。
3 在 OpenCV 中使用 Gabor 滤波
我在网上看到好多 OpenCV 的代码实现的 Gabor 函数,但是其实可以利用 OpenCV 的库函数,实现起来非常简单,只要几行代码。
主要的函数有以下两个:
CV_EXPORTS_W Mat getGaborKernel( Size ksize, double sigma, double theta,
double lambd, double gamma, double psi = CV_PI*0.5, int ktype = CV_64F );
CV_EXPORTS_W void filter2D( InputArray src, OutputArray dst, int ddepth,
InputArray kernel, Point anchor = Point(-1,-1), double delta = 0,
int borderType = BORDER_DEFAULT );
(哈哈哈,学会插入代码了!爱上了 Markdown 编辑器)
getGaborKernel 函数生成了一个 Gabor 滤波的核,也就是相当于一个模板。参数参见上面的说明。
filter2D 函数实现卷积运算。其中参数 ddepth 表示目标图像深度,ddepth=-1 表示生成与原图像深度相同的图像。
4 效果展示
我用了一张视频截图来做的滤波,识别文字的效果还是蛮好的。
撒老师的表情非常适合做滤波,2333
参考:
https://blog.csdn.net/jolly12191/article/details/46428107
https://blog.csdn.net/xue_wenyuan/article/details/51533953
https://blog.csdn.net/jinshengtao/article/details/17797641
https://www.cnblogs.com/sdlypyzq/p/4378309.html