LBP

LBP(Local binary pattern)是一个易理解且有效的局部图像特征,应用很广泛。在网上可以搜到一大把的LBP介绍,所以本博文就忽略了对其的介绍。直接附上代码,代码不难,只是希望对大家有用!如有错误和补充,欢迎提出,大家共同进步哈!

注意:下面代码仅为示例便利,牺牲了一些效率!

一)一般的LBP,256维

 
  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.  
  11. void LBP(IplImage* src, IplImage* dst)

  12. {

  13. int width=src->width;

  14. int height=src->height;

  15. for(int j=1;j<width-1;j++)

  16. {

  17. for(int i=1;i<height-1;i++)

  18. {

  19. uchar neighborhood[8]={0};

  20. neighborhood[7] = CV_IMAGE_ELEM( src, uchar, i-1, j-1);

  21. neighborhood[6] = CV_IMAGE_ELEM( src, uchar, i-1, j);

  22. neighborhood[5] = CV_IMAGE_ELEM( src, uchar, i-1, j+1);

  23. neighborhood[4] = CV_IMAGE_ELEM( src, uchar, i, j-1);

  24. neighborhood[3] = CV_IMAGE_ELEM( src, uchar, i, j+1);

  25. neighborhood[2] = CV_IMAGE_ELEM( src, uchar, i+1, j-1);

  26. neighborhood[1] = CV_IMAGE_ELEM( src, uchar, i+1, j);

  27. neighborhood[0] = CV_IMAGE_ELEM( src, uchar, i+1, j+1);

  28. uchar center = CV_IMAGE_ELEM( src, uchar, i, j);

  29. uchar temp=0;

  30.  
  31. for(int k=0;k<8;k++)

  32. {

  33. temp+=(neighborhood[k]>=center)<<k;

  34. }

  35. CV_IMAGE_ELEM( dst, uchar, i, j)=temp;

  36. }

  37. }

  38. }

  39.  
  40. int main()

  41. {

  42. IplImage* img=cvLoadImage("lena.jpg", 0);

  43. IplImage* dst=cvCreateImage(cvGetSize(img),8,1);

  44. LBP(img,dst);

  45. cvNamedWindow("图像", 1);

  46. cvShowImage("图像", dst);

  47. cvWaitKey(0);

  48. cvDestroyAllWindows();

  49. cvReleaseImage(&img);

  50. cvReleaseImage(&dst);

  51.  
  52. return 0;

  53. }

结果图像为:


二)Uniform Pattern的LBP,将256维降为59维。
绝大多数LBP模式最多只包含两次从1到0或从0到1的跳变。因此,Ojala将Uniform Pattern定义为:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类。

代码一:

 
  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.  
  24. int main()

  25. {

  26. int cnt[9]={0};

  27. for(int i=0;i<256;++i)

  28. {

  29. cnt[getHopCount(i)]++;

  30. }

  31. for(int i=0;i<9;++i)

  32. {

  33. printf("跳变%d次的数目:%d\n",i,cnt[i]);

  34. }

  35. return 0;

  36. }

输出结果为:
跳变0次的数目:2
跳变1次的数目:0
跳变2次的数目:56
跳变3次的数目:0
跳变4次的数目:140
跳变5次的数目:0
跳变6次的数目:56
跳变7次的数目:0
跳变8次的数目:2
可见:56+2+1==59,所以有59维。

代码二:

 
  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.  
  11. int getHopCount(uchar i)

  12. {

  13. int a[8]={0};

  14. int k=7;

  15. int cnt=0;

  16. while(i)

  17. {

  18. a[k]=i&1;

  19. i>>=1;

  20. --k;

  21. }

  22. for(int k=0;k<8;++k)

  23. {

  24. if(a[k]!=a[k+1==8?0:k+1])

  25. {

  26. ++cnt;

  27. }

  28. }

  29. return cnt;

  30. }

  31.  
  32. void lbp59table(uchar* table)

  33. {

  34. memset(table,0,256);

  35. uchar temp=1;

  36. for(int i=0;i<256;++i)

  37. {

  38. if(getHopCount(i)<=2)

  39. {

  40. table[i]=temp;

  41. temp++;

  42. }

  43. // printf("%d\n",table[i]);

  44. }

  45. }

  46.  
  47. void LBP(IplImage* src, IplImage* dst)

  48. {

  49. int width=src->width;

  50. int height=src->height;

  51. uchar table[256];

  52. lbp59table(table);

  53. for(int j=1;j<width-1;j++)

  54. {

  55. for(int i=1;i<height-1;i++)

  56. {

  57. uchar neighborhood[8]={0};

  58. neighborhood[7] = CV_IMAGE_ELEM( src, uchar, i-1, j-1);

  59. neighborhood[6] = CV_IMAGE_ELEM( src, uchar, i-1, j);

  60. neighborhood[5] = CV_IMAGE_ELEM( src, uchar, i-1, j+1);

  61. neighborhood[4] = CV_IMAGE_ELEM( src, uchar, i, j+1);

  62. neighborhood[3] = CV_IMAGE_ELEM( src, uchar, i+1, j+1);

  63. neighborhood[2] = CV_IMAGE_ELEM( src, uchar, i+1, j);

  64. neighborhood[1] = CV_IMAGE_ELEM( src, uchar, i+1, j-1);

  65. neighborhood[0] = CV_IMAGE_ELEM( src, uchar, i, j-1);

  66. uchar center = CV_IMAGE_ELEM( src, uchar, i, j);

  67. uchar temp=0;

  68.  
  69. for(int k=0;k<8;k++)

  70. {

  71. temp+=(neighborhood[k]>=center)<<k;

  72. }

  73. //CV_IMAGE_ELEM( dst, uchar, i, j)=temp;

  74. CV_IMAGE_ELEM( dst, uchar, i, j)=table[temp];

  75. }

  76. }

  77. }

  78.  
  79. int main()

  80. {

  81. IplImage* img=cvLoadImage("lena.jpg", 0);

  82. IplImage* dst=cvCreateImage(cvGetSize(img),8,1);

  83. LBP(img,dst);

  84. cvNamedWindow("图像", 1);

  85. cvShowImage("图像", dst);

  86. cvWaitKey(0);

  87. cvDestroyAllWindows();

  88. cvReleaseImage(&img);

  89. cvReleaseImage(&dst);

  90.  
  91. return 0;

  92. }

输出图像为:

猜你喜欢

转载自blog.csdn.net/chan_52/article/details/81485986
LBP
今日推荐