我已经能够实现基本的本地二进制模式(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;
}
}
阅读很多东西......但是现在无法弄清楚如何使用统一的模式概念创建直方图...确实检查了几个链接......没什么那么....可以任何人请帮助... < / p>
谢谢!
答案 0 :(得分:2)
您的代码似乎是,您正在使用半径为r = 1的8邻域LBP。因此,您可以获得最多256(2 ^ 8)个不同的值。要构造直方图,声明一个包含单行和256列(bins)的矩阵并用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直方图,规则是 -
对于p个相邻点,我们可以得到最大p *(p-1)+2个均匀模式。因此,均匀模式的直方图将包含p *(p-1)+3个二进制数。
构建直方图: -