學習OpenCV——Gabor函數的應用

原文:http://blog.csdn.net/yao_zhuang/article/details/2532279

 

下載cvgabor.cppcvgabor.h到你的C/C++工程目錄下

注:在我的資源中有改進過的cvgabor類

    相關鏈接爲:http://download.csdn.net/source/490114

特別注意:使用該類需要opencv庫的支持,如何配置環境參見:http://www.opencv.org.cn/index.php/Template:Install

它有如下的功能:

生成特定方向和尺度的gabor

生成可以顯示或者保存的gabor核的實部,虛部

圖像的實部,虛部或者主要(Magnitude)響應

響應可以保存在XML文件中

 

  1. #include "cvgabor.h"  
  2. int main(){  
  3.   
  4.     //創建一個方向是PI/4而尺度是3的gabor  
  5.     double Sigma = 2*PI;    
  6.     double F = sqrt(2.0);    
  7.     CvGabor *gabor1 = new CvGabor;    
  8.     gabor1->Init(PI/4, 3, Sigma, F);  
  9.       
  10.     //獲得實部並顯示它  
  11.     IplImage *kernel = cvCreateImage( cvSize(gabor1->get_mask_width(), gabor1->get_mask_width()), IPL_DEPTH_8U, 1);  
  12.     kernel = gabor1->get_image(CV_GABOR_REAL);  
  13.     cvNamedWindow("Gabor Kernel", 1);  
  14.     cvShowImage("Gabor Kernel", kernel);  
  15.     cvWaitKey(0);  
  16.   
  17.     //載入一個圖像並顯示  
  18.     IplImage *img = cvLoadImage( "D:/Demo.jpg", CV_LOAD_IMAGE_GRAYSCALE );  
  19.     cvNamedWindow("Original Image", 1);  
  20.     cvShowImage("Original Image", img);  
  21.     cvWaitKey(0);  
  22.   
  23.     //獲取載入圖像的gabor濾波響應的實部並且顯示  
  24.     IplImage *reimg = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1);  
  25.     gabor1->conv_img(img, reimg, CV_GABOR_REAL);  
  26.     cvNamedWindow("Real Response", 1);  
  27.     cvShowImage("Real Response",reimg);  
  28.     cvWaitKey(0);  
  29.     cvDestroyWindow("Real Response");  
  30.   
  31.     //獲取載入圖像的gabor濾波響應的虛部並且顯示  
  32. //  IplImage *reimg = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1);  
  33.     gabor1->conv_img(img, reimg, CV_GABOR_IMAG);  
  34.     cvNamedWindow("Imaginary Response", 1);  
  35.     cvShowImage("Imaginary Response",reimg);  
  36.     cvWaitKey(0);  
  37.     cvDestroyWindow("Imaginary Response");  
  38.   
  39.     //獲取載入圖像的gabor濾波響應的模並且顯示  
  40. //  IplImage *reimg = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1);  
  41.     gabor1->conv_img(img, reimg, CV_GABOR_MAG);  
  42.     cvNamedWindow("Magnitude Response", 1);  
  43.     cvShowImage("Magnitude Response",reimg);  
  44.     cvWaitKey(0);  
  45.     cvDestroyWindow("Magnitude Response");  
  46.   
  47.     /* 
  48.     //這個響應可以被取樣爲8位的灰度圖。如果你要原始的浮點類型的數據,你可以這樣做 
  49.     IplImage *reimg = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_32F, 1); 
  50.     gabor1->conv_img(img, reimg, CV_GABOR_MAG); 
  51.     //然而,這些浮點數據是不能夠以上面灰度圖的形式簡單的顯示,但是它可以被保存在一個XML文件中。 
  52.     cvSave( "reimg.xml", (IplImage*)reimg, NULL, NULL, cvAttrList(0,0)); 
  53.     */  
  54.   
  55.   
  56.   
  57. }  

 

概念:

1.關於小波變換: 

一種多分辨率分析工具,爲不同尺度上信號的的分析和表徵提供了精確和統一框架。它的原理是來源於Fourier變換!但是它比傳統的Fourier變換有更多優點,比如: 

1)小波變換可以覆蓋整個頻域; 
2)可以通過選取合適濾波器,減少或除去提取的不同特徵之間的相關性; 
3)具有變焦特性,低頻段可用高頻率分辨率和低時間分辨率,在高頻段可用低頻率分辨率和高時間分辨率 
4)小波變換在實現上有快速算法(Mallat小波分析算法)。 

提到小波變換必須提到小波函數,簡單的說,積分爲0的函數都可以作爲小波函數,還可以通過一系列變化得到連續的小波變換式。 
小波變換適用小波函數族及其相應的尺度函數將原始信號分解成不同的頻帶。一般所說的小波變換僅遞歸分解信號的低頻部分,以生成下一尺度的各頻道輸出。層層分解(圖片不附了),這樣的分解通常稱爲金字塔結構小波變換。 

如果不僅僅對低通濾波器輸出進行遞歸分解,而且也對高通濾波器的輸出進行遞歸分解,則稱之爲小波包分解。(樹狀的圖形) 
小波變換具有良好的時頻局部化、尺度變換和方向特徵,是分析紋理的有力工具。 


2.Gabor 變換 

根據模擬人類視覺系統而產生。通過模擬人類視覺系統,可以將視網膜成像分解成一組濾波圖像,每個分解的圖像能夠反映頻率和方向在局部範圍內的強度變化。通過一組多通道Gabor濾波器,可以獲得紋理特徵。 
Gabor變換的根本就是Gabor濾波器的設計,而濾波器的設計又是其頻率函數(U,V)和Gauss函數參數(一個)的設計。實際上,Gabor變換是爲了提取信號Fourier變換的局部信息,使用了一個Gauss函數作爲窗函數,因爲一個Gauss函數的Fourier變換還是一個Gauss函 數,所以Fourier逆變換也是局部的。 

通過頻率參數和高斯函數參數的選取,Gabor變換可以選取很多紋理特徵,但是Gabor是非正交的,不同特徵分量之間有冗餘,所以在對紋理圖像的分析中效率不太高。
 

發佈了77 篇原創文章 · 獲贊 103 · 訪問量 85萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章