00001 #ifndef GABOR_H_
00002 #define GABOR_H_
00003
00004 #include <iostream>
00005 #include <math.h>
00006
00007 #include "cimg/CImg.h"
00008 using namespace cimg_library;
00009
00010 inline double Gabor_Zero(double sigma,double T,double freq, double x, double y,double phi)
00011 {
00012 return (exp(-((x*x)+(y*y))/(2*sigma*sigma)) * (sin(2*M_PI*freq*(x*cos(T)+y*sin(T))+phi)));
00013 }
00014
00015 inline double Gabor_FirstDerivative( double sigma, double th, double freq, double x, double y, double phi )
00016 {
00017 double gaussValue, sigma_2 = sigma*sigma;
00018
00019 double xa = x*cos(th) + y*sin(th);
00020
00021
00022 gaussValue = -xa*exp(-(x*x+y*y)/(2*sigma_2))*sin(2*M_PI*freq*xa)/sigma_2
00023 + 2*exp(-(x*x+y*y)/(2*sigma_2))*cos(2*M_PI*freq*xa)*M_PI*freq;
00024
00025 return gaussValue;
00026 }
00027
00028 inline double Gabor_SecondDerivative( double sigma, double th, double freq, double x, double y, double phi )
00029 {
00030 double gaussValue, sigma_2 = sigma*sigma, sigma_4 = sigma_2*sigma_2;
00031
00032 double xa = x*cos(th) + y*sin(th);
00033
00034
00035 gaussValue = exp(-(x*x+y*y)/(2*sigma_2))*(-sin(2*M_PI*freq*xa)*sigma_2
00036 + xa*xa*sin(2*M_PI*freq*xa) - 4*xa*cos(2*M_PI*freq*xa)*M_PI*freq*sigma_2
00037 - 4*sin(2*M_PI*freq*xa)*M_PI*M_PI*freq*freq*sigma_4)/sigma_4;
00038
00039 return gaussValue;
00040 }
00041
00042 inline CImg<double> build_GaborZero(double sigma, double orient, double freq, double phi)
00043 {
00044
00045 CImg<double> filt((int)(5 * sigma), (int)(5 * sigma));
00046 double f_cx = 0.5*filt.dimx();
00047 double f_cy = 0.5*filt.dimy();
00048 double norm = 0;
00049
00050 for( int x = 0; x < filt.dimx(); x++ )
00051 for( int y = 0; y < filt.dimy(); y++ )
00052 {
00053 filt(x,y) = Gabor_Zero(sigma, orient, freq, x - f_cx, y - f_cy, phi);
00054 norm += filt(x,y)*filt(x,y);
00055 }
00056 norm /= filt.dimx()*filt.dimy();
00057
00058 for( int x = 0; x < filt.dimx(); x++ )
00059 for( int y = 0; y < filt.dimy(); y++ )
00060 filt(x,y) = filt(x,y) / sqrt(norm);
00061
00062
00063
00064 return filt;
00065 }
00066
00067 inline CImg<double> build_GaborFirst(double sigma, double orient, double freq, double phi)
00068 {
00069
00070 CImg<double> filt((int)(5 * sigma), (int)(5 * sigma));
00071 double f_cx = 0.5*filt.dimx();
00072 double f_cy = 0.5*filt.dimy();
00073 double norm = 0;
00074
00075 for( int x = 0; x < filt.dimx(); x++ )
00076 for( int y = 0; y < filt.dimy(); y++ )
00077 {
00078 filt(x,y) = Gabor_FirstDerivative(sigma, orient, freq, x - f_cx, y - f_cy, phi);
00079 norm += filt(x,y)*filt(x,y);
00080 }
00081 norm /= filt.dimx()*filt.dimy();
00082
00083 for( int x = 0; x < filt.dimx(); x++ )
00084 for( int y = 0; y < filt.dimy(); y++ )
00085 filt(x,y) = filt(x,y) / sqrt(norm);
00086
00087
00088
00089 return filt;
00090 }
00091
00092 inline CImg<double> build_GaborSecond(double sigma, double orient, double freq, double phi)
00093 {
00094
00095 CImg<double> filt((int)(5 * sigma), (int)(5 * sigma));
00096 double f_cx = 0.5*filt.dimx();
00097 double f_cy = 0.5*filt.dimy();
00098 double norm = 0;
00099
00100 for( int x = 0; x < filt.dimx(); x++ )
00101 for( int y = 0; y < filt.dimy(); y++ )
00102 {
00103 filt(x,y) = Gabor_SecondDerivative(sigma, orient, freq, x - f_cx, y - f_cy, phi);
00104 norm += filt(x,y)*filt(x,y);
00105 }
00106 norm /= filt.dimx()*filt.dimy();
00107
00108 for( int x = 0; x < filt.dimx(); x++ )
00109 for( int y = 0; y < filt.dimy(); y++ )
00110 filt(x,y) = filt(x,y) / sqrt(norm);
00111
00112
00113
00114 return filt;
00115 }
00116
00117 inline double convolveSepFilters(CImg<double> &image,
00118 CImg<double> filt1,
00119 CImg<double> filt2,
00120 double centerfilter_x,
00121 double centerfilter_y)
00122 {
00123 double my_result = 0.0;
00124
00125 for (int i = 0; i < filt1.dimx(); i ++)
00126 my_result += filt1(i) * image.linear_pix2d(centerfilter_x - (filt1.dimx() - 1)/2 + i, centerfilter_y);
00127
00128 for (int j = 0; j < filt2.dimx(); j ++)
00129 my_result += filt2(j) * image.linear_pix2d(centerfilter_x, centerfilter_y - (filt2.dimx() - 1)/2 + j);
00130
00131 return my_result;
00132 }
00133
00134
00135 #endif // GABOR_H_