LBP特征属于一种纹理特征,该算法在1996年由Ojala等提出,在2002年对算法进行了改进,提出了均衡模式LBP编码和旋转不变性LBP编码。该算法整体来说还是比较简单。但是,根据LBP编码之后的结果对图像进行分类的效果还是比较好。可以用于人脸分类,也可以用于其他对象的基于纹理特征的分类,通常采用LBP编码之后,需要对编码后的图像进行分块,计算每一块的直方图,然后将所有的直方图连接成一个大的直方图,其实就是一维向量。图像就用这个一维向量来表示。在进行分类的时候,可以采用SVM或者KNN等分类算法实现。
LBP的编码方式还是简单,图1是从原始论文中截图的编码示意图。具体的公式在这里就不详细介绍了,简单说一下方法。首先在图像上取一块邻域,比如3X3大小的区域,然后依次比较周围八个像素值与中间像素值的灰度值大小,如果大于等于中间像素值,则赋值为“1”,否则赋值为“0”。请见图1(a)和图1(b)。然后将得到的“1”和“0”连接起来,得到一个二进制串。至于这个二进制串从哪个位置开始,没有规定。对于同一幅图像,自己规定一个统一的起点就可以了。如图1(b),从右下角开始,按照顺时针方式得到的二进制串为“10111000”,然后将这个二进制串转换成十进制,为“169”,将这个值代替原来3X3邻域的中间位置的像素值。
图1 LBP算法编码示意
原始的LBP编码不具有旋转不变性,而且,容易受到噪声干扰。所以,研究者对该算法进行了很多改进。作者在2002年提出了改进的方法,首先将原来的3X3区域改成圆形区域,利用圆形边界上的点与中心点进行大小比较,圆形边界上的点采用插值得到。其次,作者分析了二进制串从“1”到“0”或从“0”到“1”的变化次数,发现图像上的特征对于每一个二进制串的变化次数一般不操作2次,因此得到均衡模式LBP编码,该编码方式只有58种编码结果。其他变化次数操作2次的都归为第59种。此外,还提出一种旋转不变编码方式,就是将得到的二进制串进行依次移位操作,只取得到的最大值最为编码结果,由此得到旋转不变性编码。图2是圆形LBP编码示意图,图3是旋转不变编码结果,这种方式只有36种编码值。
图2 圆形LBP邻域编码
图3 旋转不变性36种编码结果
LBP算法体现的是图像局部纹理特征,该算法自从提出来以后,在google学术上可以看得到引用次数已经上万次了,证明该算法确实有一定的效果。对其进行改进的算法也很多。Spring出版了两本关于LBP方面的书《Computer Vision Using Local Binary Patterns》和《Local Binary Patterns: New Variants and Applications》也足以说明该算法的影响力。
LBP算法为什么有效?从LBP编码的方式来看,其实该算法利用的也是图像的梯度关系。对于图像而言,梯度反映了图像的变化,而且,梯度一般不受光照变化的影响,梯度对于同一类型图像而言,其变化是很小的。所以,利用图像像素值之间的梯度关系可以实现图像分类。其实,很多与图像处理有关的算法,都离不开图像的梯度。LBP算法类似于计算了邻域像素与中心像素的梯度大小联合分布。因此ÿ