天天看點

圖像處理-紋理檢測-lbp

本文轉載自http://blog.csdn.net/quarryman/article/details/9906047

LBP(Local binary pattern)是一個易了解和很有效的圖像局部紋理特征,應用也很廣泛。在網上可以搜到一大把的LBP介紹,是以本博文就忽略了對其的介紹。直接附上代碼,代碼不難,隻是希望對大家有用!如有錯誤和補充,歡迎提出,大家共同進步哈!

一)一般的LBP,256維

[cpp]  view plain copy

  1. //====================================================================    
  2. // 作者   : quarryman    
  3. // 郵箱   : quarrying{at}qq.com    
  4. // 首頁   : http://blog.csdn.net/quarryman    
  5. // 日期   : 2013年08月11日    
  6. // 描述   : 實作一般的LBP    
  7. //====================================================================    
  8. #include <cv.h>  
  9. #include <highgui.h>  
  10. void LBP(IplImage* src, IplImage* dst)  
  11. {  
  12.     int width=src->width;  
  13.     int height=src->height;  
  14.     for(int j=1;j<width-1;j++)  
  15.     {  
  16.         for(int i=1;i<height-1;i++)  
  17.         {  
  18.             uchar neighborhood[8]={0};  
  19.             neighborhood[7] = CV_IMAGE_ELEM( src, uchar, i-1, j-1);  
  20.             neighborhood[6] = CV_IMAGE_ELEM( src, uchar, i-1, j);  
  21.             neighborhood[5] = CV_IMAGE_ELEM( src, uchar, i-1, j+1);  
  22.             neighborhood[4] = CV_IMAGE_ELEM( src, uchar, i, j-1);  
  23.             neighborhood[3] = CV_IMAGE_ELEM( src, uchar, i, j+1);  
  24.             neighborhood[2] = CV_IMAGE_ELEM( src, uchar, i+1, j-1);  
  25.             neighborhood[1] = CV_IMAGE_ELEM( src, uchar, i+1, j);  
  26.             neighborhood[0] = CV_IMAGE_ELEM( src, uchar, i+1, j+1);  
  27.             uchar center = CV_IMAGE_ELEM( src, uchar, i, j);  
  28.             uchar temp=0;  
  29.             for(int k=0;k<8;k++)  
  30.             {  
  31.                 temp+=(neighborhood[k]>center)*(1<<k);  
  32.             }  
  33.             CV_IMAGE_ELEM( dst, uchar, i, j)=temp;  
  34.         }  
  35.     }  
  36. }  
  37. int main()  
  38. {  
  39.     IplImage* img=cvLoadImage("lena.jpg", 0);  
  40.     IplImage* dst=cvCreateImage(cvGetSize(img),8,1);  
  41.     LBP(img,dst);  
  42.     cvNamedWindow("圖像", 1);  
  43.     cvShowImage("圖像", dst);  
  44.     cvWaitKey(0);  
  45.     cvDestroyAllWindows();  
  46.     cvReleaseImage(&img);  
  47.     cvReleaseImage(&dst);  
  48.     return 0;  
  49. }  

結果圖像為:

圖像處理-紋理檢測-lbp

二)Uniform Pattern的LBP,将256維降為59維。

絕大多數LBP模式最多隻包含兩次從1到0或從0到1的跳變。是以,Ojala将Uniform Pattern定義為:當某個LBP所對應的循環二進制數從0到1或從1到0最多有兩次跳變時,該LBP所對應的二進制就稱為一個等價模式類。

代碼一:

[cpp]  view plain copy

  1. #include <stdio.h>  
  2. typedef unsigned char uchar;  
  3. int getHopCount(uchar i)  
  4. {  
  5.     int a[8]={0};  
  6.     int k=7;  
  7.     int cnt=0;  
  8.     while(i)  
  9.     {  
  10.         a[k]=i&1;  
  11.         i>>=1;  
  12.         --k;  
  13.     }  
  14.     for(int k=0;k<8;++k)  
  15.     {  
  16.         if(a[k]!=a[k+1==8?0:k+1])  
  17.         {  
  18.             ++cnt;  
  19.         }  
  20.     }  
  21.     return cnt;  
  22. }  
  23. int main()    
  24. {  
  25.     int cnt[9]={0};  
  26.     for(int i=0;i<256;++i)  
  27.     {  
  28.         cnt[getHopCount(i)]++;  
  29.     }  
  30.     for(int i=0;i<9;++i)  
  31.     {  
  32.         printf("跳變%d次的數目:%d\n",i,cnt[i]);  
  33.     }  
  34.     return 0;   
  35. }  

輸出結果為:

跳變0次的數目:2

跳變1次的數目:0

跳變2次的數目:56

跳變3次的數目:0

跳變4次的數目:140

跳變5次的數目:0

跳變6次的數目:56

跳變7次的數目:0

跳變8次的數目:2

可見:56+2+1==59,是以有59維。

代碼二:

[cpp]  view plain copy

  1. //====================================================================    
  2. // 作者   : quarryman    
  3. // 郵箱   : quarrying{at}qq.com    
  4. // 首頁   : http://blog.csdn.net/quarryman    
  5. // 日期   : 2013年08月11日    
  6. // 描述   : Uniform Pattern的LBP    
  7. //====================================================================   
  8. #include <cv.h>  
  9. #include <highgui.h>  
  10. int getHopCount(uchar i)  
  11. {  
  12.     int a[8]={0};  
  13.     int k=7;  
  14.     int cnt=0;  
  15.     while(i)  
  16.     {  
  17.         a[k]=i&1;  
  18.         i>>=1;  
  19.         --k;  
  20.     }  
  21.     for(int k=0;k<8;++k)  
  22.     {  
  23.         if(a[k]!=a[k+1==8?0:k+1])  
  24.         {  
  25.             ++cnt;  
  26.         }  
  27.     }  
  28.     return cnt;  
  29. }  
  30. void lbp59table(uchar* table)  
  31. {  
  32.     memset(table,0,256);  
  33.     uchar temp=1;  
  34.     for(int i=0;i<256;++i)  
  35.     {  
  36.         if(getHopCount(i)<=2)  
  37.         {  
  38.             table[i]=temp;  
  39.             temp++;  
  40.         }  
  41.         // printf("%d\n",table[i]);  
  42.     }  
  43. }  
  44. void LBP(IplImage* src, IplImage* dst)  
  45. {  
  46.     int width=src->width;  
  47.     int height=src->height;  
  48.     uchar table[256];  
  49.     lbp59table(table);  
  50.     for(int j=1;j<width-1;j++)  
  51.     {  
  52.         for(int i=1;i<height-1;i++)  
  53.         {  
  54.             uchar neighborhood[8]={0};  
  55.             neighborhood[7] = CV_IMAGE_ELEM( src, uchar, i-1, j-1);  
  56.             neighborhood[6] = CV_IMAGE_ELEM( src, uchar, i-1, j);  
  57.             neighborhood[5] = CV_IMAGE_ELEM( src, uchar, i-1, j+1);  
  58.             neighborhood[4] = CV_IMAGE_ELEM( src, uchar, i, j+1);  
  59.             neighborhood[3] = CV_IMAGE_ELEM( src, uchar, i+1, j+1);  
  60.             neighborhood[2] = CV_IMAGE_ELEM( src, uchar, i+1, j);  
  61.             neighborhood[1] = CV_IMAGE_ELEM( src, uchar, i+1, j-1);  
  62.             neighborhood[0] = CV_IMAGE_ELEM( src, uchar, i, j-1);  
  63.             uchar center = CV_IMAGE_ELEM( src, uchar, i, j);  
  64.             uchar temp=0;  
  65.             for(int k=0;k<8;k++)  
  66.             {  
  67.                 temp+=(neighborhood[k]>center)*(1<<k);  
  68.             }  
  69.             //CV_IMAGE_ELEM( dst, uchar, i, j)=temp;  
  70.             CV_IMAGE_ELEM( dst, uchar, i, j)=table[temp];  
  71.         }  
  72.     }  
  73. }  
  74. int main()  
  75. {  
  76.     IplImage* img=cvLoadImage("lena.jpg", 0);  
  77.     IplImage* dst=cvCreateImage(cvGetSize(img),8,1);  
  78.     LBP(img,dst);  
  79.     cvNamedWindow("圖像", 1);  
  80.     cvShowImage("圖像", dst);  
  81.     cvWaitKey(0);  
  82.     cvDestroyAllWindows();  
  83.     cvReleaseImage(&img);  
  84.     cvReleaseImage(&dst);  
  85.     return 0;  
  86. }  

輸出圖像為:

圖像處理-紋理檢測-lbp

繼續閱讀