Gabor滤波器学习 综合多篇关于Gabor滤波器的博客总结

一、什么是Gabor函数(以下内容含部分翻译自维基百科)

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

还有,生物学实验发现,Gabor滤波器可以很好地近似单细胞的感受野函数(光强刺激下的传递函数),什么视皮层内的超柱,bla...bla,总之是这方面仿生的数学模型。

另外,网上有一种说法,gabor分为实部和虚部,用实部进行滤波后图像会平滑;虚部滤波后用来检测边缘。【来自百度知道某个大神的回答】,我查了文献,发现的确有人用Gabor的奇函数部分做边缘提取(《基于Gabor滤波器的边缘检测算法》 无线电工程 2000年第3卷第30期)。另外,从我的实验结果也有类似的发现。暂且认为这个对的吧。

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


下面给出二维Gabor函数的数学表达:

复数表达:

实数部分:

虚数部分:

其中:



下面介绍公式中各个参数的含义,及参数如何配置问题【都从老外那翻译来的】:

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

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

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

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

带宽(b):Gabor滤波器的半响应空间频率带宽b和σ/ λ的比率有关,其中σ表示Gabor函数的高斯因子的标准差,如下:


σ的值不能直接设置,它仅随着带宽b变化。带宽值必须是正实数,通常为1,此时,标准差和波长的关系为:σ= 0.56 λ。带宽越小,标准差越大,Gabor形状越大,可见平行兴奋和抑制区条纹数量越多。

下面给出,不同参数配置下的Gabor核函数效果图,大小均100*100:

a.波长对比组【方向为:0,相位偏移量为:0,纵横比率为:0.5,带宽为:1,下图波长分别为5,10,15】


b.方向对比组【波长为:10,相位偏移量为:0,空间纵横比为:0.5,带宽为:1,方向分别为:0,45,90】


c.相位偏移量对比组【波长为:10,方向为:0,空间纵横比:0.5,带宽:1,相位偏移量分别为:0,180,-90,90】


d.空间纵横比对比组【波长:10,相位偏移量:0,方向:0,带宽:1,空间纵横比分别为:0.5,1】


e.带宽对比组【波长:10,方向:0,相位偏移量:0,空间纵横比:0.5,带宽分别为:0.5,1,2】


二、用gabor提取纹理特征的思路

Gabor滤波方法的主要思想是:不同纹理一般具有不同的中心频率及带宽,根据这些频率和带宽可以设计一组Gabor滤波器对纹理图像进行滤波,每个Gabor滤波器只允许与其频率相对应的纹理顺利通过,而使其他纹理的能量受到抑制,从各滤波器的输出结果中分析和提取纹理特征,用于之后的分类或分割任务。Gabor滤波器提取纹理特征主要包括两个过程:①设计滤波器(例如函数、数目、方向和间隔);②从滤波器的输出结果中提取有效纹理特征集。Gabor滤波器是带通滤波器,它的单位冲激响应函数(Gabor函数)是高斯函数与复指数函的乘积。它是达到时频测不准关系下界的函数,具有最好地兼顾信号在时频域的分辨能力。

实现步骤:

(1)将输入图像分为3×3(9块)和4×4(16块)的图像块;

(2)建立Gabor滤波器组:选择4个尺度,6个方向,这样组成了24个Gabor滤波器;

(3)Gabor滤波器组与每个图像块在空域卷积,每个图像块可以得到24个滤波器输出,这 些输出是图像块大小的图像,如果直接将其作为特征向量,特征空间的维数会很大, 所以需要“浓缩”;

(4)每个图像块经过Gabor滤波器组的24个输出,要“浓缩”(文中提到“average filter responses within the block”我的理解是取灰度均值)为一个24×1的列向量作为该图像 块的纹理特征。查阅相关文献,发现也可以用方差。

源码:
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;

int main()
{
	Mat srcImage=imread("C://nor3.bmp");//归一化,增强后的虹膜图像
	namedWindow("srcImage",WINDOW_AUTOSIZE);
	imshow("srcImage",srcImage);

	Mat gaborKernel=getGaborKernel(Size(31,31),5,CV_PI/2,10.0,0.5,0,CV_32F);

	Mat dstImage;
	filter2D(srcImage,dstImage,srcImage.depth(),gaborKernel);
    namedWindow("dstImgage",WINDOW_AUTOSIZE);
	imshow("datImage",dstImage);
	imwrite("datImage.bmp",dstImage);
	waitKey(0);

}

cv2.getgaborkernel(ksize、sigma、theta、lambda、gamma、psi、ktype)
四个方向上 只提取了Gabor filter的实部作为卷积核 ,实部可以对图像进行平滑滤波,虚部可以用来边缘检测,
ksize内核大小 最好为奇数 sigma是Gabor滤波器中使用的高斯函数的标准差。θ是Gabor函数的平行条纹的法向。lambda是上述方程中正弦因子的波长。gamma是空间纵横比。psi是相位偏移。ktype表示gabor内核中每个像素可以保存的值的类型和范围。
虹膜归一化后,图像增加,然后Gabor滤波器处理,测试效果:
在这里插入图片描述
Size(31,31),5,CV_PI2,10.0,0.5,0,CV_32F
在这里插入图片描述
Size(31,31),10,CV_PI2,10.0,0.5,0,CV_32F

以下介绍我看的另外几篇写的特别好的,尤其那个英文的文章:
https://blog.csdn.net/lhanchao/article/details/55006663?utm_source=blogxgwz2
https://www.cnblogs.com/sdlypyzq/p/4378309.html
https://blog.csdn.net/qiuchangyong/article/details/78943839
https://blog.csdn.net/jorg_zhao/article/details/47153115
还有两个没来得及细看,评价挺高的:
https://blog.csdn.net/guoming0000/article/details/7839917
https://blog.csdn.net/lichengyu/article/details/24534245

猜你喜欢

转载自blog.csdn.net/zqx951102/article/details/86483364
今日推荐