gabor.cpp
上传用户:soukeisyuu
上传日期:2022-07-03
资源大小:5943k
文件大小:5k
源码类别:

波变换

开发平台:

Visual C++

  1. #include "gabor.h"
  2. CvGabor::CvGabor()
  3. {
  4. }
  5. CvGabor::~CvGabor()
  6. {
  7. }
  8. void CvGabor::initGabor(int fre,int ang,int size,float sigma)
  9. {
  10.     s_fre = fre;
  11.     s_ang = ang;
  12.     aperture_size  = size;
  13.     gaussian_sigma = sigma;
  14.     freq = 0.5*PI/pow(sqrt(2.0),s_fre);
  15.     angle = PI*s_ang/8;
  16. }
  17. void CvGabor::doGabor(IplImage *src,IplImage *dst)
  18. {
  19.     CvMat *floatImg;
  20.     CvMat *gaborReal,*gaborImage;
  21.     CvMat *convReal,*convImage;
  22.     int gaborSize = aperture_size;
  23.     int halfSize  = (gaborSize-1)/2;
  24.     float sigma = gaussian_sigma;
  25.     floatImg =  cvCreateMat(src->height,src->width,CV_32FC1);
  26.     gaborReal = cvCreateMat(gaborSize,gaborSize,CV_32FC1);
  27.     gaborImage = cvCreateMat(gaborSize,gaborSize,CV_32FC1);
  28.     convReal = cvCreateMat(src->height+gaborSize-1,src->width+gaborSize+1,CV_32FC1);
  29.     convImage = cvCreateMat(src->height+gaborSize-1,src->width+gaborSize+1,CV_32FC1);
  30.     char* src_data = src->imageData;
  31.     int src_step = src->widthStep/sizeof(char);
  32.     float* floatImg_data = floatImg->data.fl;
  33.     int floatImg_step = floatImg->step/sizeof(float);
  34.     for(int i=0;i<src->height;i++)
  35.         for(int j=0;j<src->width;j++)
  36.             floatImg_data[i*floatImg_step+j] = (float)src_data[i*src_step+j];
  37.     float gaussPart,realPart,imagePart;
  38.     float* gaborReal_data = gaborReal->data.fl;
  39.     int gaborReal_step = gaborReal->step/sizeof(float);
  40.     float* gaborImage_data = gaborImage->data.fl;
  41.     int gaborImage_step = gaborImage->step/sizeof(float);
  42.     for(int i=0;i<gaborSize;i++)
  43.         for(int j=0;j<gaborSize;j++)
  44.         {
  45.             realPart = cos( freq*cos(angle)*(j-halfSize) + freq*sin(angle)*(i-halfSize) )  - exp( -0.5*sigma*sigma );
  46.             imagePart = sin( freq*cos(angle)*(j-halfSize) + freq*sin(angle)*(i-halfSize) );
  47.             gaussPart = (freq*freq)/(sigma*sigma)*exp( -0.5*(freq*freq)/(sigma*sigma)*((j-halfSize)*(j-halfSize)+(i-halfSize)*(i-halfSize)) );
  48.             gaborReal_data[i*gaborReal_step+j] = gaussPart*realPart;
  49.             gaborImage_data[i*gaborImage_step+j] = gaussPart*imagePart;
  50.         }
  51.     doConv(floatImg,gaborReal,convReal);
  52.     doConv(floatImg,gaborImage,convImage);
  53.     cvPow(convReal,convReal,2.0);
  54.     cvPow(convImage,convImage,2.0);
  55.     char* dst_data = dst->imageData;
  56.     int dst_step = dst->widthStep/sizeof(char);
  57.     float* convReal_data = convReal->data.fl;
  58.     int convReal_step = convReal->step/sizeof(float);
  59.     float* convImage_data = convImage->data.fl;
  60.     int convImage_step = convImage->step/sizeof(float);
  61.     for(int i=0;i<dst->height;i++)
  62.         for(int j=0;j<dst->width;j++)
  63.         {
  64.             dst_data[i*dst_step+j] = min( 255, (int)sqrt(convReal_data[i*convReal_step+j]+convImage_data[i*convImage_step+j]) );
  65.         }
  66.     cvReleaseMat(&floatImg);
  67.     cvReleaseMat(&gaborReal);
  68.     cvReleaseMat(&gaborImage);
  69.     cvReleaseMat(&convReal);
  70.     cvReleaseMat(&convImage);
  71. }
  72. void CvGabor::doConv(CvMat *A,CvMat *B,CvMat* conv)
  73. {
  74.     /*
  75.     float a[] = {1,2,3,4};
  76.     float b[] = {2,3,4,5};
  77.     CvMat *A = new CvMat;
  78.     CvMat *B = new CvMat;
  79.     cvInitMatHeader(A,2,2,CV_32F,a);
  80.     cvInitMatHeader(B,2,2,CV_32F,b);
  81.     */
  82.     /*
  83.     CvMat* conv = cvCreateMat( A->rows + B->rows - 1, A->cols + B->cols - 1,A->type );
  84.     */
  85.     int dftgM = cvGetOptimalDFTSize( A->rows + B->rows - 1 );
  86.     int dftgN = cvGetOptimalDFTSize( A->cols + B->cols - 1 );
  87.     CvMat* dftgA = cvCreateMat( dftgM, dftgN, A->type );
  88.     CvMat* dftgB = cvCreateMat( dftgM, dftgN, B->type );
  89.     CvMat tmp;
  90.     cvGetSubRect( dftgA, &tmp, cvRect(0,0,A->cols,A->rows));
  91.     cvCopy( A, &tmp );
  92.     cvGetSubRect( dftgA, &tmp, cvRect(A->cols,0,dftgA->cols - A->cols,A->rows));
  93.     cvZero( &tmp );
  94.     cvDFT( dftgA, dftgA, CV_DXT_FORWARD, A->rows );
  95.     cvGetSubRect( dftgB, &tmp, cvRect(0,0,B->cols,B->rows));
  96.     cvCopy( B, &tmp );
  97.     cvGetSubRect( dftgB, &tmp, cvRect(B->cols,0,dftgB->cols - B->cols,B->rows));
  98.     cvZero( &tmp );
  99.     cvDFT( dftgB, dftgB, CV_DXT_FORWARD, B->rows );
  100.     cvMulSpectrums( dftgA, dftgB, dftgA, 0);
  101.     cvDFT( dftgA, dftgA, CV_DXT_INV_SCALE, conv->rows );
  102.     cvGetSubRect( dftgA, &tmp, cvRect(0,0,conv->cols,conv->rows) );
  103.     cvCopy( &tmp, conv );
  104.     /*
  105.    for(int i=0;i<2;i++)
  106.     {
  107.         for(int j=0;j<2;j++)
  108.         {
  109.             printf("%ft",cvmGet(A,i,j));
  110.         }
  111.         printf("n");
  112.     }
  113.     printf("n");
  114.     for(int i=0;i<2;i++)
  115.     {
  116.         for(int j=0;j<2;j++)
  117.         {
  118.             printf("%ft",cvmGet(B,i,j));
  119.         }
  120.         printf("n");
  121.     }
  122.     printf("n");
  123.     */
  124.     /*
  125.     for(int i=0;i<3;i++)
  126.     {
  127.         for(int j=0;j<3;j++)
  128.         {
  129.             printf("%ft",cvmGet(conv,i,j));
  130.         }
  131.         printf("n");
  132.     }
  133.     printf("n");
  134.     */
  135.     cvReleaseMat(&dftgA);
  136.     cvReleaseMat(&dftgB);
  137. }