Gabor滤波小结

转载请注明:http://www.cppblog.com/polly-yang/


一.房屋检测小结   

    一开始,直接用LSDLine Segment Detector)检测VHRVery High Resolution)遥感卫星图像中的房屋,效果很屎。效果很屎的主要原因是因为存在各种干扰,概括下来,主要有:
      1. 
道路。道路干扰性强主要是因为道路呈现各种形态,弯曲,笔直,宽度不一。同时还有桥梁也影响检测率,桥梁附近呈现较好的阴影效果和Line Segment,会干扰几何检测方法。
      2.
森林或农田。利用LSD检测Line Segment的时候,由于LSD原理限制,在森林或农田区域,会形成较多的Line Segment,影响几何检测方法。
      3.
房屋本身。实际VHR遥感图像中,房屋形态较多,大小差异较大,且有的呈现不规则的形状,有的成像后,边缘模糊,不利于产生较好的LSD结果。
      4.
遮挡。主要是被森林遮挡,屋顶形状不完整,不利于设计算法判别。
      6.
光照不均,屋顶自身纹理。光照不均和屋顶自己纹理不均匀,都会加大VHR中物体的检测难度。     
   

二.Gabor 滤波器简介(部分资料来自维基百科)

   在图像处理领域,Gabor滤波器是一个用于边缘检测的线性滤波器。Gabor滤波器的频率和方向表示接近人类视觉系统对于频率和方向的表示,并且它们常备用于纹理表示和描述。在空域,一个2维的Gabor滤波器是一个正弦平面波和高斯核函数的乘积。Gabor滤波器是自相似的,也就是说,所有Gabor滤波器都可以从一个母小波经过膨胀和旋转产生。实际应用中,Gabor滤波器可以在频域的不同尺度,不同方向上提取相关特征。

三.Gabor滤波器公式化定义 

公式中:

λ:正弦函数波长;

θGabor核函数的方向 

ψ:相位偏移

σ:高斯函数的标准差 

γ 空间的宽高比(这个没太理解

 

四.Gabor 滤波器opencv实现代码

  CGaborFilter::CGaborFilter(float dLambda, float dTheta, float dRatio_S2L, float dGamma, float dPhi)
  {
      Lambda = dLambda;
      Theta = dTheta;
      sigma = dLambda*dRatio_S2L;
      Gamma = dGamma;
      Phi = dPhi;
      m_pGaborFilter = NULL;
     bParam = 1;
 }
 
 
 CGaborFilter::~CGaborFilter(void)
 {
     cvReleaseMat(&m_pGaborFilter);
 }
 
 void CGaborFilter::Init()
 {
     float dtmp;
     int itmp;
     if(is_param() == 0)
     {
         printf("The parameters are not enough!");
     }
     else
     {
         dtmp = sqrt(48*pow(sigma,2)+1);
         itmp = cvRound(dtmp);
         if(itmp%2 == 0)
             itmp ++;
         GaborWindow.height = GaborWindow.width = 16;
         bInit = 1;
 
         create_kernel();
     }
 }
 
 void CGaborFilter::Init(float dSigma,float dTheta,float dPhi)
 {
     float dtmp;
     int itmp;
 
     sigma = dSigma;
     Theta = dTheta;
     Phi = dPhi;
     Gamma = GAMMA;
     Lambda = sigma/RATIO_S2L;
     bParam = 1;
 
     dtmp = sqrt(24*pow(sigma,2));
     itmp = cvRound(dtmp);
     if(itmp%2 == 0)
         itmp ++;
     GaborWindow.height = GaborWindow.width = itmp;
     bInit = 1; 
 
     create_kernel();
 }
 
 void CGaborFilter::Init(float dLambda,float dTheta, float dPhi,float dGamma)
 {
     float dtmp;
     int itmp;
 
     Lambda = dLambda;
     Theta  = dTheta;
     Phi    = dPhi;
     Gamma  = dGamma;
     sigma  = Lambda * RATIO_S2L;
     bParam = 1;
 
     dtmp = sqrt(24*pow(sigma,2));
     itmp = cvRound(dtmp);
     if(itmp%2 == 0)
         itmp ++;
     GaborWindow.height = GaborWindow.width = itmp;
     bInit = 1; 
 
     create_kernel();
 }
 
 void CGaborFilter::create_kernel()
 {
     float tmp1,tmp2,xtmp,ytmp,re;
     int i,j,x,y;
 
     if(is_init() == 0)
         printf("The parameters haven't been initialed!");
 
 
     else{
 
 
         m_pGaborFilter = cvCreateMat(GaborWindow.height,GaborWindow.width,CV_32FC1);
         for(i= 0; i< GaborWindow.height; i++)
            for(j = 0; j< GaborWindow.width; j++)
            {
                x = j - GaborWindow.width/2;
                y = i - GaborWindow.height/2;


                xtmp = (float)x*cos(Theta) - (float)y*sin(Theta);
                ytmp = (float)x*sin(Theta) + (float)y*cos(Theta);

                tmp1 = exp(-(pow(xtmp,2)+pow(ytmp*Gamma,2))/(2*pow(sigma,2)));
                tmp2 = cos(2*PI*xtmp/Lambda + Phi);
                // int p=sizeof(float);
                re   = tmp1*tmp2;
                cvSetReal2D((CvMat*)m_pGaborFilter,i,j,re);

            }
            bKernel = 1;
    }
}

IplImage * CGaborFilter::get_Image()
{
    if(is_kernel() == 0)
    {
        printf("The filter hasn't bee created!");
    }
    else
    {
        IplImage *pImg = cvCreateImage(GaborWindow,IPL_DEPTH_32F,1);
        IplImage *pImgU8 = cvCreateImage(GaborWindow,IPL_DEPTH_8U,1);
        CvMat * pMat = cvCreateMat(GaborWindow.height,GaborWindow.width,CV_32FC1);

        cvCopy(m_pGaborFilter,pImg);
        //pImg->imageData = (char *)pMat->data;
        cvNormalize((IplImage*)pImg, (IplImage*)pImg,0,255,CV_MINMAX,NULL);
        cvConvertScaleAbs(pImg,pImgU8,1,0);
        return pImgU8;
    }
}

IplImage * CGaborFilter::do_filter(const IplImage * src)
{
    if(is_kernel()==false)
    {
        printf("The Gabor Kernel has not been created!");
    }
    else{

        IplImage *pDestImage = cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);
        // IplImage * pGaborImage = get_Imge();
        // CvMat GaborKernel = cvMat(pGaborImage->height,pGaborImage->width,CV_8U,pGaborImage->imageData);
        IplImage *tmpImg = cvCloneImage(src);
        IplImage *tmpGrayImg = cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);

        if(tmpImg->nChannels != 1)
        {
            cvCvtColor(tmpImg,tmpGrayImg,CV_BGR2GRAY);
        }
        else 
        {
            cvReleaseImage(&tmpGrayImg);
            tmpGrayImg = tmpImg;
        }
       CvMat * pGaborKernel = get_Mat();

        cvFilter2D(tmpGrayImg,pDestImage,pGaborKernel,cvPoint((GaborWindow.width-1)/2,(GaborWindow.height-1)/2));

        cvReleaseImage(&tmpImg);
        return  pDestImage;  
    }
}


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值