LBP算法分析

LBP是一种简单,有效的纹理分类的特征提取算法。主要的论文是"Multiresolution gray-scale androtation invariant texture classification with local binarypatterns", pami, vol 24, no.7, July 2002。LBP就是"local binarypattern"的缩写。

从纹理分类的角度看,图像上某个像素点的纹理特征,大多数情况下,是指这个点和它周围点的关系。也就是说,这个点和它的邻域内的点的关系。从哪个角度对这种关系提取特征,就形成了不同种类的特征。有了特征,就能根据特征对纹理进行分类。LBP构造了一种衡量一个像素点和它周围像素点的关系。

从原来上来说,它的步骤是这样的:
公式(1) T=t(g_c, g_0, ..., g_(P-1))
这个是latex的写法,跟论文上的公式(1)是一样的,用过latex的都知道:)  假设图像是灰度图,那么,图像上的像素值在[0, 255]的区间内。假设我们要计算某个点(x_0,y_0)的LBP特征,g_c就是像素(x_0, y_0)的灰度值,g_0, g_1, ..., g_(P-1)就是(x_0,y_0)周围的若干个像素的灰度值。这些点是符合分布的呢?按照论文的图1,是分布成圆形,以P等分这个圆。

如果图像亮度发生变化,比如说,在很亮的情况拍照的纹理,和很暗的情况拍照的纹理,尽管纹理相似,亮度不同。我们需要灰度不变的特征,也就说,要让计算出的特征值,在亮或暗拍照的情况下是一样的。那么,公式(1)可以改造成公式(2):
T = t( g_c, g_0-g_c, g_1 - g_c,..., g_(P-1) - g_c)
这个公式和公式(1)是等价的,毫无疑问。进一步的,g_c其实仅表示拍照时候的亮度,我们也可以把它简化掉,这样公式(2)可以改造成公式(3):
T = t(g_0 - g_c, g_1-g_c,..., g_(P-1) - g_c)
考虑到实际性能,公式(3)还可以进一步改写成只有0和1的特征,公式(5):
T =  t(s(g_0 - g_c), s(g_1-g_c),..., s(g_(P-1)- g_c))
如果x > = 0, s(x) = 1, 其他情况,s(x) =0。这样,T就只剩下0和1了,这也就是lbp的binary的由来。如果T是一串0和1组成的特征,那么它就可以表示成一个整数,这个0和1组成的串,就是整数的二进制码。于是,我们得到了公式(7):
LBP_(P, R) = sum_(P=0)^(P-1)s(g_p-g_c)*2^p
也就是说,不同的P和不同的R,根据T的二进制串,就能算出一个整数值。

如果图像旋转了,那么,纹理特征就旋转了,此时,得到的二进制串也就是是旋转了,得到的LBP的值就变化了。为了让LBP特征是旋转不变的,算法需要进一步改造。假设,我们在公式(5)中得到的二进制特征是:
10010000,那么,将这个二进制特征,按照顺时针方向旋转,可以把它转成00001001的形式,这样得到的LBP的值是最小的。无论图像怎么旋转,对点提取的二进制特征点的最小值是不变的。按照这种思路,就得到了公式(8):
LBP_(P, R)^(ri) = min{ROR(LBP_(P, R), i)| i = 0, 1, ...,P-1} 
这样,LBP特征是旋转不变的了。当P=8的时候,能产生的不同的二进制特征数量是2^8个,经过上述处理之后,只有36个旋转不变特征。

作者认为经过上述步骤得到的LBP特征的区分性不够好。为了,将上述的36个最小二进制特征,在进一步分类,在这36个特征里,9个uniform特征出现的频率特别高,有时候会到90%。因此,将上述的特征再改造成公式(9):
LBP_(P, R)^(riu2) = sum_(P=0)^(P-1)s(g_P-g_c)  if U(LBP_(P, R)) <=2
LBP_(P, R)^(riu2) = P + 1   if U(LBP_(P, R))>2
函数U(x)的含义是:如果位置i和位置i-1是不同的,那么就是U值就是1,如果相同,U就是0,对于所有的i,都这么处理,就得到了U(x)。比如说, x =000000,那么U(x) = 0; x = 10000000,那么U(x) = 1; x = 01000000,那么U(x) =1。一次类推。只有U(x) <= 2的pattern才是uniform pattern。

最终的纹理特征,就是LBP数的直方图。举例来说,假设有一副图a.jpg,不考虑边缘,有效的分辨率100*200。那么,要计算它的lbp特征,选定参数,就是对它上面的R=1,P=8,那么,对它上面的每个点,就计算LBP_(P,R)^(riu2),它是一个整数。也就是说,每个点,在给定的R和P下,只有这个一个整数。那么这20,000个点就是两万个整数。将这两万个正数,按照LBP_(P,R)^(riu2)的所有可能取值情况,作成一个直方图,就是这幅图的lbp特征。

如果我们使用的特征,是R = 3, P =24,那么,需要多少分配多少内存呢?如果P=24,则可能存在的lbp模式的数量是2^24个,也就是说,每个像素的lbp模式可能是2^24种里之一。当然,这2^24模式,对应的LBP_(P,R)^(riu2),其实是有限个数量的。这也就相当于,开一个2^24个元素数组,占用内存是2^24*4个字节,也就是2^26个字节,也就是2^6M的内存,也就是16M内存。这就是为什么论文第2.3节提到的,当P=24时,需要一个16M的查找表lookuptable。

2.4节提出根据局部对比度构造新特征,这块没什么问题。

2.5节给出计算样本分类判别方法。比如说,假设纹理有3个bin,纹理1有10%的像素lbp数在bin1, 10%在bin2,80%在bin3,纹理2有30%的像素lbp数在bin1, 30%在bin2, 40%在bin3。待判别的纹理的lbp分别是20%,50%和30%。那么,
L(S, M1) = 0.2*log(0.1)+0.5*log(0.1)+0.3*log(0.8) =-0.2-0.5-0.097=-0.797
L(S, M2) = 0.2*log(0.3)+0.5*log(0.3)+0.3*log(0.4)=  −0.366−0.119=-0.485
取大的,判定S的属于类M2。这种计算方式,实际上是计算两个概率分布的距离的离散化。如果两个概率分布完全一样,L(S, M)= 0。越接近0越相似。有没有可能是正数?需要证明,但我感觉不可能是,有时间倒是可以证明下看看。

至此,论文里的lbp算法就到这里的,剩下的是实验,验证效果。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值