Gabor濾波小結的OpenCV實現

轉載請註明: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實現代碼

 1CGaborFilter::CGaborFilter(float dLambda, float dTheta, float dRatio_S2L, float dGamma, float dPhi)
  2{
  3    Lambda = dLambda;
  4    Theta = dTheta;
  5    sigma = dLambda*dRatio_S2L;
  6    Gamma = dGamma;
  7    Phi = dPhi;
  8    m_pGaborFilter = NULL;
  9    bParam = 1;
 10}
 11
 12
 13CGaborFilter::~CGaborFilter(void)
 14{
 15    cvReleaseMat(&m_pGaborFilter);
 16}
 17
 18void CGaborFilter::Init()
 19{
 20    float dtmp;
 21    int itmp;
 22    if(is_param() == 0)
 23    {
 24        printf("The parameters are not enough!");
 25    }
 26    else
 27    {
 28        dtmp = sqrt(48*pow(sigma,2)+1);
 29        itmp = cvRound(dtmp);
 30        if(itmp%2 == 0)
 31            itmp ++;
 32        GaborWindow.height = GaborWindow.width = 16;
 33        bInit = 1;
 34
 35        create_kernel();
 36    }
 37}
 38
 39void CGaborFilter::Init(float dSigma,float dTheta,float dPhi)
 40{
 41    float dtmp;
 42    int itmp;
 43
 44    sigma = dSigma;
 45    Theta = dTheta;
 46    Phi = dPhi;
 47    Gamma = GAMMA;
 48    Lambda = sigma/RATIO_S2L;
 49    bParam = 1;
 50
 51    dtmp = sqrt(24*pow(sigma,2));
 52    itmp = cvRound(dtmp);
 53    if(itmp%2 == 0)
 54        itmp ++;
 55    GaborWindow.height = GaborWindow.width = itmp;
 56    bInit = 1; 
 57
 58    create_kernel();
 59}
 60
 61void CGaborFilter::Init(float dLambda,float dTheta, float dPhi,float dGamma)
 62{
 63    float dtmp;
 64    int itmp;
 65
 66    Lambda = dLambda;
 67    Theta  = dTheta;
 68    Phi    = dPhi;
 69    Gamma  = dGamma;
 70    sigma  = Lambda * RATIO_S2L;
 71    bParam = 1;
 72
 73    dtmp = sqrt(24*pow(sigma,2));
 74    itmp = cvRound(dtmp);
 75    if(itmp%2 == 0)
 76        itmp ++;
 77    GaborWindow.height = GaborWindow.width = itmp;
 78    bInit = 1; 
 79
 80    create_kernel();
 81}
 82
 83void CGaborFilter::create_kernel()
 84{
 85    float tmp1,tmp2,xtmp,ytmp,re;
 86    int i,j,x,y;
 87
 88    if(is_init() == 0)
 89        printf("The parameters haven't been initialed!");
 90
 91
 92    else{
 93
 94
 95        m_pGaborFilter = cvCreateMat(GaborWindow.height,GaborWindow.width,CV_32FC1);
 96        for(i= 0; i< GaborWindow.height; i++)
 97            for(j = 0; j< GaborWindow.width; j++)
 98            {
 99                x = j - GaborWindow.width/2;
100                y = i - GaborWindow.height/2;
101
102
103                xtmp = (float)x*cos(Theta) - (float)y*sin(Theta);
104                ytmp = (float)x*sin(Theta) + (float)y*cos(Theta);
105
106                tmp1 = exp(-(pow(xtmp,2)+pow(ytmp*Gamma,2))/(2*pow(sigma,2)));
107                tmp2 = cos(2*PI*xtmp/Lambda + Phi);
108                // int p=sizeof(float);
109                re   = tmp1*tmp2;
110                cvSetReal2D((CvMat*)m_pGaborFilter,i,j,re);
111
112            }
113            bKernel = 1;
114    }
115}
116
117IplImage * CGaborFilter::get_Image()
118{
119    if(is_kernel() == 0)
120    {
121        printf("The filter hasn't bee created!");
122    }
123    else
124    {
125        IplImage *pImg = cvCreateImage(GaborWindow,IPL_DEPTH_32F,1);
126        IplImage *pImgU8 = cvCreateImage(GaborWindow,IPL_DEPTH_8U,1);
127        CvMat * pMat = cvCreateMat(GaborWindow.height,GaborWindow.width,CV_32FC1);
128
129        cvCopy(m_pGaborFilter,pImg);
130        //pImg->imageData = (char *)pMat->data;
131        cvNormalize((IplImage*)pImg, (IplImage*)pImg,0,255,CV_MINMAX,NULL);
132        cvConvertScaleAbs(pImg,pImgU8,1,0);
133        return pImgU8;
134    }
135}
136
137IplImage * CGaborFilter::do_filter(const IplImage * src)
138{
139    if(is_kernel()==false)
140    {
141        printf("The Gabor Kernel has not been created!");
142    }
143    else{
144
145        IplImage *pDestImage = cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);
146        // IplImage * pGaborImage = get_Imge();
147        // CvMat GaborKernel = cvMat(pGaborImage->height,pGaborImage->width,CV_8U,pGaborImage->imageData);
148        IplImage *tmpImg = cvCloneImage(src);
149        IplImage *tmpGrayImg = cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);
150
151        if(tmpImg->nChannels != 1)
152        {
153            cvCvtColor(tmpImg,tmpGrayImg,CV_BGR2GRAY);
154        }
155        else 
156        {
157            cvReleaseImage(&tmpGrayImg);
158            tmpGrayImg = tmpImg;
159        }
160        CvMat * pGaborKernel = get_Mat();
161
162        cvFilter2D(tmpGrayImg,pDestImage,pGaborKernel,cvPoint((GaborWindow.width-1)/2,(GaborWindow.height-1)/2));
163
164        cvReleaseImage(&tmpImg);
165        return  pDestImage;  
166    }
167}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章