您的位置:首页 > 理论基础

Gabor滤波器的生成

2015-11-27 22:14 435 查看
今天师兄叫我帮他写个用Gabor提取特征的代码,顺便学习了下Gabor滤波器的生成过程。

简介

Gabor滤波器是一个或一组Gabor函数离散形式,在计算机视觉中常用到Gabor滤波器来提取纹理特征。Gabor函数的表达式有很多种,Wikipedia中给出的形式如下:



Gabor变换属于加窗傅立叶变换。

更详细的介绍在

http://en.wikipedia.org/wiki/Gabor_filter

Opencv中Gabor滤波器的生成过程

首先贴出代码:

cv::Mat cv::getGaborKernel( Size ksize, double sigma, double theta,
double lambd, double gamma, double psi, int ktype )
{
double sigma_x = sigma;
double sigma_y = sigma/gamma;
int nstds = 3;
int xmin, xmax, ymin, ymax;
double c = cos(theta), s = sin(theta);

if( ksize.width > 0 )
xmax = ksize.width/2;
else
xmax = cvRound(std::max(fabs(nstds*sigma_x*c), fabs(nstds*sigma_y*s)));

if( ksize.height > 0 )
ymax = ksize.height/2;
else
ymax = cvRound(std::max(fabs(nstds*sigma_x*s), fabs(nstds*sigma_y*c)));

xmin = -xmax;
ymin = -ymax;

CV_Assert( ktype == CV_32F || ktype == CV_64F );

Mat kernel(ymax - ymin + 1, xmax - xmin + 1, ktype);
double scale = 1;
double ex = -0.5/(sigma_x*sigma_x);
double ey = -0.5/(sigma_y*sigma_y);
double cscale = CV_PI*2/lambd;

for( int y = ymin; y <= ymax; y++ )
for( int x = xmin; x <= xmax; x++ )
{
double xr = x*c + y*s;
double yr = -x*s + y*c;

double v = scale*exp(ex*xr*xr + ey*yr*yr)*cos(cscale*xr + psi);
if( ktype == CV_32F )
kernel.at<float>(ymax - y, xmax - x) = (float)v;
else
kernel.at<double>(ymax - y, xmax - x) = v;
}

return kernel;
}


可以看到opencv中实现的是

这个公式,虚部已经丢掉了。

MATLAB的一种实现

这个是源码的网址:https://github.com/andybaoxv/symnmf/blob/master/gaborFilterBank.m

这里就不贴出代码了,给出推导过程。



可以看出其代码所实现的gabor滤波器既有实部又有虚部,不完全是

这个公式。因为其代码实现的是不只一个尺度,在我的推导中包含了5个尺度8个方向,共产生40个滤波器。

使用滤波器提取特征

这里采用最简单的办法,来一张图像,用我MATLAB转换成C++的代码生成的40个滤波器分别与图像卷积运算,得到40个Mat,然后把Mat拼接起来就是特征向量了。

cv::filter2D(image, reult, CV_32F, filter[i]);


转载请注明作者和出处http://blog.csdn.net/CHIERYU 未经允许请勿用于商业用途
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息