`
aaabes
  • 浏览: 8042 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

CVPR读书笔记[5]:Gabor特征提取之Gabor核的实现

    博客分类:
  • CVPR
阅读更多

朱金华 jinhua1982@gmail.com 2014.08.09

 

 

本文参考http://blog.csdn.net/njzhujinhua/article/details/38460861的描述基于opencv实现Gabor核.

 

本文是Gabor特征提取三部分之二:

[1]CVPR读书笔记[4]:Gabor特征提取之Gabor核

http://blog.csdn.net/njzhujinhua/article/details/38460861

[2] CVPR读书笔记[5]:Gabor特征提取之Gabor核的实现

http://blog.csdn.net/njzhujinhua/article/details/38610281

[3] CVPR读书笔记[6]:Gabor特征提取

http://blog.csdn.net/njzhujinhua/article/details/38614697

 

 

ZGabor类声明, 该类只具备Kernel的计算, 具体使用在各faborfeature相关算法中实现.

 

#define GABOR_SCALE_NUM    5
#define GABOR_ANGLE_NUM    8

class ZGabor
{
public:
//默认参数及指定参数的初始化
    bool  InitGabor();
    bool  InitGabor(Size ksize, double kmax, double f, double sigma);


//存放kernel的实部,虚部及幅值矩阵, 直接使用, 暂未封装
    Mat    m_gaborReKernel[GABOR_SCALE_NUM][GABOR_ANGLE_NUM];
    Mat    m_gaborImgKernel[GABOR_SCALE_NUM][GABOR_ANGLE_NUM];
    Mat    m_gaborMagKernel[GABOR_SCALE_NUM][GABOR_ANGLE_NUM];


    void   test();

protected:
    bool  InitKernel();
    bool  GetKernel(Size ksize, int scaleIdx, int angleIdx, Mat &realKernel, Mat&imgKernel);
    Mat   GetKernelMagnitude(const Mat &rekernel, const Mat&imgkernel);


    double m_kmax;
    double m_f;
    double m_sigma;
    int    m_scaleNum;
    int    m_angleNum;
    Size   m_ksize;
private:

};


实现部分

 

 

#include "zgabor.h"

/*
Zhu.Jinhua
jinhua1982@gmail.com   20140809
http://blog.csdn.net/njzhujinhua/article/details/38460861
说明:参数初始化,使用默认参数
*/
bool ZGabor::InitGabor()
{
    m_kmax = CV_PI/2;
    m_f = sqrt(double(2));
    m_sigma = 2*CV_PI;
    m_scaleNum = GABOR_SCALE_NUM;
    m_angleNum = GABOR_ANGLE_NUM;
    m_ksize = Size(19,19);

    InitKernel();
    return true;
}
/*
Zhu.Jinhua
jinhua1982@gmail.com   20140809
说明:参数初始化,使用指定参数
*/
bool ZGabor::InitGabor(Size ksize, double kmax, double f, double sigma)
{
    m_kmax = kmax;
    m_f = f;
    m_sigma = sigma;
    m_scaleNum = GABOR_SCALE_NUM;
    m_angleNum = GABOR_ANGLE_NUM;
    m_ksize = ksize;

    InitKernel();
    return true;
}
/*
Zhu.Jinhua
jinhua1982@gmail.com   20140809
说明:<span style="color:green;">Gabor</span><span style="color:green;">核的生成</span>
*/
bool ZGabor::InitKernel()
{
    for (int scaleIdx=0;scaleIdx < GABOR_SCALE_NUM; scaleIdx++)
    {
        for (int angleIdx = 0;angleIdx < GABOR_ANGLE_NUM; angleIdx++)
        {
            GetKernel(m_ksize, scaleIdx, angleIdx, m_gaborReKernel[scaleIdx][angleIdx], m_gaborImgKernel[scaleIdx][angleIdx]);
            m_gaborMagKernel[scaleIdx][angleIdx] = GetKernelMagnitude(m_gaborReKernel[scaleIdx][angleIdx], m_gaborImgKernel[scaleIdx][angleIdx]);
        }
    }

    return true;
}


/*
Zhu.Jinhua
jinhua1982@gmail.com   20140809
Get kernel magnitude by re and img part.
return magnitude Mat
*/
Mat  ZGabor::GetKernelMagnitude(const Mat &rekernel, const Mat&imgkernel)
{
    CV_Assert(rekernel.size() == imgkernel.size());
    CV_Assert(rekernel.type() == imgkernel.type());
    Mat mag;
    magnitude(rekernel,imgkernel, mag);


    //test
    /*Mat tmp;
    normalize(rekernel,tmp,0,255,CV_MINMAX,CV_8U);
    imshow("mag", tmp);
    waitKey();
    */

    return mag;
}


/*
Zhu.Jinhua
jinhua1982@gmail.com  20140809
Real Part:
G(k,x,y,θ)=k^2/σ^2*exp⁡(-(k^2 (x^2+y^2 ))/(2σ^2 ))*(cos(k(xcosθ+ysinθ))-exp⁡(-σ^2/2))
Imag Part:
G(k,x,y,θ)=k^2/σ^2*exp⁡(-(k^2 (x^2+y^2 ))/(2σ^2 ))*(sin(k(xcosθ+ysinθ)))
In:ksize --kernel size
scaleIdx --Scale index
andeIdx  --angle index
Out:
realKernel  --real part of kernel
imgKernel   --imagine part of kernel
*/
bool  ZGabor::GetKernel(Size ksize, int scaleIdx, int angleIdx, Mat &realKernel, Mat&imgKernel)
{
    int xmin=0,xmax=0;
    int ymin=0,ymax=0;

    //we suppose kernel width equal height.
    assert(ksize.width == ksize.height);


    xmax=ksize.width/2;
    ymax=ksize.height/2;
    xmin=-xmax;
    ymin=-ymax;

    //reset out para mat size
    realKernel.create(xmax-xmin+1,ymax-ymin+1,CV_32FC1);
    imgKernel.create(xmax-xmin+1,ymax-ymin+1,CV_32FC1);
    double k=m_kmax/pow(m_f,scaleIdx);

    double scaleFactor=k*k/m_sigma/m_sigma; //k^2/σ^2
    double DC=exp(-m_sigma*m_sigma/2); //direct current
    double theta=CV_PI*angleIdx/m_angleNum;
    double costheta=cos(theta), sintheta=sin(theta);

    float *ptr_re = NULL;
    float *ptr_img = NULL;;

    for (int y=ymin;y<=ymax;y++)
    {
        ptr_re=realKernel.ptr<float>(y-ymin);
        ptr_img = imgKernel.ptr<float>(y-ymin);
        for (int x=xmin;x<=xmax;x++)
        {
            double xcys=x*costheta+y*sintheta; //xcosθ+ysinθ
            double pub=scaleFactor*exp(-scaleFactor/2*(x*x+y*y));//k^2/σ^2*exp⁡(-(k^2 (x^2+y^2 ))/(2σ^2 ))
            double re_minus_dc=cos(k*xcys)-DC;//(cos(k(xcosθ+ysinθ))-exp⁡(-σ^2/2))
            double img=sin(k*xcys);//(sin(k(xcosθ+ysinθ)))

            ptr_re[x-xmin]=pub*re_minus_dc;
            ptr_img[x-xmin]=pub*img;
            //cout<<"y="<<y-ymin<<" x="<<x-xmin<<" = "<<ptr_re[x-xmin]<<endl;
        }
    }

    return true;
}

 

 

测试代码

 

void ZGabor::test()
{
    Mat reKernel;
    Mat imgKernel;
    Mat mag;
    Mat displayMatCol,displayMat, line;
    //InitGabor();//CV_PI/2,1.4*(1.0+i/10.0),CV_PI*2);
    for (int i=0;i<8;i++)
    {
        displayMatCol.release();

        for (int j=0;j<5;j++)
        {
            normalize(m_gaborReKernel[j][i],reKernel,0,255,CV_MINMAX,CV_8U);

            line=Mat::ones(3,reKernel.cols,reKernel.type())*255;
            displayMatCol.push_back(reKernel);
            displayMatCol.push_back(line);
        }
        displayMatCol=displayMatCol.t();
        line=Mat::ones(2,displayMatCol.cols,displayMatCol.type())*255;
        displayMat.push_back(displayMatCol);
        displayMat.push_back(line);
    }

    displayMat=displayMat.t();
    imwrite("gabor5x8.jpg",displayMat);
    imshow("Gabor Kernel",displayMat);
    waitKey(0);
}


得到的实部的图示(图中ksize=100)

 

 

使用方法

 

 

ZGabor m_gabor
m_gabor.InitGabor();
m_gabor.test();



 

 

用于滤波的话直接使用m_gabor.m_gaborReKernel[i][j]作为核

分享到:
评论

相关推荐

    WateRF:用于保护版权的辐射场中的鲁棒水印(CVPR 2024) - Pytorch 代码.zip

    《WateRF:辐射场中的鲁棒水印技术在保护版权中的应用——基于Pytorch的实现》 在当今数字化时代,图像和视频内容的创作与传播日益广泛,版权保护问题显得尤为重要。WateRF(Watermarking in Radiation Fields for ...

    [CVPR2022]RestoreFormer:未降级键值对的高质量盲人脸恢复_Python_Shell_下载.zip

    该技术尤其关注在无监督的条件下,如何实现高质量的盲人脸修复,即在没有原始参考图像的情况下,恢复低质量或者损坏的人脸图像。"Python_Shell_下载.zip"表明此项目提供了用Python语言编写的源代码,可能还包含一个...

    CVPR2020-代码:CVPR 2020论文开放项目合集

    4. **Image Processing**:图像处理是计算机视觉的基础,包括图像增强、去噪、特征提取等。在这些代码中,可能会用到OpenCV、PIL等库进行图像预处理,以提高后续算法的性能。 5. **Object Detection**:目标检测是...

    CVPR2018-2020下载

    CVPR是由IEEE举办的国际计算机视觉与模式识别会议,是计算机视觉领域最重要的顶级会议之一,每年举办一次。该会议涵盖了计算机视觉领域的前沿研究和技术发展,包括图像处理、机器学习、深度学习等多个方向。CVPR不仅...

    cvpr2018-notes:CVPR 2018大会的笔记。 链接到论文,思想和研究方向

    CVPR 2018笔记以下是我在大会期间遇到的最有趣的论文,挑战和研讨会的链接,注释和想法。 但是,您可能希望通过回顾所有979篇被接受的论文并逐步浏览所有21个教程和48个研讨会的内容,来形成自己对计算机视觉和模式...

    cvpr2015-opensfm:CVPR 2015教程的原始资料-Source material

    5. **扩展性**:支持添加自定义的特征提取器、描述符、匹配器和优化器,以适应不同的任务和数据集。 6. **并行处理**:利用多核CPU和GPU资源,OpenSfM能够有效地处理大量图像,缩短计算时间。 【应用场景】 ...

    车道线检测 CVPR2022 PytorchAutoDrive: 源代码

    2. **深度学习架构**:可能使用了卷积神经网络(CNN)或者Transformer等先进的网络结构,以提取图像特征并进行曲线拟合。 3. **数据预处理**:包括图像增强、灰度化、直方图均衡化等步骤,以提高模型对不同光照和...

    CVPR 2012 Tutorial

    Deep Learning Methods for Vision CVPR 2012 Tutorial 9:00am-5:30pm, Sunday June 17th, Ballroom D (Full day)

    CVPR10-LLC

    5. extr_sift.m:SIFT(尺度不变特征变换)是一种经典的图像特征提取方法,此文件可能用于提取图像的SIFT特征,作为LLC编码的输入。 6. README:这是项目说明文件,通常会包含关于代码的使用说明、依赖库和运行环境...

    CVPR2020-SDFDiff:SDFDiff

    SDFDiff已在python&gt; = 3.7的Ubuntu 18.04上实现并测试。 克隆仓库: git clone https://github.com/YueJiang-nj/CVPR2020-SDFDiff.git 使用virtualenv或conda安装需求: # pip source virtual_env/install_pip....

    CVPR2021-代码:CVPR 2021论文开源项目(带代码的文件)合集,同时欢迎各位大佬提交问题,分享CVPR 2021开放式项目

    CVPR2021-代码 论文开源项目(带代码的文件)合集!CVPR 2021论文收录列表: : 注1:等2021年2月28日开奖后,欢迎各位大佬提交issue,分享CVPR 2021本文和开源项目! 注2:CVPR 2021已交稿成立!已投稿且想要进来的...

    C:\Users\西邮吴彦祖\Desktop\文件转换.rar

    标题中的"C:\Users\西邮吴彦祖\Desktop\文件转换.rar"表明这是一个RAR格式的压缩文件,位于用户“西邮吴彦祖”的桌面,命名为“文件转换”。这通常意味着里面包含的是与文件处理或转换相关的数据。...

    CVPR2020_MANet:这是CVPR2020论文“用于有效的交互式视频对象分段的内存聚合网络”的pytorch实现。

    CVPR2020内存汇聚网络可实现高效的交互式视频对象分段这是CVPR2020论文“用于有效的交互式视频对象分段的内存聚合网络”的pytorch实施。准备依存关系Python 3.7 火炬1.0 脾气暴躁的张量板davisinteractive(请参阅)...

    CVPR2020:长尾分布下的特征学习方法介绍

    然而,实际数据往往呈现出长尾分布,即一部分类别的样本数量远远超过其他类别,这种现象在CVPR2020年的一篇论文《Deep Representation Learning on Long-tailed Data: A Learnable Embedding Augmentation ...

    matlab中存档算法代码-FSF_CVPR2017_Demo:带运动分割的快速多帧立体声场景流演示(CVPR2017)

    该代码是针对2017年计算机视觉与模式识别会议(CVPR)上发表的一种快速多帧立体声场景流算法的实现。在MATLAB环境中,它提供了一个用于处理和分析视频序列的开源系统。 【系统开源】标签意味着这些算法和代码是公开...

    siamRPN论文系列.rar

    商汤团队关于siamRPN的系列论文,共5篇: 1 SiamFC-ECCV2016:Fully-Convolutional Siamese Networks for Object Tracking.pdf 2 SiamRPN-CVPR2018:High Performance Visual Tracking with Siamese Region Proposal...

    CVPR2020_PADS:(CVPR 2020)此仓库包含“ PADS

    如我们的CVPR 2020出版物( )中所建议,该存储库包含用于对基于排名的深度度量学习方法运行策略适应性否定采样的代码。 SAMPLE_RUNS.sh中列出了可以达到与本文报告相似的结果的示例运行,因为基于RL的方法引入了更...

    蔡氏电路matlab仿真代码-cvpr17_vtranse:cvpr17_vtranse

    蔡氏电路matlab仿真代码这实现了“用于视觉关系检测的视觉翻译嵌入网络,张汉旺,邹林aw,张世富,蔡达成(CVPR2017)” 最近,yangxuntu还提供了张量流适应,这在vg数据集上获得了显着改进。 您可以在这里找到代码...

    DeepOIS:CVPR 2021:DeepOIS:陀螺仪引导的深光学图像稳定器补偿

    《DeepOIS:陀螺仪引导的深光学图像稳定器补偿》是2021年在计算机视觉领域知名会议CVPR上发表的一项研究成果。这项工作主要聚焦于解决移动设备(如智能手机、无人机等)在拍摄时由于运动引起的图像模糊问题。光学...

Global site tag (gtag.js) - Google Analytics