在提取目标的局部空间和频率域信息上,Gabor小波变换具有良好的特性,对图像进行Gabor小波变换,就类似于人类视网膜中的简单细胞对图像刺激作出的响应。
Gabor小波变换不仅仅可以提取出图像纹理的特征,并且可以减小光照和位置对图像识别造成的干扰。一般对图像进行Gabor小波变换提取特征后,还要进行降维处理,以提高运算效率。
一、二维Gabor小波核函数定义
式中,对于Gabor核函数,u为方向,v为尺度,z=(x,y)即图像坐标,||*||表示对*进行取模运算。
用来补偿由频率决定的能量谱的衰弱,并且通过对包络函数进行加窗来限定振荡函数的变化范围,使其仅在局部起作用。通过包络函数的局部性可知,滤波器的真正功能是在指定坐标点提取相应的特征,因此可以将其视为一种Gabor小波。
是振荡函数,它的虚部为一个正弦函数,实部为一个余弦函数。是直流分量,其中的sigma是高斯函数半径,它可以限制Gabor小波的尺寸,当sigma的值很大的时候可以忽略直流分量的影响,使得滤波器对全局照明的敏感性降低,它的优点是不仅可以保持空间关系的信息,还能同时描述空间频率结构,是滤波器的中心频率,。
在频域的核函数中,f是空间因子,体现滤波器的方向,可以描述Gabor滤波器在不同方向不同尺度的响应,经过改变的值,可以获得一组Gabor滤波函数,一般尺度取值(v={0,1,2,3,4}),方向取值(u={0,1,2,3,4,5,6,7}),这样一共可以获得40个不同的Gabor小波函数。下面的程序取:=PI/2,sigma=2*PI,f=sprt(2),v={0,1,2,3,4},u={0,1,2,3,4,5,6,7};从而获取40个小波函数。
二、代码实现
该部分Gabor滤波器的类用的是网上普遍用的mian zhou所编写的cvGabor类,调试环境为Qt,实现功能包括创建5个尺度8个方向共40个Gabor小波滤波器函数并显示;对图像进行Gabor滤波并显示和保存变化后的数据。下载页:http://download.csdn.net/detail/u013752202/9218517
下面是创建50个Gabor滤波器并显示的代码:
#include "cvgabor.h"
#include "opencv2\opencv.hpp"
using namespace cv;
int main(int argc,char **argv){
//创建8个方向,5个尺度的Gabor滤波器
IplImage *kernel[40];
int n=0;
for(int j=0;j<5;j++){
for(int i=0;i<8;i++){
double Sigma = 2*PI;
double F = sqrt(2.0);
CvGabor *gabor1 = new CvGabor;
gabor1->Init(i*PI/8, j, Sigma, F);
kernel[n]=cvCreateImage(cvSize(gabor1->get_mask_width(),gabor1->get_mask_width()), IPL_DEPTH_8U, 1);
kernel[n]= gabor1->get_image(CV_GABOR_REAL);
n++;
}
}
//显示所有40个Gabor滤波器的实部
IplImage *kernelAll=cvCreateImage(cvSize(8*kernel[0]->width,5*kernel[0]->height), IPL_DEPTH_8U, 1);
for(int i=0;i<40;i++){
int x=i*kernel[0]->width%(kernelAll->width);
int line=i*kernel[0]->width/(kernelAll->width);
int y=line*kernel[0]->height;
int w=kernel[0]->width;
int h=kernel[0]->height;
cvSetImageROI(kernelAll,cvRect(x,y,w,h));
cvResize(kernel[i],kernelAll);
cvResetImageROI(kernelAll);
}
cvNamedWindow("Gabor Kernel", 1);
cvShowImage("Gabor Kernel",kernelAll);
waitKey(0);
return 0;
}