学习OpenCV——Gabor函数的应用

原文:http://blog.csdn.net/yao_zhuang/article/details/2532279

下载cvgabor.cppcvgabor.h到你的C/C++工程目录下

注:在我的资源中有改进过的cvgabor类

相关链接为:http://download.csdn.net/source/490114

特别注意:使用该类需要opencv库的支持,如何配置环境参见:http://www.opencv.org.cn/index.php/Template:Install

它有如下的功能:

生成特定方向和尺度的gabor

生成可以显示或者保存的gabor核的实部,虚部

图像的实部,虚部或者主要(Magnitude)响应

响应可以保存在XML文件中

[cpp] view plain copy

print?

  1. #include "cvgabor.h"
  2. int main(){
  3. //创建一个方向是PI/4而尺度是3的gabor
  4. double Sigma = 2*PI;
  5. double F = sqrt(2.0);
  6. CvGabor *gabor1 = new CvGabor;
  7. gabor1->Init(PI/4, 3, Sigma, F);
  8. //获得实部并显示它
  9. IplImage *kernel = cvCreateImage( cvSize(gabor1->get_mask_width(), gabor1->get_mask_width()), IPL_DEPTH_8U, 1);
  10. kernel = gabor1->get_image(CV_GABOR_REAL);
  11. cvNamedWindow("Gabor Kernel", 1);
  12. cvShowImage("Gabor Kernel", kernel);
  13. cvWaitKey(0);
  14. //载入一个图像并显示
  15. IplImage *img = cvLoadImage( "D:/Demo.jpg", CV_LOAD_IMAGE_GRAYSCALE );
  16. cvNamedWindow("Original Image", 1);
  17. cvShowImage("Original Image", img);
  18. cvWaitKey(0);
  19. //获取载入图像的gabor滤波响应的实部并且显示
  20. IplImage *reimg = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1);
  21. gabor1->conv_img(img, reimg, CV_GABOR_REAL);
  22. cvNamedWindow("Real Response", 1);
  23. cvShowImage("Real Response",reimg);
  24. cvWaitKey(0);
  25. cvDestroyWindow("Real Response");
  26. //获取载入图像的gabor滤波响应的虚部并且显示
  27. //  IplImage *reimg = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1);
  28. gabor1->conv_img(img, reimg, CV_GABOR_IMAG);
  29. cvNamedWindow("Imaginary Response", 1);
  30. cvShowImage("Imaginary Response",reimg);
  31. cvWaitKey(0);
  32. cvDestroyWindow("Imaginary Response");
  33. //获取载入图像的gabor滤波响应的模并且显示
  34. //  IplImage *reimg = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1);
  35. gabor1->conv_img(img, reimg, CV_GABOR_MAG);
  36. cvNamedWindow("Magnitude Response", 1);
  37. cvShowImage("Magnitude Response",reimg);
  38. cvWaitKey(0);
  39. cvDestroyWindow("Magnitude Response");
  40. /*
  41. //这个响应可以被取样为8位的灰度图。如果你要原始的浮点类型的数据,你可以这样做
  42. IplImage *reimg = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_32F, 1);
  43. gabor1->conv_img(img, reimg, CV_GABOR_MAG);
  44. //然而,这些浮点数据是不能够以上面灰度图的形式简单的显示,但是它可以被保存在一个XML文件中。
  45. cvSave( "reimg.xml", (IplImage*)reimg, NULL, NULL, cvAttrList(0,0));
  46. */
  47. }

概念:

1.关于小波变换:

一种多分辨率分析工具,为不同尺度上信号的的分析和表征提供了精确和统一框架。它的原理是来源于Fourier变换!但是它比传统的Fourier变换有更多优点,比如:

1)小波变换可以覆盖整个频域; 
2)可以通过选取合适滤波器,减少或除去提取的不同特征之间的相关性; 
3)具有变焦特性,低频段可用高频率分辨率和低时间分辨率,在高频段可用低频率分辨率和高时间分辨率 
4)小波变换在实现上有快速算法(Mallat小波分析算法)。

提到小波变换必须提到小波函数,简单的说,积分为0的函数都可以作为小波函数,还可以通过一系列变化得到连续的小波变换式。 
小波变换适用小波函数族及其相应的尺度函数将原始信号分解成不同的频带。一般所说的小波变换仅递归分解信号的低频部分,以生成下一尺度的各频道输出。层层分解(图片不附了),这样的分解通常称为金字塔结构小波变换。

如果不仅仅对低通滤波器输出进行递归分解,而且也对高通滤波器的输出进行递归分解,则称之为小波包分解。(树状的图形) 
小波变换具有良好的时频局部化、尺度变换和方向特征,是分析纹理的有力工具。

2.Gabor 变换

根据模拟人类视觉系统而产生。通过模拟人类视觉系统,可以将视网膜成像分解成一组滤波图像,每个分解的图像能够反映频率和方向在局部范围内的强度变化。通过一组多通道Gabor滤波器,可以获得纹理特征。 
Gabor变换的根本就是Gabor滤波器的设计,而滤波器的设计又是其频率函数(U,V)和Gauss函数参数(一个)的设计。实际上,Gabor变换是为了提取信号Fourier变换的局部信息,使用了一个Gauss函数作为窗函数,因为一个Gauss函数的Fourier变换还是一个Gauss函 数,所以Fourier逆变换也是局部的。

通过频率参数和高斯函数参数的选取,Gabor变换可以选取很多纹理特征,但是Gabor是非正交的,不同特征分量之间有冗余,所以在对纹理图像的分析中效率不太高。

from: http://blog.csdn.net/yangtrees/article/details/7437672

时间: 2024-10-26 02:33:26

学习OpenCV——Gabor函数的应用的相关文章

OpenCV for Python 学习 (一 绘图函数)

本人的学习笔记主要记录的是学习opencv-python-tutorials这本书中的笔记 今天晚上简单学习OpenCV for Python如何绘图,主要用了这几个函数(这几个函数可在:http://docs.opencv.org/modules/core/doc/drawing_functions.html 找到): cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) cv2.circle(img, center,

《学习opencv》笔记——关于一些绘图的函数

绘图函数 (1)直线cvLine函数 其结构 void cvLine(//画直线 CvArr* array,//画布图像 CvPoint pt1,//起始点 CvPoint pt2,//终点 CvScalar color,//颜色 int thickness = 1,//宽度 int connectivity = 8//反走样 ); 实例代码 #include <cv.h> #include <highgui.h> #include <stdio.h> int main

【从零学习openCV】IOS7人脸识别实战

前言 接着上篇<IOS7下的人脸检測>,我们顺藤摸瓜的学习怎样在IOS7下用openCV的进行人脸识别,实际上非常easy,因为人脸检測部分已经完毕,剩下的无非调用openCV的方法对採集到的人脸样本进行训练,终于得到一个能够预測人脸的模型.可是当中的原理可谓是博大精深,因为快临最近末考试了,没时间去琢磨当中详细的细节,这次就先写个大概的demo,下次更新文章就得到6月20号之后了. 原理: 从OpenCV2.4之后,openCV增加了新的类FaceRecognizer,我们能够使用它便捷地进

《学习opencv》笔记——矩阵和图像操作——cvGEMM,cvGetCol,cvGetCols and cvGetDiag

矩阵和图像的操作 (1)cvGEMM函数 其结构 double cvGEMM(//矩阵的广义乘法运算 const CvArr* src1,//乘数矩阵 const CvArr* src2,//乘数矩阵 double alpha,//1号矩阵系数 const CvArr* src3,//加权矩阵 double beta,//2号矩阵系数 CvArr* dst,//结果矩阵 int tABC = 0//变换标记 ); tABC变换标记及其对应的含义 CV_GEMM_A_T 转置 src1 CV_GE

《学习opencv》笔记——矩阵和图像操作——cvDet,cvDit,cvDotProduct,cvEigenVV and cvFlip

矩阵和图像的操作 (1)cvDet函数 其结构 double cvDet(//计算矩阵的行列式 const CvArr* mat ); 实例代码 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <iostream> using namespace std; int main() { double va[] = {1,0,0,0,2,0,0,0,3}; CvMat Va=cvMa

《学习opencv》笔记——矩阵和图像操作——cvAdd、cvAddS and cvAddWeighted

矩阵和图像的操作 (1)cvAdd函数 其结构 void cvAdd(//图像加和 const CvArr* src1,//第一个原矩阵 const CvArr* src2,//第二个原矩阵 CvArr* dst, //存放矩阵 const CvArr* mask = NULL: //控制点 ); 就是单纯的将两个图像加和,mask变量控制加和的元素点,相当于"开关的作用"; 程序实例 #include <cv.h> #include <highgui.h> #

emgu中对应opencv的函数查询

自己以前做过一些C#工程的开发,所以对C#比较熟悉.接触opencv时,发现其是用C++编写的,网上的资料比较多.所以就想一边学习C++一边学opencv,学了几天后发现很痛苦,c++和c#差别太大,自己始终脱离不了C#的思维.后来就发现了EMGU 是opencv的.Net封装库.但是网上emgu的资料太少了,只能看opencv的资料搞emgu.有的时候opencv中的函数在emgu中找不到.比如说opencv中的 goodFeaturesToTrack函数,cvInvoke中就没有,其实被封装

《学习opencv》笔记——矩阵和图像操作——cvCrossProduct and cvCvtColor

矩阵和图像的操作 (1)cvCrossProduct函数 其结构 void cvCrossProdust(//计算两个三维向量的叉积 const CvArr* src1, const CvArr* src2, CvArr* dst ); 实例代码 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <iostream> using namespace std; int main()

《学习opencv》笔记——矩阵和图像操作——cvCalcCovarMatrix,cvCmp and cvCmpS

矩阵和图像的操作 (1)cvCalcCovarMatrix函数 其结构 void cvCalcCovarMatrix(计算给定点的均值和协方差矩阵 const CvArr** vects,//给定向量 int count,//给定向量的组数 CvArr* cov_mat,//结果矩阵 CvArr* avg,//根据flag得到结果 int flags//标记位 ); 标记位参数值极其意义 标志参数的具体标志值 意义 CV_COVAR_NORMAL 计算均值和协方差 CV_COVAR__SCRAM