實現方法一
轉自:http://blog.csdn.net/yao_zhuang/article/details/2532279
下載cvgabor.cpp和cvgabor.h到你的C/C++工程目錄下
注:改進過的cvgabor類,鏈接爲:http://download.csdn.net/source/490114
特別注意:使用該類需要opencv庫的支持,如何配置環境參見:http://www.opencv.org.cn/index.php/Template:Install
它有如下的功能:
生成特定方向和尺度的gabor
生成可以顯示或者保存的gabor核的實部,虛部
圖像的實部,虛部或者主要(Magnitude)響應
響應可以保存在XML文件中
範例
首先包含頭文件
- #include "cvgabor.h"
創建一個方向是PI/4而尺度是3的gabor
- double Sigma = 2*PI;
- double F = sqrt(2.0);
- CvGabor *gabor1 = new CvGabor;
- gabor1->Init(PI/4, 3, Sigma, F);
獲得實部並顯示它
- IplImage *kernel = cvCreateImage( cvSize(gabor1->get_mask_width(), gabor1->get_mask_width()), IPL_DEPTH_8U, 1);
- kernel = gabor1->get_image(CV_GABOR_REAL);
- cvNamedWindow("Gabor Kernel", 1);
- cvShowImage("Gabor Kernel", kernel);
- cvWaitKey(0);
載入一個圖像並顯示
- IplImage *img = cvLoadImage( "/local/FaceDB/CMU/rotated/217.jpg", CV_LOAD_IMAGE_GRAYSCALE );
- cvNamedWindow("Original Image", 1);
- cvShowImage("Original Image", img);
- cvWaitKey(0);
獲取載入圖像的gabor濾波響應的實部並且顯示
- IplImage *reimg = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1);
- gabor1->conv_img(img, reimg, CV_GABOR_REAL);
- cvNamedWindow("Real Response", 1);
- cvShowImage("Real Response",reimg);
- cvWaitKey(0);
- cvDestroyWindow("Real Response");
獲取載入圖像的gabor濾波響應的實部並且顯示
- IplImage *reimg = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1);
- gabor1->conv_img(img, reimg, CV_GABOR_IMAG);
- cvNamedWindow("Imaginary Response", 1);
- cvShowImage("Imaginary Response",reimg);
- cvWaitKey(0);
- cvDestroyWindow("Imaginary Response");
獲取載入圖像的gabor濾波響應的模並且顯示
- IplImage *reimg = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1);
- gabor1->conv_img(img, reimg, CV_GABOR_MAG);
- cvNamedWindow("Magnitude Response", 1);
- cvShowImage("Magnitude Response",reimg);
- cvWaitKey(0);
- cvDestroyWindow("Magnitude Response");
這個響應可以被取樣爲8位的灰度圖。如果你要原始的浮點類型的數據,你可以這樣做
- IplImage *reimg = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_32F, 1);
- gabor1->conv_img(img, reimg, CV_GABOR_MAG);
然而,這些浮點數據是不能夠以上面灰度圖的形式簡單的顯示,但是它可以被保存在一個XML文件中。
- cvSave( "reimg.xml", (IplImage*)reimg, NULL, NULL, cvAttrList(0,0));
實現方法二
Matlab實現
紹欣師兄給了一個matlab的實現,很好用,下載地址:Gabor Matlab.
程序默認爲5個尺度,8個方向,假設輸入圖像是:
Gabor濾波後的效果圖(每行是同一尺度,每列是同一方向):
實現方法三
OpenCV 實現
大四的時候用過,是一個叫Zhou Mian 的寫的。下載地址:Gabor OpenCV
功能:
生成特定方向和尺度的gabor
生成可以顯示或者保存的gabor核的實部,虛部
圖像的實部,虛部或者主要(Magnitude)響應
示例:
//首先包含頭文件
#include "cvgabor.h"
//創建一個方向是PI/4而尺度是3的gabor
double Sigma = 2*PI;
double F = sqrt(2.0);
CvGabor *gabor1 = new CvGabor; gabor1->Init(PI/4, 3, Sigma, F);
//獲得實部並顯示它
IplImage *kernel = cvCreateImage( cvSize(gabor1->get_mask_width(), gabor1->get_mask_width()), IPL_DEPTH_8U, 1);
kernel = gabor1->get_image(CV_GABOR_REAL);
cvNamedWindow("Gabor Kernel", 1);
cvShowImage("Gabor Kernel", kernel);
cvWaitKey(0);
//載入一個圖像並顯示
IplImage *img = cvLoadImage( "Crop1.bmp", CV_LOAD_IMAGE_GRAYSCALE );
cvNamedWindow("Original Image", 1);
cvShowImage("Original Image", img);
cvWaitKey(0);
//獲取載入圖像的gabor濾波響應的實部並且顯示
IplImage *reimg = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1);
gabor1->conv_img(img, reimg, CV_GABOR_REAL);
cvNamedWindow("Real Response", 1);
cvShowImage("Real Response",reimg);
cvWaitKey(0);
cvDestroyWindow("Real Response");
//獲取載入圖像的gabor濾波響應的虛部並且顯示
IplImage *reimg = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1);
gabor1->conv_img(img, reimg, CV_GABOR_IMAG);
cvNamedWindow("Imaginary Response", 1);
cvShowImage("Imaginary Response",reimg);
cvWaitKey(0);
cvDestroyWindow("Imaginary Response");
//獲取載入圖像的gabor濾波響應的模並且顯示
IplImage *reimg = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1);
gabor1->conv_img(img, reimg, CV_GABOR_MAG);
cvNamedWindow("Magnitude Response", 1);
cvShowImage("Magnitude Response",reimg);
cvWaitKey(0);
cvDestroyWindow("Magnitude Response");