创建 LBP 直方图

Posted

技术标签:

【中文标题】创建 LBP 直方图【英文标题】:Creating LBP histogram 【发布时间】:2013-06-20 10:52:52 【问题描述】:

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

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

谢谢!

【问题讨论】:

从您包含的标签来看,您正在使用 opencv 或正在考虑使用它。如果你有,“opencv histogram”的简单谷歌搜索可能是相关的。这是搜索docs.opencv.org/doc/tutorials/imgproc/histograms/…时的链接之一 HistogramLBP histogramcarcarpet 之间的关系更密切一些,但上面的链接在这种情况下完全没用 【参考方案1】:

您的代码似乎在使用半径 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&lt;uchar&gt;(center_lbp)+=1;

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

具有统一模式的 LBP:-

如果圆形二进制模式(顺时针)包含最多 2 个从 0 到 1 的过渡,则称为统一 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。

【讨论】:

我确实经历了所有这些东西......但我被困在如何创建查找表......我需要写下所有 256 个 8 位组合并搜索它们吗手动??请帮忙......我正在学习这一切......非常感谢! 你可以这样做。另一种方法是,创建一个仅包含统一模式的十进制编码值的数组。每当您获得 LBP 模式时,搜索数组,如果找到,则返回数组索引,该索引是该统一模式的直方图中的映射索引。如果没有找到,那么它是一个不均匀的模式。您可以静态创建数组,也可以通过某些程序为任意 P 创建数组。

以上是关于创建 LBP 直方图的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 例程200篇230. 特征描述之 LBP 统计直方图

Uniform Circular LBP人脸识别实现

图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

图像特征提取三大法宝:HOG特征,LBP特征,Haar特征

Matlab LBP 实值

lbp和pca用啥软件