创建LBP直方图

Creating LBP histogram

本文关键字:直方图 LBP 创建      更新时间:2023-10-16

我已经能够实现一个基本的本地二进制模式(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;
  }
}

阅读很多东西…但不知道如何用统一的模式概念创建直方图…我检查了一些链接…没什么大不了的....有谁能帮帮我吗?

谢谢!

您的代码似乎是使用半径r=1的8邻域LBP。所以你可以得到最多256(2^8)个不同的值。要构造直方图,声明一个包含单行和256列(bin)的矩阵,并将其初始化为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 With Uniform Patterns:-

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

  • 每个统一的图案在直方图中都有一个独特的bin。
  • 所有不均匀的图案将在直方图中放入单个bin。

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

构造直方图:-

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