3

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

读了很多东西...但是现在无法弄清楚如何使用统一模式概念创建直方图...检查了几个链接...那里没什么...有人可以帮忙...

谢谢!

4

1 回答 1

3

您的代码似乎是,您正在使用半径 r=1 的 8 邻域 LBP。因此,您最多可以获得 256(2^8) 个不同的值。要构造直方图,请声明一个包含单行和 256 列(箱)的矩阵,并用 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 个 bin。

构建直方图:-

  • 通过对其应用 LBP 获得每个中心像素的二进制模式。
  • 检查图案是否均匀。
  • 如果统一,则将此直方图模式的保留 bin 中的 bin 值增加 1 。您必须有一些映射标准才能在直方图的唯一 bin 中映射统一模式。
  • 否则它是一个不均匀的模式。因此,将直方图的所有非统一模式的保留 bin(例如最后一个 bin)中的 bin 值增加 1 。
于 2013-06-21T07:28:14.647 回答