Gabor变换的opencv实现

2024-02-10 20:18
文章标签 实现 opencv 变换 gabor

本文主要是介绍Gabor变换的opencv实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一直在做人脸识别方向,想用一下Gabor滤波器做一下Gabor人脸。从网上看到 Mian Zhou. Thesis. Gabor-Boosting Face Recognition的Gabor代码,也是基于Opencv的但是,代码是基于C结构的,用起来感觉不方便,就花一天的时间,修改成了C++结构的。
/*
Copyright (C) 2014 by Fangqi Su
Reference: Mian Zhou. Thesis. Gabor-Boosting Face Recognition
*/
#ifndef GABORFLITER_H
#define GABORFLITER_H
#include<iostream>
#include<opencv2\opencv.hpp>
#include<highgui.h>
#define CV_GABOR_REAL 1
#define CV_GABOR_IMAG 2
#define CV_GABOR_MAG 3
#define CV_GABOR_PHASE 4
using namespace cv;
class Gabor
{public:Gabor();Gabor(int iMu,int iNu,double dSigma);Gabor(int iMu,int iNu,double dSigma,double dF);Gabor(double dPhi,int iNu);Gabor(double dPhi,int iNu,double dSigma);Gabor(double dPhi,int iNu,double dSigma,double dF);Gabor(int iMu,int iNu);bool IsInit();bool IsKernelCreate();long mask_width();void Init(int iMu,int iNu,double dSigma,double dF);void Init(double dPhi,int iNu,double dSigma,double dF);void output_file(const char *filename,int Type);Mat get_matrix(int Type);Mat get_image(int Type);void show(int Type);void conv_img(Mat &src,Mat&dst,int Type);long Gabor::get_mask_width();protected:int KernelSize;double Sigma;double F;double Kmax;double K;double Phi;bool bInitialised;bool bKernel;long Width;Mat Imag;Mat Real;private:void creat_kernel();};#endif
/*
Copyright (C) 2014 by Fangqi Su
Reference: Mian Zhou. Thesis. Gabor-Boosting Face Recognition
*/
#include"GaborFliter.h"Gabor::Gabor()
{}
/*
fn Gabor::Gabor(int iMu,int iNu,double dSigma);
Constuct a gabor
Parameters:
iMu		The orientation iMu*PI/8,
iNu 		The scale,
dSigma 		The sigma value of Gabor,Create a gabor with a orientation iMu*PI/8, a scale iNu, and a sigma value dSigma. The spatial frequence (F) is set to sqrt(2) defaultly. It calls Init() to generate parameters and kernels.
*/
Gabor::Gabor(int iMu,int iNu,double dSigma)
{F=sqrt(2.0);Init(iMu,iNu,dSigma,F);
}
/*!
\fn Gabor::Gabor(int iMu, int iNu, double dSigma, double dF)
Construct a gaborParameters:
iMu		    The orientation iMu*PI/8
iNu 		The scale
dSigma 		The sigma value of Gabor
dF		    The spatial frequency Returns:
NoneCreate a gabor with a orientation iMu*PI/8, a scale iNu, a sigma value dSigma, and a spatial frequence dF. It calls Init() to generate parameters and kernels.
*/
Gabor::Gabor(int iMu,int iNu,double dSigma,double dF)
{Init(iMu,iNu,dSigma,dF);
}
/*!
\fn Gabor::Gabor(double dPhi, int iNu)
Construct a gaborParameters:
dPhi		The orientation in arc
iNu 		The scaleReturns:
NoneCreate a gabor with a orientation dPhi, and with a scale iNu. The sigma (Sigma) and the spatial frequence (F) are set to 2*PI and sqrt(2) defaultly. It calls Init() to generate parameters and kernels.
*/
Gabor::Gabor(double dPhi,int iNu)
{Sigma=2*CV_PI;F=sqrt(2.0);Init(dPhi,iNu,Sigma,F);
}
/*!
\fn Gabor::Gabor(double dPhi, int iNu, double dSigma)
Construct a gaborParameters:
dPhi		The orientation in arc
iNu 		The scale
dSigma		The sigma value of GaborReturns:
NoneCreate a gabor with a orientation dPhi, a scale iNu, and a sigma value dSigma. The spatial frequence (F) is set to sqrt(2) defaultly. It calls Init() to generate parameters and kernels.
*/
Gabor::Gabor(double dPhi,int iNu,double dSigma)
{F=sqrt(2.0);Init(dPhi,iNu,dSigma,F);
}
/*!
\fn Gabor::Gabor(double dPhi, int iNu, double dSigma, double dF)
Construct a gaborParameters:
dPhi		The orientation in arc
iNu 		The scale
dSigma 		The sigma value of Gabor
dF		The spatial frequency Returns:
NoneCreate a gabor with a orientation dPhi, a scale iNu, a sigma value dSigma, and a spatial frequence dF. It calls Init() to generate parameters and kernels.
*/
Gabor::Gabor(double dPhi,int iNu,double dSigma,double dF)
{Init(dPhi,iNu,dSigma,dF);
}
/*!
\fn Gabor::IsInit()
Determine the gabor is initilised or notParameters:
NoneReturns:
a boolean value, TRUE is initilised or FALSE is non-initilised.Determine whether the gabor has been initlized - variables F, K, Kmax, Phi, Sigma are filled.
*/
bool Gabor::IsInit()
{return bInitialised;
}
/*!
\fn Gabor::mask_width()
Give out the width of the maskParameters:
NoneReturns:
The long type show the width.Return the width of mask (should be NxN) by the value of Sigma and iNu.
*/
long Gabor::mask_width()
{long lWidth;if(IsInit()==false){perror("Error:Error: The Object has not been initilised in mask_width()!\n");return 0;}else {double dModSigma=Sigma/K;double dWidth=cvRound(dModSigma*6+1);if(fmod(dWidth,2.0)==0.0)dWidth++;lWidth=(long)dWidth;return lWidth;}
}
/*!
\fn Gabor::creat_kernel()
Create gabor kernelParameters:
NoneReturns:
NoneCreate 2 gabor kernels - REAL and IMAG, with an orientation and a scale 
*/
void Gabor::creat_kernel()
{if (IsInit() == false) {perror("Error: The Object has not been initilised in creat_kernel()!\n");}else {Mat mReal(Width,Width,CV_32F),mImag(Width,Width,CV_32F);/**************************** Gabor Function ****************************/ int x,y;double dReal;double dImag;double dTemp1,dTemp2,dTemp3;for(int i=0;i<Width;i++){for(int j=0;j<Width;j++){x=i-(Width-1)/2;y=j-(Width-1)/2;dTemp1 = (pow(K,2)/pow(Sigma,2))*exp(-(pow((double)x,2)+pow((double)y,2))*pow(K,2)/(2*pow(Sigma,2)));dTemp2 = cos(K*cos(Phi)*x + K*sin(Phi)*y) - exp(-(pow(Sigma,2)/2));dTemp3 = sin(K*cos(Phi)*x + K*sin(Phi)*y);dReal = dTemp1*dTemp2;dImag = dTemp1*dTemp3; mReal.at<float>(i,j)=dReal;mImag.at<float>(i,j)=dImag;}}/**************************** Gabor Function ****************************/bKernel=true;mReal.copyTo(Real);mImag.copyTo(Imag);}
}
/*!
\fn Gabor::get_image(int Type)
Get the speific type of image of GaborParameters:
Type		The Type of gabor kernel, e.g. REAL, IMAG, MAG, PHASE   Returns:
Pointer to image structure, or NULL on failure	Return an Image (gandalf image class) with a specific Type   "REAL"	"IMAG" "MAG" "PHASE"  
*/
Mat Gabor::get_image(int Type)
{if(IsKernelCreate() == false){ perror("Error: the Gabor kernel has not been created in get_image()!\n");return Mat();}Mat pImage(Width,Width,CV_32F,1);Mat newimage(Width,Width,CV_32FC1);Mat kernel(Width,Width,CV_32FC1);Mat re(Width,Width,CV_32FC1);Mat im(Width,Width,CV_32FC1);Mat ve;int rows=kernel.rows;int cols=kernel.cols;switch (Type){case 1://realReal.copyTo(kernel);kernel.copyTo(pImage);pImage=pImage.t();break;case 2://ImagImag.copyTo(kernel);kernel.copyTo(pImage);pImage=pImage.t();break;case 3://MagnitudeReal.copyTo(re);Imag.copyTo(im);pow(re,2,re);pow(im,2,im);pow(im+re,0.5,ve);ve.copyTo(pImage);pImage=pImage.t();break;default:break;}normalize(pImage,pImage,0,255,CV_MINMAX,NULL);pImage.convertTo(pImage,CV_8U);convertScaleAbs(pImage,newimage,1,0);newimage.convertTo(newimage,CV_8U);return newimage;
}
/*!
\fn Gabor::IsKernelCreate()
Determine the gabor kernel is created or notParameters:
NoneReturns:
a boolean value, TRUE is created or FALSE is non-created.Determine whether a gabor kernel is created.
*/
bool Gabor::IsKernelCreate()
{return bKernel;
}
/*!
\fn Gabor::get_mask_width()
Reads the width of MaskParameters:
NoneReturns:
Pointer to long type width of mask.
*/
long Gabor::get_mask_width()
{return Width;
}
/*!
\fn Gabor::Init(int iMu, int iNu, double dSigma, double dF)
Initilize the.gaborParameters:
iMu 	The orientations which is iMu*PI.8
iNu 	The scale can be from -5 to infinit
dSigma 	The Sigma value of gabor, Normally set to 2*PI
dF 	The spatial frequence , normally is sqrt(2)Returns:Initilize the.gabor with the orientation iMu, the scale iNu, the sigma dSigma, the frequency dF, it will call the function creat_kernel(); So a gabor is created.
*/
void Gabor::Init(int iMu,int iNu,double dSigma,double dF)
{bInitialised=false;bKernel=false;F=dF;Sigma=dSigma;Kmax=CV_PI/2;// Absolute value of KK = Kmax / pow(F, (double)iNu);Phi = CV_PI*iMu/8;bInitialised = true;Width = mask_width();Real = Mat( Width, Width, CV_32FC1);Imag = Mat( Width, Width, CV_32FC1);creat_kernel();  }
/*!
\fn CvGabor::CvGabor(int iMu, int iNu)
*/
Gabor::Gabor(int iMu, int iNu)
{double dSigma = 2*CV_PI; F = sqrt(2.0);Init(iMu, iNu, dSigma, F);
}
/*!
\fn Gabor::Init(double dPhi, int iNu, double dSigma, double dF)
Initilize the.gaborParameters:
dPhi 	The orientations 
iNu 	The scale can be from -5 to infinit
dSigma 	The Sigma value of gabor, Normally set to 2*PI
dF 	The spatial frequence , normally is sqrt(2)Returns:
NoneInitilize the.gabor with the orientation dPhi, the scale iNu, the sigma dSigma, the frequency dF, it will call the function creat_kernel(); So a gabor is created.filename 	The name of the image file
file_format 	The format of the file, e.g. GAN_PNG_FORMAT
image 	The image structure to be written to the file
octrlstr 	Format-dependent control structure*/
void Gabor::Init(double dPhi, int iNu, double dSigma, double dF)
{bInitialised = false;bKernel = false;Sigma = dSigma;F = dF;Kmax =CV_PI/2;// Absolute value of KK = Kmax / pow(F, (double)iNu);Phi = dPhi;bInitialised = true;Width = mask_width();Real = Mat( Width, Width, CV_32FC1);Imag = Mat( Width, Width, CV_32FC1);creat_kernel();  
}
/*!
\fn Gabor::get_matrix(int Type)
Get a matrix by the type of kernelParameters:
Type		The type of kernel, e.g. REAL, IMAG, MAG, PHASEReturns:
Pointer to matrix structure, or NULL on failure.Return the gabor kernel.
*/
Mat Gabor::get_matrix(int Type)
{if (!IsKernelCreate()) {perror("Error: the gabor kernel has not been created!\n"); return Mat();}switch (Type){case CV_GABOR_REAL:return Real;break;case CV_GABOR_IMAG:return Imag;break;case CV_GABOR_MAG:return Mat();break;case CV_GABOR_PHASE:return Mat();break;}
}
/*!
\fn Gabor::output_file(const char *filename, Gan_ImageFileFormat file_format, int Type)
Writes a gabor kernel as an image file.Parameters:
filename 	The name of the image file
file_format 	The format of the file, e.g. GAN_PNG_FORMAT
Type		The Type of gabor kernel, e.g. REAL, IMAG, MAG, PHASE   
Returns:
NoneWrites an image from the provided image structure into the given file and the type of gabor kernel.
*/
void Gabor::output_file(const char *filename, int Type)
{Mat pImage;pImage = get_image(Type);if(pImage .data!= NULL){if( imwrite(filename, pImage )) printf("%s has been written successfully!\n", filename);else printf("Error: writting %s has failed!\n", filename);}else perror("Error: the image is empty in output_file()!\n"); }
/*!
\fn CvGabor::conv_img_a(IplImage *src, IplImage *dst, int Type)
*/
void Gabor::conv_img(Mat &src, Mat &dst, int Type)
{Mat mat;src.copyTo(mat);mat.convertTo(mat,CV_32FC1);mat=mat.t();Mat temp;Mat rmat(src.rows,src.cols,CV_32FC1);Mat imat(src.rows,src.cols,CV_32FC1);Mat kernel(Width,Width,CV_32FC1);switch (Type){case CV_GABOR_REAL:Real.copyTo(kernel);filter2D( mat, mat,mat.depth(),kernel, Point( (Width-1)/2, (Width-1)/2));break;case CV_GABOR_IMAG:Imag.copyTo(kernel);filter2D( mat, mat,mat.depth(),kernel, Point( (Width-1)/2, (Width-1)/2));break;case CV_GABOR_MAG:/* Real Response */Real.copyTo(kernel);filter2D( mat, rmat,rmat.depth(),kernel, Point( (Width-1)/2, (Width-1)/2));/* Imag Response */Imag.copyTo(kernel);filter2D( mat, imat,imat.depth(),kernel, Point( (Width-1)/2, (Width-1)/2));/* Magnitude response is the square root of the sum of the square of real response and imaginary response */pow(rmat,2,rmat);pow(imat,2,imat);add(rmat,imat,temp);pow(temp,0.5,temp);temp.copyTo(mat);break;case CV_GABOR_PHASE:break;}normalize(mat,mat,0,255,CV_MINMAX,NULL);mat.convertTo(mat,CV_8U);mat=mat.t();mat.copyTo(dst);
}

这篇关于Gabor变换的opencv实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/697975

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J