创建 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/…时的链接之一Histogram
和 LBP histogram
比 car
和 carpet
之间的关系更密切一些,但上面的链接在这种情况下完全没用
【参考方案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
<uchar>
(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 直方图的主要内容,如果未能解决你的问题,请参考以下文章