创建LBP直方图

时间:2013-06-20 10:52:52

标签: c++ opencv image-processing pattern-matching computer-vision

我已经能够实现基本的本地二进制模式(LBP),无需插值。以下是代码:(OpenCV)

int center = 0;   
int center_lbp = 0;   

for (int row = 1; row < Image.rows; row++)   
{
  for (int col = 1; col < Image.cols; col++)   
  {   
    center = Image.at<int>(row, col);
    center_lbp = 0;   

    if ( center <= Image.at<int>(row-1, col-1) )   
      center_lbp += 1;   

    if ( center <= Image.at<int>(row-1, col) )   
      center_lbp += 2;   

    if ( center <= Image.at<int>(row-1, col+1) )   
      center_lbp += 4;   

    if ( center <= Image.at<int>(row, col-1) )   
      center_lbp += 8;   

    if ( center <= Image.at<int>(row, col+1) )   
      center_lbp += 16;   

    if ( center <= Image.at<int>(row+1, col-1) )   
      center_lbp += 32;   

    if ( center <= Image.at<int>(row+1, col) )   
      center_lbp += 64;

    if ( center <= Image.at<int>(row+1, col+1) )   
      center_lbp += 128;   

    cout << "center lbp value: " << center_lbp << endl;
    LBPImage.at<int>(row, col) = center_lbp;
  }
}

阅读很多东西......但是现在无法弄清楚如何使用统一的模式概念创建直方图...确实检查了几个链接......没什么那么....可以任何人请帮助... < / p>

谢谢!

1 个答案:

答案 0 :(得分:2)

您的代码似乎是,您正在使用半径为r = 1的8邻域LBP。因此,您可以获得最多256(2 ^ 8)个不同的值。要构造直方图,声明一个包含单行和256列(bins)的矩阵并用0初始化它: -

Mat H(1,256,CV_8UC1,Scalar::all(0));

现在对于每个中心像素(不在边框中的像素),在应用LBP后,您将获得长度为8的二进制字符串,并且它的十进制编码(存储在代码段中的center_lbp变量中)表示相应的bin直方图。因此,在计算center_lbp之后,只需将值增加到直方图的相应bin中,如下所示: -

  

H.at <uchar>(center_lbp)+ = 1;

解析每个中心像素的图像后,您将获得该图像的LBP直方图。

具有统一模式的LBP: -

如果圆形二进制模式(顺时针)包含从0到1的最大2次转换,则LBP称为均匀,反之亦然。例如: - 00111000是统一模式,但10111000不是。为了统一模式构建LBP直方图,规则是 -

  • 每个统一模式在直方图中都有一个唯一的bin。
  • 所有非均匀模式将放入直方图中的单个bin中。

对于p个相邻点,我们可以得到最大p *(p-1)+2个均匀模式。因此,均匀模式的直方图将包含p *(p-1)+3个二进制数。

构建直方图: -

  • 通过在其上应用LBP获取每个中心像素的二进制模式。
  • 检查图案是否均匀。
  • 如果是统一的,则将该直方图模式的保留箱中的bin值增加1。 你必须有一些映射标准来在直方图的唯一bin中映射一个统一的模式。
  • 否则它是一个非均匀的模式。因此,对于直方图的所有非均匀模式,将保留箱(例如最后一个箱)中的箱值增加1。