LBP等价模式

LPB算子的定义参见维基百科:https://en.wikipedia.org/wiki/Local_binary_patterns,考察LBP算子的定义可知,一个LBP算子可以产生多种二进制模式(p个采样点)如:3x3邻域有p=8个采样点,则可得到2^8=256种二进制模式;5x5邻域有p=24个采样点,则可得到2^24=16777216种二进制模式,以此类推。显然,过多的二进制模式无论对于纹理的提取还是纹理的识别、分类及信息存取都是不利的,在实际应用中不仅要求采用的算子尽量简单,同时也要考虑到计算速度、存储量大小等问题。因此需要对原始的LBP模式进行降维

 

Ojala等[1]提出一种“等价模式”(Uniform Pattern)来对LBP算子进行降维,Ojala等认为图像中,某个局部二进制模式所对应的循环二进制数从0→1或从1→0,最多有两次跳变,该局部二进制模式所对应的二进制就成为一个等价模式。如00000000,00111000,10001111,11111111等都是等价模式类。判断一个二进制模式是否为等价模式最简单的办法就是将LBP值与其循环右移一位后的值进行按位异或,计算得到的二进制数中1的个数,若个数小于或等于2,则是等价模式;否则,不是。除了等价模式以外的模式都归为一类,称为混合模式类,例如10010111(共四次跳变)。跳变的计算方法:如10010111,首先第一二位10,由1→0跳变一次;第二、三位00,没有跳变;第三、四位01,由0→1跳变一次,第四、五位10,由1→0跳变一次;第五六位01,由0→1跳变一次;第六七位11,没有跳变;第七八位11,没有跳变;故总共跳变4次。

 

使用等价模式,模式种类由原来的2^p减少为2+p*(p-1)种。下面考虑其计算方法。首先明确一个事实,对于p个采样点,假设某个二进制模式的值为x(二进制数),那么x的跳变次数与(2^p-1-x)的跳变次数是一样的。以p=8为例,10010111的跳变次数与(11111111-10010111)=01101000的跳变次数是一样的。那我们可以只考虑连续的0,出现0次跳变:1个(p=8时,只有00000000这一个,对应连续的1的情况为11111111);出现1次跳变:C(p-1,1)(左起第1个二进制位位到左起第p-1个二进制位中,选择某一位为0,左起第1个二进制位到选择的位置处为连续的0,如01111111,00111111,注意不是C(p-1,1)*2,因01111111对应的连续的1的情况(11111111-01111111)=10000000就是从右起的);出现2次跳变:C(p-2,1)+C(p-2,2)(从左起第2个二进制位到左起第p-1个二进制位中,选择某一位为0,或者选择某两位为0,这两位之间为连续的0)。总共的情况数为:(1+C(p-1,1)+C(p-2,1)+C(p-2,2))*2=(1+(p-1)+(p-2)+(p-2)*(p-3)/2)*2=2+p*(p-1)种(*2对应连续的1的情况)。

 

下面考虑如何获得p=8时从LBP模式到等价模式的转换表格。参考https://en.wikipedia.org/wiki/Local_binary_patterns,可知所有的等价模式为0, 1, 2, 3, 4, 6, 7, 8, 12, 14, 15, 16, 24, 28, 30, 31, 32, 48, 56, 60, 62, 63, 64, 96, 112, 120, 124, 126, 127, 128, 129, 131, 135, 143, 159, 191, 192, 193, 195, 199, 207, 223, 224, 225, 227, 231, 239, 240, 241, 243, 247, 248, 249, 251, 252, 253, 254, 255。通过如下的python代码,可以得到可用于C++代码的转换表格。

 

 1 lbp = [0] * 256
 2 data = [0, 1, 2, 3, 4, 6, 7, 8, 12, 14, 15, 16, 24, 28, 30, 31, 32, 48, 56, 60,
 3         62, 63, 64, 96, 112, 120, 124, 126, 127, 128, 129, 131, 135, 143, 159,
 4         191, 192, 193, 195, 199, 207, 223, 224, 225, 227, 231, 239, 240, 241,
 5         243, 247, 248, 249, 251, 252, 253, 254, 255]
 6 for i in data:
 7     lbp[i] = i
 8 
 9 print('{ ', end='')
10 for i in lbp[0:-1]:
11     print('%d, ' % i, end='')
12 print('%d }' % lbp[-1], end='')

 

输出转换表格为:{ 0, 1, 2, 3, 4, 0, 6, 7, 8, 0, 0, 0, 12, 0, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 28, 0, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 60, 0, 62, 63, 64, 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, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 124, 0, 126, 127, 128, 129, 0, 131, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 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, 191, 192, 193, 0, 195, 0, 0, 0, 199, 0, 0, 0, 0, 0, 0, 0, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 224, 225, 0, 227, 0, 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, 239, 240, 241, 0, 243, 0, 0, 0, 247, 248, 249, 0, 251, 252, 253, 254, 255 }

 

参考文献

[1] Multiresolution Gray-Scale and Rotation Invariant Texture Classification with Local Binary Patterns, Timo Ojala, et al., IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE, VOL. 24, NO. 7, JULY 2002.

转载于:https://www.cnblogs.com/study-share-struggle/p/10281926.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值