Gabor滤波器的生成

今天师兄叫我帮他写个用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 未经允许请勿用于商业用途

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值