机器学习实战——LBP特征提取

作者:张旭

编辑:栾志勇

全篇概述:

LBP(Local Binary Pattern)算法

是一种描述图像特征像素点与各个像素点之间的灰度关系的局部特征的非参数算法,同时也是一张高效的纹理描述算法。

纹理是物体表面的自然特性,它描述图像像素点与图像领域之间的灰度空间的分布关系,不会因为光照强弱而改变图像的视觉变化。

LBP算法首次提出于1994年,主要是使用8邻域位置的局部关系,具有灰度不变性;随后在2002年提出了其改进版《Multiresolution gray-scale and rotation invariant texture classification with local binary patterns》Timo Ojala, Matti PietikaÈ inen,2002,主要引入了圆形模式、旋转不变性、和等价模式。

所以在下面我们将按照如下顺序介绍LBP特征:灰度不变性的基本LBP,灰度不变性的圆形LBP,旋转不变性的LBP,等价LBP,最后再继续进行我们上一次的实验,用LBP特征提取+KNN算法实现手写数字识别问题。

灰度不变性基本LBP算法:

分析:

基本的LBP算法一般被定义为一个3*3的纹理单元,如图1,其中间的像素点灰度值为Pc,其他相邻的8个像素点灰度值分别为P0,P1,P2,P3,P4,P5,P6,P7,以该纹理单位的中心像素点的灰度值为阈值,若其余相邻的8个像素点的灰度值大于中心像素点灰度值的阈值,则该像素点的编码值为1,小于阈值的时候取编码值为0.

计算:

对于一个3*3的纹理单元,LBP的计算过程为:

为了得到各个像素点的编码值,则为每个S(Pi-Pc)分配权值2^i,然后将编码值连接成一个二进制值然后再转化成一个十进制的值,然后用现在的十进制值代替原来中心点的阈值,再对这个十进制进行计算,计算出的结果就是LBP算法的值,计算公式为:

例子:

下图为一个LBP算法的计算例子:

该纹理单元的中心灰度值(阈值)为85,其余8个相邻的灰度值分别为:90、74、63、134、91、83、99、103、90。根据这个阈值计算的定理进行计算,通过阈值计算后,根据图中箭头所指的方向可以得到一个局部二进制的模式,即:LBP模式=1101001,且LBP=217,。通过以上LBP算法的计算例子可以看出LBP值仅由中心像素点灰度值和相邻八个像素点的灰度值决定,LBP特征即表示了其中心像素点的特征,其值的计算还需要和周围的像素点计算完成,所以,LBP特征与周围有很大的关系,它包含了图像点,又包含了边缘和局部的特征分布信息。

灰度不变性的圆形LBP算法:

从上面的计算我们可以看出,基本的LBP算法的计算仅包含其相邻的八个像素点,半径小,覆盖范围很小,这种方式的表达能力相对较小.

所以,Ojala等人提出一种改进的方法,将原来的3*3的方形九个像素点的计算模式,改成了任一点即半径的圆形模式,这样表达方式就不受限制了,而且原始的正方形领域的像素点空间被圆形领域所代替。这种圆形领域的算法的半径R可以任意的改变,且半径R的像素点个数也不固定。

改进后的LBP算法通常用符号LBP(p,b)表达,R为圆形半径,P代表在该圆形范畴内的P个不同像素点。

下图为几种常见的不同半径和不同像素点的LBP算法的示意图:

为了对LBP算子进行表示,用函数E表示为中心像素和相邻像素点的联合分布函数:

其中,gr表示图像中某个中心像素点的灰度值,g0~gk-1表示与中心像素点相邻的周围的 像素点,其中K=0,1,2~k-1。每个E函数其中心像素点和相邻像素点所围成的圆的半径可以不同,其相邻像素点的数量也可以不同。一个中心像素点周围的其它像素点gk的坐标可以表示成如式1所示:

其中主要注意的是,gr的坐标计算出来之后,可能不是整数,此时一般的解决方法是采用双线性内插值求得该像素点的灰度gr。

假设周围每一点和中心点的差值与中心点是相互独立的,如下式所示:

假设中心像素点的独立性可能有时会造成信息的丢失,但是,其对后续的结果影响很小。而且,在影响结果很小的前提下,以丢失少量信息的代价得到对局部纹理描述的平移不变性,结果时可以接受的、而且这种相对差值表示的纹理特征与表示亮度的中心像素点关系不是很大,所以可以忽略,如式3所示,联合分布表达式为:

由于最终想要得到的是其二值特征,即知道差值的结果符号即可以,这样结果就不受到到光照的影响,则可以表示成公式4,

通过计算得到的二值,需要给每个S赋一个权值,再对其进行求和,即可得到此中心像素点的局部纹理特征值,即LBPk,r

通过上述的计算过程可知,圆形LBP算法与基本LBP算法基本原理相同,但是它的表达方式更灵活,有很好的鲁棒性,表示范围与表达能力更强。

旋转不变性的LBP算法:

通过上面的介绍,我们不难发现1和2两种LBP算法是具有灰度不变性的,在2002年的论文的,除了灰度不变性,作者又为LBP引入了旋转不变性与等价模式,它是怎么实现的呢?

对于一个选定的P,LBP算法将产生2^P个不同的输出值,比如P=8时,值就有256个,这256个模式中每拿出一个都围绕中心点转动,那么在多次转动的过程中,会产生多种不同的结果,而这些结果中值最小的那个模式就是选择不变的二值模式了。比如:

在上面的图中说明的是,图中的这8种模式,都有相同的旋转不变模式,就是十进制为15的那个值,即00001111。那么对256种模式都做这种旋转,得到最小的数作为这种模式的旋转不变模式,旋转不变模式一共有36种,如下图所示:

那么为什么最后又36种呢?我们写一段暴力枚举的代码试一试就好了:

代码:

其中0-255的数字每一个转成二进制后分别转8次,求出最小的十进制数,作为哈希表的索引,最后哈希表中1的个数就是旋转不变的模式种类。

等价LBP算法:

所谓等价模式是通过记录跳变方式来进一步降低LBP特征维数,“等价模式”定义为:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该类型保留;跳变次数超过2次时,直接不要。等价模式就做了这件事,把P=8时的256种灰度不变性模式压缩为58种,把把P=8时的36种旋转不变性模式压缩为9种。下面我们看一下58和9是怎么来的:

首先256压缩为58:

当P=8时,P(P-1)+2=58。其中P(P-1)为跳变2次的情况,而2位跳变为0次的情况,并没有一种情况是发生了一次跳变。

其次36压缩为9:

直接贴一下论文的原话吧:

注意上面那张36种模式图,其中00000000与11111111是跳变为0的情况,除了这两个,图中第一列的其他7个都是跳变为2,最后剩下的27个跳变都超过了2,直接丢弃,所以2+7=9。

LBP +KNN实现手写数字识别:

在上一次HOG特征的文章中,我们设计了一个小实验,现在我们还是用上次准备的数据,根据LBP特征提取算法+KNN分类器实现一个手写数字识别的问题,在这之前需要说明一点的是,上面的内容中我们一直在阐述各种LBP算法,那么LBP的特征到底如何构建呢?

在图中构建不重叠cell单元,并在每一个cell中构建灰度直方图特征,最后把每个cell的灰度直方图特征做串接组合,构建出整张图的特征,在这里就可以解释为什么等价模式可以降维了,我们还是拿P=8举例,假设一张图构建了160个cell,那么各个LBP算法的特征维数为:

灰度不变LBP: 256*160

旋转不变LBP: 36*160

等价灰度不变LBP: 58*160

等价旋转不变LBP: 9*160

最后我们选择等价旋转不变模式(Num_cell=25)跑个实验,并贴出上次实验的结果:

在上面的实验中,由于数据图只有20*20,单元尺寸为4时,单元个数只有25个,所以在等价旋转不变LBP算法中,特征维度只有9*25,等价模式本来为了降维而生,但是本身就不高的维度降维后,丢失了很多特征信息,这可能是LBP(9)只有86.7%的准确率的重要原因。总结一下,上面的实验结果只是一个很简单的验证,并不能说明LBP(9)算法不好,因为分类结果是特征、分类器、数据特点等等因素共同决定的,讲道理,没有不好的算法,只有合适与不合适!

PS:

1. 数据准备和KNN的部分在上一篇HOG特征中已提及,为节省篇幅不再重复

2. 整个代码有大概500行左右,为了节省篇幅,不贴代码啦,如果感兴趣可以到一下地址查看:https://github.com/chaipangpang/LBP-KNN

关于本文LBP特征提取的相关知识和其他问题

原文发布于微信公众号 - 机器学习算法全栈工程师(Jeemy110)

原文发表时间:2017-10-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏瓜大三哥

K-近邻算法(KNN)概述

最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类。但是怎么可能所有测试对象都会找...

2118
来自专栏书山有路勤为径

回顾:训练神经网络

我们可以将这些单元神经元组合为层和堆栈,形成神经元网络。一个神经元层的输出变成另一层的输入。对于多个输入单元和输出单元,我们现在需要将权重表示为矩阵。

722
来自专栏瓜大三哥

BP神经网络续1

一、BP网络中的函数 1.创建函数 1) cascadeforwardnet函数 cascadeforwardnet(hiddenSizes,trainFcn)...

2289
来自专栏专知

【干货】计算机视觉实战系列04——用Python做图像处理

【导读】专知成员Hui上一次为大家介绍Numpy包的使用,介绍了Numpy库的一些基本函数和一些简单用法,以及图像灰度变换,这一次为大家详细讲解图像的缩放、图像...

4137
来自专栏云霄雨霁

算法设计策略----贪心法

1260
来自专栏人工智能

机器学习笔记

基本术语 数据集(data set): 一组数据的集合 样本/示例(instance/sample):数据集中的一个事件或对象 属性/特征(attribute/...

1699
来自专栏PPV课数据科学社区

K-means 在 Python 中的实现

K-means算法简介 K-means是机器学习中一个比较常用的算法,属于无监督学习算法,其常被用于数据的聚类,只需为它指定簇的数量即可自动将数据聚合到多类中,...

3309
来自专栏游戏开发那些事

【Unity3d游戏开发】Unity3D中的3D数学基础---向量

向量是2D、3D数学研究的标准工具,在3D游戏中向量是基础。因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要。在本篇博客中,马三就来和大家一起回...

551
来自专栏求索之路

cs231n之SVM算法和SoftMax算法

1.环境搭建以及前置条件 1.前置环境: 1.mac 2.pycharm 3.python3 4.Anaconda 2.环境搭建: 1.官网下载并安装Ana...

2796
来自专栏一棹烟波

图像处理中kmeans聚类算法C++实现

1673

扫描关注云+社区