【问题标题】:How to obtain 256 bins/pixels from an LBP image?如何从 LBP 图像中获得 256 个 bin/像素?
【发布时间】:2012-08-17 19:09:48
【问题描述】:

我在 C 中实现统一的 LBP。但我对这个概念感到困惑。我已经实施了 LBP。假设我有一个 512*512 尺寸的图像。在 LBP 之后,它将是 510*510。现在如何从这个 LBP 图像中获得 256 个 bins/pixels。

for(i=1; i < image_src->width - 1; i++)
    {
          for(j=1; j < image_src->height - 1; j++)
          {
              const unsigned char center = image_get_pixel_value(image_src, i, j , 0);
              unsigned char code = 0;
              if(center <= image_get_pixel_value(image_src, i-1, j-1 , 0))
                code += 128;
               if(center <= image_get_pixel_value(image_src, i-1, j , 0))
                code += 64;
              if(center <= image_get_pixel_value(image_src, i-1, j+1 , 0))
                code += 32;
              if(center <= image_get_pixel_value(image_src, i, j+1 , 0))
                code += 16;
              if(center <= image_get_pixel_value(image_src, i+1, j+1 , 0))
                code += 8;
              if(center <= image_get_pixel_value(image_src, i+1, j , 0))
                code += 4;
              if(center <= image_get_pixel_value(image_src, i+1, j-1 , 0))
                code += 2;
              if(center <= image_get_pixel_value(image_src, i, j-1 , 0))
                code += 1;

              image_set_pixel_value(image_tar, i-1, j-1, 0, code);
          }
      }

这是查找表:

int  UniformPattern59[16][16] = {
             1,   2,   3,   4,   5,   0,   6,   7,   8,   0,   0,   0,   9,   0,  10,  11,
            12,   0,   0,   0,   0,   0,   0,   0,  13,   0,   0,   0,  14,   0,  15,  16,
            17,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
            18,   0,   0,   0,   0,   0,   0,   0,  19,   0,   0,   0,  20,   0,  21,  22,
            23,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
            0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
            24,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
            25,   0,   0,   0,   0,   0,   0,   0,  26,   0,   0,   0,  27,   0,  28,  29,
            30,  31,   0,  32,   0,   0,   0,  33,   0,   0,   0,   0,   0,   0,   0,  34,
            0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  35,
            0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
            0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  36,
            37,  38,   0,  39,   0,   0,   0,  40,   0,   0,   0,   0,   0,   0,   0,  41,
            0,    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  42,
            43,  44,   0,  45,   0,   0,   0,  46,   0,   0,   0,   0,   0,   0,   0,  47,
            48,  49,   0,  50,   0,   0,   0,  51,  52,  53,   0,  54,  55,  56,  57,  58
    };

【问题讨论】:

    标签: c image-processing pattern-matching computer-vision feature-extraction


    【解决方案1】:

    我猜你可能误解了关于 LBP 的概念。 LBP 有几个变体:基本 LBP、均匀 LBP 和旋转不变的均匀 LBP。

    基本LBP中,我们比较中心像素与其相邻像素之一(插值像素以获得更准确的结果)之间的灰度值以获得二进制编码(0或1)为了一点。通常,我们将此编码方案的半径设置为 1,将邻居数设置为 8 作为默认配置。因此,我们可以在比较所有 8 个邻居后得到中心像素的局部二进制模式(LBP),这是一个 8 位二进制数,例如 01011110 或 11110000。在这里,我们可以看到这种类型的范围如果我们将二进制数转换为十进制数,LBP 是从 0 到 255。我们通常将每个像素的 LBP 代码分类为 256 种模式中的一种,形成直方图,用于进一步的分类或识别任务,即您问题中的 256bins/pixels。

    但是,均匀和旋转不变的均匀 LBP 有一些不同。也就是说,模式的数量不是256,其中旋转不变的均匀LBP只有10种模式。旋转均匀 LBP 有 9 个旋转均匀 LBP 和其他 1 个,其中 9 个旋转均匀 LBP 通常覆盖图像上 90% 的模式。

    因此,在旋转不变的均匀 LBP 中,您只需要生成一个 10 箱直方图即可进行进一步处理,例如分类或识别。首先,您将每个像素编码为旋转不变的均匀 LBP,这可能会产生一个 image.rows*image.cols 矩阵。然后,将每个模式(矩阵元素)分类为 10 个模式中的一个,形成一个数组来表示直方图。

    一些论文供您参考:

    1. 学术百科上的 LBP,http://www.scholarpedia.org/article/Local_Binary_Patterns
    2. LBP 作者的 C++ 代码,http://www.cse.oulu.fi/CMV/Downloads/LBPSoftware
    3. 具有局部二值模式的多分辨率灰度和旋转不变纹理分类,http://www.rafbis.it/biplab15/images/stories/docenti/Danielriccio/Articoliriferimento/LBP.pdf

    【讨论】:

    • 非常感谢您提供如此详细的解释。我不明白的是:“在这里,如果我们将二进制数转换为十进制数,我们可以看到这种LBP的范围是从0到255。我们通常将每个像素的LBP代码分类为256种之一模式以形成用于进一步分类或识别任务的直方图,即您问题中的 256 个像素/像素。”尽管我阅读了不同的研究论文,甚至浏览了您分享的链接。如果你能再解释一下这一点
    • 将像素的 8 位二进制码转换为十进制数的动机是为了人类的理解。实际上,即使我们不将 8 位二进制转换为十进制,基本 LBP 编码(模式)类型的数量也是 256。可以想象一个像素的最小二进制码是00000000(相当于十进制数中的0),最大二进制码是11111111(相当于十进制数中的255)。所以,这就是为什么我说 LBP 代码的范围是十进制的 0 到 255。
    • (con't) 但是,在编程实现中,您不需要将二进制代码(在 C++ 中可能以位操作表示)转换为十进制数。可以直接统计每个二进制码的个数,这样可以得到一个有256个bin的直方图(bin相当于LBP码的类型(patterns))。
    • 我感到困惑的是:我正在使用查找表实现统一的 LBP。它有 256 个值。我知道将所有制服组合成 58 个箱子,其余的放在 1 个箱子中,所以总数为 59。我已经实现了 LBP,我在上面添加了它。它给了我 510*510 的图像。我不明白如何将其映射到查找表的 256 个值。我不知道为什么我没有得到这个东西。
    • @朱璐,请帮我解决这个问题。我的项目需要它。
    猜你喜欢
    • 2013-09-27
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    相关资源
    最近更新 更多