Gabor内核参考wiki

使用实数Real的公式计算核函数代码:

  1. Mat getGaborFilter(float lambda, float theta,
  2. float sigma2,float gamma,
  3. float psi = 0.0f){
  4. if(abs(lambda-0.0f)<1e-6){
  5. lambda = 1.0f;
  6. }
  7. float sigma_x = sigma2;
  8. float sigma_y = sigma2/(gamma*gamma);
  9. int nstds = 3;
  10. float sqrt_sigma_x = sqrt(sigma_x);
  11. float sqrt_sigma_y = sqrt(sigma_y);
  12. int xmax = max(abs(nstds*sqrt_sigma_x*cos(theta)),abs(nstds*sqrt_sigma_y*sin(theta)));
  13. int ymax = max(abs(nstds*sqrt_sigma_x*sin(theta)),abs(nstds*sqrt_sigma_y*cos(theta)));
  14. int half_filter_size = xmax>ymax ?
  15.  
  16. xmax:ymax;
  17. int filter_size = 2*half_filter_size+1;
  18. Mat gaber = Mat::zeros(filter_size,filter_size,CV_32F);
  19. for(int i=0;i<filter_size;i++){
  20. float* f = gaber.ptr<float>(i);
  21. for(int j=0;j<filter_size;j++){
  22. int x = j-half_filter_size;
  23. int y = i-half_filter_size;
  24. float x_theta=x*cos(theta)+y*sin(theta);
  25. float y_theta=-x*sin(theta)+y*cos(theta);
  26. f[x] = exp(-.5*(x_theta*x_theta/sigma_x+y_theta*y_theta/sigma_y));
  27. f[x] = f[x]*cos(2*PI*x_theta/lambda+psi);
  28. };
  29. }
  30. return gaber;
  31. }

使用得到的Gabor核对一副图像进行卷积的函数:

  1. Mat gaborFilter(Mat& img, Mat& filter){
  2. int half_filter_size = (max(filter.rows,filter.cols)-1)/2;
  3. Mat filtered_img(img.rows,img.cols,CV_32F);
  4. for(int i=0;i<img.rows;i++){
  5. uchar* img_p = img.ptr<uchar>(i);
  6. float* img_f = filtered_img.ptr<float>(i);
  7. for(int j=0;j<img.cols;j++){
  8. float filter_value = 0.0f;
  9. for(int fi=0;fi<filter.rows;fi++){
  10. float* f = filter.ptr<float>(fi);
  11. int img_i = i+fi-half_filter_size;
  12. img_i = img_i < 0 ? 0 : img_i;
  13. img_i = img_i >= img.rows ?
  14.  
  15. (img.rows-1) : img_i;
  16. uchar* p = img.ptr<uchar>(img_i);
  17. for(int fj=0;fj<filter.cols;fj++){
  18. int img_j = j+fj-half_filter_size;
  19. img_j = img_j < 0 ? 0 : img_j;
  20. img_j = (img_j >= img.cols) ? (img.cols-1) : img_j;
  21. float tmp = (float)p[img_j]*f[fj];
  22. filter_value += tmp;
  23. }
  24. }
  25. img_f[j] = filter_value;
  26. }
  27. }
  28. return filtered_img;
  29. }

对一幅图使用例如以下核卷积:

  1. Mat gaber = getGaborFilter(0.3,0,4,2);

效果例如以下:

Gabor算子卷积之后得到非常多负值(不知道有没有问题)。后面的图是归一化之后显示出来的。

  1. Mat normalizeFilterShow(Mat gaber){
  2. Mat gaber_show = Mat::zeros(gaber.rows,gaber.cols,CV_8UC1);
  3. float gaber_max = FLT_MIN;
  4. float gaber_min = FLT_MAX;
  5. for(int i=0;i<gaber.rows;i++){
  6. float* f = gaber.ptr<float>(i);
  7. for(int j=0;j<gaber.cols;j++){
  8. if(f[j]>gaber_max){
  9. gaber_max = f[j];
  10. }
  11. if(f[j]<gaber_min){
  12. gaber_min = f[j];
  13. }
  14. }
  15. }
  16. float gaber_max_min = gaber_max-gaber_min;
  17. for(int i=0;i<gaber_show.rows;i++){
  18. uchar* p = gaber_show.ptr<uchar>(i);
  19. float* f = gaber.ptr<float>(i);
  20. for(int j=0;j<gaber_show.cols;j++){
  21. if(gaber_max_min!=0.0f){
  22. float tmp = (f[j]-gaber_min)*255.0f/gaber_max_min;
  23. p[j] = (uchar)tmp;
  24. }
  25. else{
  26. p[j] = 255;
  27. }
  28. }
  29. }
  30. return gaber_show;
  31. }

(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经同意不用于商业用途)

版权声明:本文博客原创文章。博客,未经同意,不得转载。

【图像处理】Gabor过滤器的更多相关文章

  1. Deep Neural Networks for Object Detection(翻译)

    0 - Abstract 深度神经网络(DNNs)最近在图像分类任务上表现出了突出的性能.在这篇文章中,我们进一步深入探究使用DNNs进行目标检测的问题,这个问题不仅需要对物体进行分类,并且还需要对各 ...

  2. Topographic ICA as a Model of Natural Image Statistics(作为自然图像统计模型的拓扑独立成分分析)

    其实topographic independent component analysis 早在1999年由ICA的发明人等人就提出了,所以不算是个新技术,ICA是在1982年首先在一个神经生理学的背景 ...

  3. PReLU——Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification

    1. 摘要 在 \(ReLU\) 的基础上作者提出了 \(PReLU\),在几乎没有增加额外参数的前提下既可以提升模型的拟合能力,又能减小过拟合风险. 针对 \(ReLU/PReLU\) 的矫正非线性 ...

  4. 图像处理之滤波---gabor

    http://blog.csdn.net/xiaowei_cqu/article/details/24745945 小魏北大

  5. 共有31款PHP 图形/图像处理开源软件(转)

    详情点击:http://www.oschina.net/project/lang/22/php?tag=141&os=0&sort=view PHP 图像处理库 Grafika Gra ...

  6. paper 119:[转]图像处理中不适定问题-图像建模与反问题处理

    图像处理中不适定问题 作者:肖亮博士 发布时间:09-10-25 图像处理中不适定问题(ill posed problem)或称为反问题(inverse Problem)的研究从20世纪末成为国际上的 ...

  7. opencv6.1-imgproc图像处理模块之平滑与形态学操作

    这个部分是<opencv-tutorials.pdf>的部分,这部分也是几大部分中例子最多的,其实这个教程的例子都很不错,不过有些看得出来还是c接口的例子,说明例子有些年头了,其实在&qu ...

  8. opencv6.2-imgproc图像处理模块之图像尺寸上的操作及阈值

    接opencv6.1-imgproc图像处理模块之平滑和形态学操作,顺带说一句在opencv中的in-place操作就是比如函数的输入图像和输出图像两个指针是相同的,那么就是in-place操作了.比 ...

  9. opencv6.3-imgproc图像处理模块之边缘检测

    接opencv6.2-improc图像处理模块之图像尺寸上的操作 本文大部分都是来自于转http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutori ...

随机推荐

  1. BZOJ 3390: [Usaco2004 Dec]Bad Cowtractors牛的报复

    题目 3390: [Usaco2004 Dec]Bad Cowtractors牛的报复 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 53  Solve ...

  2. 1369 - Answering Queries(规律)

    1369 - Answering Queries   PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 32 M ...

  3. CentOS 6.4安装(超级详细图解教程)

    链接地址:http://www.osyunwei.com/archives/5855.html CentOS 6.4安装(超级详细图解教程) 附:CentOS 6.4下载地址 32位:http://m ...

  4. week4_motion_of_ball_1(小球运动)——最基本

    # Ball motion with an explicit timer import simplegui # Initialize globals width = 600 height = 600 ...

  5. Activity中Menu相关的几个方法的调用时机

    用于创建菜单的常用的方法有如下两种: 1.onCreateOptionsMenu(Menu menu) 2.onPrepareOptionsMenu(Menu menu) MyDiaryActivit ...

  6. django 时间计数

    value必须replace(tzinfo=None)变成datetime格式,否则格式不对不能相减.

  7. Oracle Dedicated server 和 Shared server(专用模式 和 共享模式) 说明(转)

    一.  官网说明 在DBCA 建库的时候,有提示让我们选择连接类型,这里有两种类型:专用服务器模式和共享服务器模式.默认使用专用模式.如下图: Oracle 官方文档对这两种文档的说明如下: Abou ...

  8. 基于SOAP的xml网络交互心得

    感谢小二同学将遇到的问题分享给我们,再此给以掌声.如果看不懂下面文章的建议查找一下HTTP协议的文艺,对HTTP协议要有个概念. XML网络交互心得 目录 一.     xml解析 1.根路径下 2. ...

  9. Shell之sed命令

    sed用于一次性处理所有的编辑任务,尤为高效,为用户节省了大量的时间,sed适用于以下三种场合: 1.编辑相对交互文本编辑器而言太大的文件: 2.编辑命令太复杂,在交互式文本编辑器中难以输入的情况: ...

  10. Android模拟器的文件目录介绍

    文件存放在 .avd文件夹下 .ini为对应的配置文件     打开.avd文件夹 *.lock文件夹保存的是模拟器的一下数据,当模拟器正常关闭时这些文件夹都会被自动删除. 当模拟器无法开启的时候可以 ...