朱金华 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:辐射场中的鲁棒水印技术在保护版权中的应用——基于Pytorch的实现》 在当今数字化时代,图像和视频内容的创作与传播日益广泛,版权保护问题显得尤为重要。WateRF(Watermarking in Radiation Fields for ...
该技术尤其关注在无监督的条件下,如何实现高质量的盲人脸修复,即在没有原始参考图像的情况下,恢复低质量或者损坏的人脸图像。"Python_Shell_下载.zip"表明此项目提供了用Python语言编写的源代码,可能还包含一个...
4. **Image Processing**:图像处理是计算机视觉的基础,包括图像增强、去噪、特征提取等。在这些代码中,可能会用到OpenCV、PIL等库进行图像预处理,以提高后续算法的性能。 5. **Object Detection**:目标检测是...
CVPR是由IEEE举办的国际计算机视觉与模式识别会议,是计算机视觉领域最重要的顶级会议之一,每年举办一次。该会议涵盖了计算机视觉领域的前沿研究和技术发展,包括图像处理、机器学习、深度学习等多个方向。CVPR不仅...
CVPR 2018笔记以下是我在大会期间遇到的最有趣的论文,挑战和研讨会的链接,注释和想法。 但是,您可能希望通过回顾所有979篇被接受的论文并逐步浏览所有21个教程和48个研讨会的内容,来形成自己对计算机视觉和模式...
5. **扩展性**:支持添加自定义的特征提取器、描述符、匹配器和优化器,以适应不同的任务和数据集。 6. **并行处理**:利用多核CPU和GPU资源,OpenSfM能够有效地处理大量图像,缩短计算时间。 【应用场景】 ...
2. **深度学习架构**:可能使用了卷积神经网络(CNN)或者Transformer等先进的网络结构,以提取图像特征并进行曲线拟合。 3. **数据预处理**:包括图像增强、灰度化、直方图均衡化等步骤,以提高模型对不同光照和...
Deep Learning Methods for Vision CVPR 2012 Tutorial 9:00am-5:30pm, Sunday June 17th, Ballroom D (Full day)
5. extr_sift.m:SIFT(尺度不变特征变换)是一种经典的图像特征提取方法,此文件可能用于提取图像的SIFT特征,作为LLC编码的输入。 6. README:这是项目说明文件,通常会包含关于代码的使用说明、依赖库和运行环境...
SDFDiff已在python> = 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论文收录列表: : 注1:等2021年2月28日开奖后,欢迎各位大佬提交issue,分享CVPR 2021本文和开源项目! 注2:CVPR 2021已交稿成立!已投稿且想要进来的...
标题中的"C:\Users\西邮吴彦祖\Desktop\文件转换.rar"表明这是一个RAR格式的压缩文件,位于用户“西邮吴彦祖”的桌面,命名为“文件转换”。这通常意味着里面包含的是与文件处理或转换相关的数据。...
CVPR2020内存汇聚网络可实现高效的交互式视频对象分段这是CVPR2020论文“用于有效的交互式视频对象分段的内存聚合网络”的pytorch实施。准备依存关系Python 3.7 火炬1.0 脾气暴躁的张量板davisinteractive(请参阅)...
然而,实际数据往往呈现出长尾分布,即一部分类别的样本数量远远超过其他类别,这种现象在CVPR2020年的一篇论文《Deep Representation Learning on Long-tailed Data: A Learnable Embedding Augmentation ...
该代码是针对2017年计算机视觉与模式识别会议(CVPR)上发表的一种快速多帧立体声场景流算法的实现。在MATLAB环境中,它提供了一个用于处理和分析视频序列的开源系统。 【系统开源】标签意味着这些算法和代码是公开...
商汤团队关于siamRPN的系列论文,共5篇: 1 SiamFC-ECCV2016:Fully-Convolutional Siamese Networks for Object Tracking.pdf 2 SiamRPN-CVPR2018:High Performance Visual Tracking with Siamese Region Proposal...
如我们的CVPR 2020出版物( )中所建议,该存储库包含用于对基于排名的深度度量学习方法运行策略适应性否定采样的代码。 SAMPLE_RUNS.sh中列出了可以达到与本文报告相似的结果的示例运行,因为基于RL的方法引入了更...
蔡氏电路matlab仿真代码这实现了“用于视觉关系检测的视觉翻译嵌入网络,张汉旺,邹林aw,张世富,蔡达成(CVPR2017)” 最近,yangxuntu还提供了张量流适应,这在vg数据集上获得了显着改进。 您可以在这里找到代码...
《DeepOIS:陀螺仪引导的深光学图像稳定器补偿》是2021年在计算机视觉领域知名会议CVPR上发表的一项研究成果。这项工作主要聚焦于解决移动设备(如智能手机、无人机等)在拍摄时由于运动引起的图像模糊问题。光学...