零 前言
LBP曾广泛应用于人脸检测以及人脸识别应用中,但在深度学习和卷积神经网络迅猛发展的今天,以LBP为特征的检测以及识别算法并不具有竞争力,但是作为学习案例还是很有借鉴意义的。
本文的重点部分是:第一节\第二节\第六节.即介绍灰度不变性和旋转不变性的实现过程以及运用LBP算子计算整个图像的全局LBP特征向量.
第三节\第四节\第五节\第六节 可以参考我下文列出的文献.我认为如果要掌握一个知识点,少不了多看几篇文章.
其中,也有一点最让我想不透,就是如何实现的尺度不变性.所以这一点就没有在本文得到具体解释.如果同学知晓,希望给与思路.
一 LBP算子的发展简述(即输入和输出)
1 LBP局部二值模式(Local Binary Pattern),是一种用来描述图像局部特征的算子,用以提取纹理特征,具有灰度不变性和旋转不变性。
- 基本LBP算子的一个缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要,为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求。改进后的LBP算子允许在半径为R的圆形领域内有任意多个像素点,从而得到诸如半径为R的圆形区域内含有p个采样点的LBP算子,表示为。
- 改进主要有四个方面,分为四个递进层次,首先,实现了邻域从正方形转变为圆形;其次,LBP旋转不变模式,实现了旋转不变性;再者,LBP等价模式,避免因采样点数目增多引起的计算量暴增,以提高效率;最后,MB-LBP特征模式,克服了基本LBP算子只能捕捉微观特征,但不能捕捉宏观特征的缺点。
2 LBP算子发展至今,已经产生大量的改进与变种。
- 比较经典的LBP特征有,基本LBP特征、Extended LBP(圆形LBP特征)、旋转不变的LBP特征、Uniform Pattern LBP特征(等价LBP特征)和MB-LBP特征(Multiscale Block LBP),这些也是本文将要介绍的。
- 其他的还有,TLBP(中心像素与周围所有像素比较,而不是根据采样点的数目),DLBP(编码标准四个方向的灰度变化,每个方向上用2比特编码),MLBP(将中心像素值替换成采样点像素的平均值)等。
LBP算子同其他算子的共同之处就在于:借助周围邻域像素点的信息,通过某种计算,最终估算得到中心像素位置的新值。
二 灰度不变性、旋转不变性和尺度不变性的实现方式简述
2.1 灰度不变性的实现方式
所谓灰度/光照不变性,是指光照变化基本不会对特征描述产生影响(灰度值按比例缩放,强者恒强)。LBP的灰度不变性,是通过邻域内像素点减去中心像素的值再经过阈值处理(0,1)的来实现对光照不敏感的。而不是仅通过的差分值来实现的。
- 在进行深度学习或者图片分类时,为了消除亮度的影响,会选择的做法是使得每个像素的RGB三通道的值分别减去区域的均值,比如。比如CV中的
blobFromImage
方法,为了消除同一场景下不同光照的图片,对我们最终的分类或者神经网络的影响,我们常常对图片的R、G、B通道的像素求一个平均值,然后将每个像素值减去我们的平均值,这样就可以得到像素之间的相对值,就可以排除光照的影响。参考文章OpenCV中blobFromImage函数详细解释
2.2 旋转不变性的实现方式
旋转不变性的实现,简单地来说,是不断旋转圆形邻域得到一系列初始定义的 LBP值,取其最小值作为该邻域的 LBP 值。
1 对于这句话的理解,需要结合上图多思考思考,提出自己困惑的问题。
举个例子,你是否困惑,一个图像的每一个像素点邻域内的像素点的值都是固定的,得到的采样点经过处理得到的值不是1就是0就已经确定下来了。那是如何实现圆形领域的旋转呢?
事实上,应该换个角度,并且是通过示例的方式来理解。
假设,我规定一个图像全部使用半径为1且采样点为8的邻域且这个领域中已经确定有四个点的为0,另外四个点为1,而组合顺序不定。比如其中的一种情况如下图:
那么我们可以想一下,会有多少种序列的排列情况。应该是种。
- 事实上,如果仅告知要使用半径为1采样点为8的邻域,对于任意一个区域,圆形LBP值会产生256种不同的输出()。
- 注意邻域是由半径和采样点共同决定,并且是对图像所有像素点均使用相同种类的邻域
2 为了能将这个问题解释得稍微简单,我们再简化一个场景
假设某个像素点计算得到的二进制模式为:11100001,求解其旋转不变性处理后的LBP值(十进制)。
第一,由11100001可知,该像素点在进行LBP算子计算时的邻域设定为采样点为8。并且,该中心点所在邻域的8个像素点中存在4个位置的像素点的数值大于中心像素。1110001的LBP值是225。
第二,计算8个采样点且四个值为1的二进制模式,并且跟“11100001”类似的是这四个1的点要紧挨着进行旋转的二进制模式,如下图所示,除了11100001,还有另外7种模式。经过计算可知,加上11100001总共8种模式对应的LBP值中15是最小,所以11100001经过旋转处理后的LBP值就不再是225,而是15了。
- 同理,当某个像素点的二进制模式为以下7种(11110000、01111000、00111100、00011110、00001111、10000111、11000011)的任意一种,其旋转不变性的LBP值都是15!
2.3 尺度不变性的实现方式
1 如果了解过SIFT的同学,会想到SIFT采用的方法一般是通过高斯金字塔扩展到多尺度空间 , 但是LBP有其特殊的方式
2 特殊方式即是对LBP算子进行两方面的改进:由正方形邻域转化为圆形邻域,并且可以指定半径的大小与邻域内的采样点数目.
但是我并没有想通具体是如何实现尺度不变的?若读者懂,希望不吝赐教
参考文章:
(四十三)特征点检测-LBP
3 基本LBP算子
1 基本LBP算子计算一个像素点的LBP值的流程
- 在3*3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较。
- 若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。
- 注意, 邻域大小范围限定为3。
这种处理思路的神奇之处在于,借助3×3正方形邻域内的像素点,通过阈值处理使得邻域的每个像素点转化为0和1,将组合的一个8位二进制数据作为中心像素的LBP值。
其中
- 假若像素点位于一张图像的左右上下边界,则计算时候,会将空缺位置填充为0。
- 3*3邻域内的8个点经比较可产生8位二进制数,通常转换为十进制数即LBP码,共256种。
- 之所以中心像素选择LBP值作为其值,是因为LBP能够反映该中心像素周围区域的纹理信息。
这里自然有个小问题,当采样点为8个的时候,8位的二进制数据当全为1时,经过十进制转化,是否会超过像素值允许的范围0-255?其实不会,而且11111111恰好十进制值为255。
三 圆形LBP算子(Circular LBP or Extended LBP)
基本LBP算子的一个缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要,为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求。改进后的LBP算子允许在半径为R的圆形领域内有任意多个像素点,从而得到诸如半径为R的圆形区域内含有p个采样点的LBP算子,表示为。
圆形LBP算子的特点:在半径为R的圆形区域内选择P个采样点计算中心像素的LBP值。
- 一般地,采样点的个数是半径值的8倍。
如下图示:
计算公式如下所示
- 从上图与上式观察可知,P个采样点的位置是在半径为R的圆形边缘上,并没有在内部。
这里自然有个问题,如果计算得到的坐标的x,y值不是整数,那应该如何获得像素值,答案是进行插值运算操作。参考文章OpenCV框架与图像插值算法,而默认地,OpenCV种使用双线性插值法。
四 LBP旋转不变模式
上面的LBP特征具有灰度不变性,但还不具备旋转不变性。
- 方式即是:不断旋转圆形邻域得到一系列初始定义的LPB值,取最小值作为该邻域的中心像素的值。
这里参考2.2节旋转不变性的实现方式.
五 等价LBP模式(Uniform Pattern)
它的提出主要是为了解决当邻域内采样点数目增加,二进制模式的种类以指数形式增加引起的计算爆炸现象。
1 情景引入
在人脸识别中,把脸分为77,55的区域,并对这49,25个小区域进行LBP处理,将每个小区域的直方图进行串联,就可以得到整个图像的LBP直方图。并对这个直方图进行分类处理,这样可以大大的增强分类的效果。但是分类数据维度也大大增加了,如果是77区域,数据维度为77*256=12544维。可以看出数据的维度还是比较大,所以需要进一步进行降维,这里就涉及了另外一个概念:Uniform LBP,即等价模式LBP.
2 等价模式LBP的简介
这种降维感觉是用了电路中的方法,也就是将原来的256维灰度数据重新分类,统计其位移后的跳变次数,当跳变次数小于2次时就定义为一个Uniform LBP,比如00000000左移一位还是00000000,没有跳变,即跳变次数为0;00001111左移一位为00011110,跳变次数为2;10100000左移一位为01000001跳变次数为3,它不是Uniform LBP。
经过统计,Uniform LBP在整个的LBP特征中占85~90%,而Uniform LBP只有58个特征。所以我们将分类特征向量由256维降为58维。在实际应用中,其实是59维,因为加一维表示那些不是Uniform LBP的量。那么77的人脸区域在进行降维之后,有77*59=2891维。由此对LBP特征进行了降维。
六 等价LBP模式用于图像纹理特征向量计算的流程
1 流程
- 首先将检测窗口划分为16*16的小区域(cell)
- 对于每个cell中的一个像素,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0.这样,3*3领域内的8个点经过比较可产生8位二进制数,即得到该窗口中心像素点的LBP值;
- 然后计算每个cell的直方图,即每个数字出现的频率,然后对该直方图进行归一化处理(参加文章图像直方图归一化 Histogram Normalization)
- 最后将得到的每个cell的统计直方图进行串联连接成一个特征向量,也就是整幅图的LBP纹理特征向量
2 流程具象化举例
- 假设场景:一个图像分为10个大小为6*6的区域Block/Cell。
每个区域的每个像素,通过半径大小为1且采样点为8的邻域,计算出各个像素点对应的LBP值,如图示。通常,LBP值是十进制形式而不是二进制模式.
- 计算每个区域的直方图,统计每个LBP值(必须是十进制形式)出现的频率,再做直方图的归一化(即灰度变换)。注意此时的直方图的横坐标取值的种类是59个。,如下图示.
- 最后将得到的每个cell的统计直方图进行串联连接成一个特征向量,也就是整幅图的LBP纹理特征向量,如上图示.
假设59个类别对应的数值为:值1,值2… …,值59
则一个区域的LBP的特征向量的形式是:[ 值1对应的像素点的个数,值2对应的像素点个数,… … , 值59对应的像素点的个数]
一个区域的shape为:(59,),则一张由10个区域构成的图像,其LBP特征向量其shape为(10*59,)
- 如果没有使用等价模式的LBP,则全局的LBP特征向量是(10*256 , )
- 图像的全局LBP特征向量必须按照区域的顺序进行一维串联,才能保留图像的空间分布信息。
而一个区域的局部LBP特征向量则是按照59个类别从小到大的顺序进行排列,才能有规律的保留区域的纹理信息。
七 detectMultiScale参数说明
- image表示的是要检测的输入图像
- objects表示检测到的人脸目标序列
- scaleFactor表示每次图像尺寸减小的比例
- minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸),
- minSize为目标的最小尺寸
- maxSize为目标的最大尺寸
参考文章:
- LBP特征学习(附python实现)
- LBP特征原理及代码实现
- 图像物体检测识别中的LBP特征
- 计算机视觉基础下
- opencv detectMultiScale()参数调节
- OpenCV框架与图像插值算法
- 灰度不变性LBP