gpt4 book ai didi

c++ - 创建 LBP 直方图

转载 作者:太空狗 更新时间:2023-10-29 21:45:37 28 4
gpt4 key购买 nike

我已经能够在没有插值的情况下实现基本的局部二进制模式 (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;
}
}

阅读了很多东西...但不知道现在如何使用统一模式概念创建直方图...检查了几个链接...那里什么都没有...有人可以帮忙吗...

谢谢!

最佳答案

您的代码似乎是,您使用的是半径 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 直方图,规则是 -

  • 每个统一模式在直方图中都有一个唯一的 bin。
  • 所有不均匀的模式都将放入直方图中的单个 bin 中。

对于p个相邻点,我们可以得到最大p*(p-1)+2个均匀模式。因此,均匀模式的直方图将包含 p*(p-1)+3 个 bin。

构建直方图:-

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

关于c++ - 创建 LBP 直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17211785/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com