Gabor滤波器的特征提取C++实现

自己项目中用到了Gabor滤波器,于是自己借助Opencv图像库,实现了Gabor滤波器的特征提取,用类的形式将其封装,希望对大家有用>0<。

Gabor参数主要是5个尺度,8个方向,共40个卷积核。本人图片大小为36*48大小。下采样为10*11,故特征维数为:10*11*5*40=4400维。针对特征维数过大,可以采用PCA或LDA降维,这里就不展现了。

Gabor.h

#ifndef _GABOR_H
#define _GABOR_H

#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>

using namespace cv;
using namespace std;

#define Gabor_num    40
#define U   8
#define V   5

class Gabor
{
public:
    Gabor():m_kmax(CV_PI/2),m_f(sqrt(2.0)),m_sigma(CV_PI),ds_w(10),ds_h(11),ke_w(31),ke_h(31),raT(0.9){};

    void  MakeAllGaborKernal();

    void  MakeGaborKernal(int ke_h,int ke_w,int u,int v,Mat &GaborReal,Mat &GaborImg);

    Mat  Gabor_T_Fast1(Mat &src,int ds_h,int ds_w,Mat kel_GR[Gabor_num],Mat kel_GI[Gabor_num]);

    int  Gabor_T_Fast2(Mat &src,int ds_h,int ds_w,Mat kel_GR[Gabor_num],Mat kel_GI[Gabor_num],double* feature);

    Mat  Create_GaborF(Mat& src);

    int  getGaborMeanAndVarianceFeature(Mat &src,double* feature);

private:
    double m_kmax;
    double m_f;   
    double m_sigma; 
    int ds_w;
    int ds_h;
    int ke_w;
    int ke_h;
    double raT;
    Mat  GaborReal[Gabor_num];
    Mat  GaborImg[Gabor_num];

};

#endif


Gabor.cpp

#include "Gabor.h"

enum convtype 
{ 
    full, 
    same,
    valid
};


/*
*@函数名: conv2
*@功能:   卷积运算
*@参数:   const Mat &img    原图片    
           const Mat ikernel 卷积核
           convtype type     卷积类型

*@返回值: Mat               矩阵卷积后的结果
*@作者:   WiseClown
*@日期:   2016-1-7

*---------------------------------------
*时间      修改人         修改者
*---------------------------------------

**/

Mat conv2(const Mat &img, const Mat ikernel, convtype type) 
{
    Mat dest;
    Mat kernel;
    flip(ikernel,kernel,-1);
    Mat source = img;

    if(type 
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
1. 首先,需要定义圆对称Gabor滤波器的参数,包括中心频率、方向、带宽等。可以使用MATLAB中的gabor函数来实现。 2. 接下来,需要加载图像并将其转换为灰度图像。可以使用MATLAB中的imread和rgb2gray函数来实现。 3. 对图像进行Gabor滤波,可以使用MATLAB中的imfilter函数。通过将Gabor滤波器应用于图像的每个像素,可以生成一个新的图像,其中每个像素都代表了该位置的Gabor滤波器响应。 4. 接着,可以计算每个像素的局部能量和相位信息,作为特征向量的一部分。这可以通过计算每个像素Gabor滤波器响应的平方和和复数表示来实现。 5. 最后,可以将特征向量用于图像分类、目标检测等任务。可以使用MATLAB中的机器学习工具箱来实现这些任务。 以下是一个简单的示例代码,用于提取图像的Gabor特征: ``` % 定义Gabor滤波器的参数 lambda = 8; theta = 0; psi = 0; gamma = 0.5; bw = 1; % 加载图像并将其转换为灰度图像 img = imread('lena.jpg'); gray_img = rgb2gray(img); % 应用Gabor滤波器 gabor_filter = gabor(lambda,theta,psi,gamma,bw); gabor_response = imfilter(gray_img,gabor_filter); % 计算局部能量和相位信息 energy = abs(gabor_response).^2; phase = angle(gabor_response); % 将特征向量用于图像分类 % 例如,可以使用支持向量机(SVM)分类器 features = [energy(:) phase(:)]; labels = [ones(numel(energy)/2,1); -ones(numel(energy)/2,1)]; svm_model = fitcsvm(features,labels); ```
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值