【问题标题】:How to implement Uniform LBP? [duplicate]如何实现统一的 LBP? [复制]
【发布时间】:2011-10-01 02:09:40
【问题描述】:

可能重复:
Local Binary Pattern in MATLAB

我想实现统一的 LBP。这是维基百科对统一 LBP 的定义。

一个局部二进制模式被称为统一,如果二进制模式 最多包含两个从 0 到 1 的按位转换,反之亦然 当循环遍历位模式时。例如, 模式 00000000(0 个转换)、01110000(2 个转换)和 11001111(2 个过渡)是均匀的,而模式 11001001(4 转换)和 01010010(6 次转换)不是。在计算中 在 LBP 标签中,使用统一的模式,因此存在 每个统一模式和所有非统一模式的单独标签 模式用单个标签标记。例如,当使用 (8,R) 邻域,共有 256 个模式,其中 58 个是 统一,产生 59 种不同的标签。

我已经为 LBP 编写了代码,但不知道如何将其转换为统一的 LBP。下面是 LBP 的代码。

for i=2:m-1
    for j=2:n-1
        J0=I2(i,j);
        I3(i-1,j-1)=I2(i-1,j-1)>J0;
        I3(i-1,j)=I2(i-1,j)>J0;
        I3(i-1,j+1)=I2(i-1,j+1)>J0; 
        I3(i,j+1)=I2(i,j+1)>J0;
        I3(i+1,j+1)=I2(i+1,j+1)>J0; 
        I3(i+1,j)=I2(i+1,j)>J0; 
        I3(i+1,j-1)=I2(i+1,j-1)>J0; 
        I3(i,j-1)=I2(i,j-1)>J0;
        LBP(i,j)=I3(i-1,j-1)*2^7+I3(i-1,j)*2^6+I3(i-1,j+1)*2^5+I3(i,j+1)*2^4+I3(i+1,j+1)*2^3+I3(i+1,j)*2^2+I3(i+1,j-1)*2^1+I3(i,j-1)*2^0;

    end
end
figure,imshow(uint8(LBP))

任何帮助将不胜感激。我正在使用 MATLAB。

【问题讨论】:

  • 您是更想了解Uniform LBP的概念,还是已经了解,只是不知道如何修改代码?
  • 理解概念但不知道如何修改代码..
  • 这样的话,这个问题还是更适合StackOverflow。我将把这个迁移到那里,这样你这次就不必删除/重新发布了。

标签: image-processing computer-vision


【解决方案1】:

步骤

  1. 下一步是为存储在LBP 中的值构建一个查找表。
    • 查找表将 256 种可能的组合映射到 59 个不同的标签中。
    • 如果速度不重要,可以使用 for 循环构建表。
  2. 使用表格将LBP 映射到59 个标签中。
    • labeled = table(LBP) % this is called table lookup or MATLAB indexing.
  3. 使用这 59 个标签执行任何其他工作。

建议(虽然不是实施所必需的)

  1. I3 不需要使用二维矩阵。当前像素的八个邻居是您正在处理的当前像素的本地;因此,您可以简单地将它们分配给 I3(1), I3(2), ... I3(8),因为每次您移动到下一个中​​心像素 (i,j) 时,它们都会被重新分配。

函数表 = BitwiseToLBP % 我们为非均匀保留标签 0 表 = 零(1, 256); 下一个标签 = 1; 对于 k = 1:256, 位 = bitand(k, 2.^(0:7)) > 0; 如果 IsUniformLBP(位), 表(k)=下一个标签; 下一个标签 = 下一个标签 + 1; 别的 表(k)= 0; 结尾 结尾 结尾
函数 IsUniformLBP(位) nnz(diff(bits([1:end, 1]))) == 2; 结尾

【讨论】:

  • 感谢您的建议...非常好...没想到...
  • 只是想问你一个问题.. bits = bitand(k, 2.^(0:7)) > 0;这条线是做什么的?
  • 一位匿名用户提出了一个应该是评论的编辑(但太长,无法放入单个评论):“我不太确定,但我认为可能有错误代码,我试过了,我只得到了 56 个不同的值,其中没有一个是可重复的,我相信应该有 58 个不同的值(它的 59 个包括一个用于所有非均匀模式的 bin)。 ...
  • 这段代码运行良好,但需要修复一个小错误。根据论文citeseerx.ist.psu.edu/showciting?cid=4608087,统一模式最多有 2 位转换。因此,nnz(diff(bits([1:end, 1]))) == 2;应该是 nnz(diff(bits([1:end, 1])))
  • 很久了,其实有2个问题。首先,正如@oki 提到的, nnz(diff(bits([1:end, 1]))) == 2;应该是 nnz(diff(bits([1:end, 1])))
【解决方案2】:

我试过这段代码:

 sum = abs(I3(k-1,l-1)-I3(k-1,l))+ abs(I3(k-1,l)-I3(k-1,l+1))+ abs(I3(k-1,l+1)-I3(k,l+1))+ abs(I3(k,l+1)-I3(k+1,l+1))+abs(I3(k+1,l+1)-I3(k+1,l))+abs(I3(k+1,l)-I3(k+1,l-1))+abs(I3(k+1,l-1)-I3(k,l-1));
    if(sum <=2)
            UniformHist = [UniformHist Hist];
    end

【讨论】:

    猜你喜欢
    • 2016-06-15
    • 1970-01-01
    • 2014-04-29
    • 2014-01-02
    • 2015-11-13
    • 2017-11-15
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多