局部二值模式LBP(Local Binary Pattern)实现代码

来源:互联网 发布:从java走向javaee 编辑:程序博客网 时间:2024/05/22 04:36
局部二值模式LBP由于其简单、高效在目标检测、目标识别、图像检索等领域得到了广泛的应用。现如今,LBP的变体不下上十种,如VLBP、SILBP等。要了解更多关于LBP的知识可以参考:纹理分类-全局特征LBP及相关文献。

          下面介绍的三种LBP算子的区别见下图:


            本文不介绍LBP的理论知识,只是简单的说说LBP及其变体的实现:

            1)最原始的LBP算子的实现代码           

[cpp] view plain copy
  1. void lbp( Mat& _src, Mat& _dst)   
  2. {     
  3.     if ( -_dst.empty())  
  4.         _dst.create(_src.rows, _src.cols, CV_8UC1);  
  5.     _dst = cv::Scalar::all(0);  
  6.     // calculate patterns  
  7.     for(int i=1;i<_src.rows-1;i++)  
  8.     {  
  9.         for(int j=1;j<_src.cols-1;j++)   
  10.         {  
  11.             uchar center = _src.at<uchar>(i,j);  
  12.             unsigned char code = 0;  
  13.             code |= (_src.at<uchar>(i-1,j-1) >= center) << 7;  
  14.             code |= (_src.at<uchar>(i-1,j) >= center) << 6;  
  15.             code |= (_src.at<uchar>(i-1,j+1) >= center) << 5;  
  16.             code |= (_src.at<uchar>(i,j+1) >= center) << 4;  
  17.             code |= (_src.at<uchar>(i+1,j+1) >= center) << 3;  
  18.             code |= (_src.at<uchar>(i+1,j) >= center) << 2;  
  19.             code |= (_src.at<uchar>(i+1,j-1) >= center) << 1;  
  20.             code |= (_src.at<uchar>(i,j-1) >= center) << 0;  
  21.             _dst.at<unsigned char>(i,j) = code;  
  22.         }  
  23.     }  
  24. }  
         2)带有容忍银子的LBP算子

[cpp] view plain copy
  1. void lbp_with_factor( Mat& _src, Mat& _dst, uchar factor) // factor default 3  
  2. {     
  3.     if ( -_dst.empty())  
  4.         _dst.create(_src.rows, _src.cols, CV_8UC1);  
  5.     _dst = cv::Scalar::all(0);  
  6.     // calculate patterns  
  7.     for(int i=1;i<_src.rows-1;i++)  
  8.     {  
  9.         for(int j=1;j<_src.cols-1;j++)   
  10.         {  
  11.             uchar center = _src.at<uchar>(i,j)+factor;  
  12.             unsigned char code = 0;  
  13.             code |= (_src.at<uchar>(i-1,j-1) >= center) << 7;  
  14.             code |= (_src.at<uchar>(i-1,j) >= center) << 6;  
  15.             code |= (_src.at<uchar>(i-1,j+1) >= center) << 5;  
  16.             code |= (_src.at<uchar>(i,j+1) >= center) << 4;  
  17.             code |= (_src.at<uchar>(i+1,j+1) >= center) << 3;  
  18.             code |= (_src.at<uchar>(i+1,j) >= center) << 2;  
  19.             code |= (_src.at<uchar>(i+1,j-1) >= center) << 1;  
  20.             code |= (_src.at<uchar>(i,j-1) >= center) << 0;   
  21.             _dst.at<unsigned char>(i,j) = code;  
  22.         }  
  23.     }  
  24. }  
         3)带有乘性因子的LBP算子

[cpp] view plain copy
  1. // 这里需要采用2个字符来编码,如00、01、10、11  
  2. void lbp_with_factor( Mat& _src, Mat& _dst, float factor)  // facotr default 0.1  
  3. {     
  4.     if ( -_dst.empty())  
  5.         _dst.create(_src.rows, _src.cols, CV_8UC1);  
  6.     _dst = cv::Scalar::all(0);  
  7.     // calculate patterns  
  8.     for(int i=1;i<_src.rows-1;i++)  
  9.     {  
  10.         for(int j=1;j<_src.cols-1;j++)   
  11.         {  
  12.             uchar center = _src.at<uchar>(i,j);  
  13.             int up = center*(1.0+factor);  
  14.             int down = center*(1.0+factor);  
  15.             unsigned char code = 0;  
  16.             /*code |= (_src.at<uchar>(i-1,j-1) >= center ) << 7; 
  17.             code |= (_src.at<uchar>(i-1,j) >= center) << 6; 
  18.             code |= (_src.at<uchar>(i-1,j+1) >= center) << 5; 
  19.             code |= (_src.at<uchar>(i,j+1) >= center) << 4; 
  20.             code |= (_src.at<uchar>(i+1,j+1) >= center) << 3; 
  21.             code |= (_src.at<uchar>(i+1,j) >= center) << 2; 
  22.             code |= (_src.at<uchar>(i+1,j-1) >= center) << 1; 
  23.             code |= (_src.at<uchar>(i,j-1) >= center) << 0;  
  24.             _dst.at<unsigned char>(i,j) = code;*/  
  25.         }  
  26.     }  
  27. }  
        欲了解更多参考论文Modeling Pixel Process with Scale Invariant Local Patterns for Background Subtraction in Complex Scenes
阅读全文
0 0
原创粉丝点击