Gabor小波变换滤波器原理与创建

在提取目标的局部空间和频率域信息上,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;
}

下图为运行后得到的40个Gabor滤波器。

Gabor小波变换滤波器原理与创建_第1张图片




你可能感兴趣的:(opencv与机器视觉)