【问题标题】:Creating LBP histogram创建 LBP 直方图
【发布时间】: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/…时的链接之一
  • Histogram 和 LBP histogram 比 car 和 carpet 之间的关系更密切一些,但上面的链接在这种情况下完全没用

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


【解决方案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 创建数组。
猜你喜欢
  • 2014-07-08
  • 1970-01-01
  • 2012-02-17
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2018-04-16
  • 2015-02-10
相关资源
最近更新 更多