零 前言

LBP曾广泛应用于人脸检测以及人脸识别应用中,但在深度学习和卷积神经网络迅猛发展的今天,以LBP为特征的检测以及识别算法并不具有竞争力,但是作为学习案例还是很有借鉴意义的。

本文的重点部分是:第一节\第二节\第六节.即介绍灰度不变性和旋转不变性的实现过程以及运用LBP算子计算整个图像的全局LBP特征向量.

第三节\第四节\第五节\第六节 可以参考我下文列出的文献.我认为如果要掌握一个知识点,少不了多看几篇文章.

其中,也有一点最让我想不透,就是如何实现的尺度不变性.所以这一点就没有在本文得到具体解释.如果同学知晓,希望给与思路.

一 LBP算子的发展简述(即输入和输出)

1 LBP局部二值模式(Local Binary Pattern),是一种用来描述图像局部特征的算子,用以提取纹理特征,具有灰度不变性和旋转不变性。

  • 基本LBP算子的一个缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要,为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求。改进后的LBP算子允许在半径为R的圆形领域内有任意多个像素点,从而得到诸如半径为R的圆形区域内含有p个采样点的LBP算子,表示为光照不变 opencv 光照不变性_计算机视觉
  • 改进主要有四个方面,分为四个递进层次首先,实现了邻域从正方形转变为圆形;其次,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)的来实现对光照不敏感的。而不是仅通过光照不变 opencv 光照不变性_光照不变 opencv_02的差分值来实现的。

光照不变 opencv 光照不变性_人工智能_03

光照不变 opencv 光照不变性_python_04 光照不变 opencv 光照不变性_机器学习_05 光照不变 opencv 光照不变性_python_06

  • 在进行深度学习或者图片分类时,为了消除亮度的影响,会选择的做法是使得每个像素的RGB三通道的值分别减去区域的均值,比如光照不变 opencv 光照不变性_计算机视觉_07。比如CV中的blobFromImage方法,为了消除同一场景下不同光照的图片,对我们最终的分类或者神经网络的影响,我们常常对图片的R、G、B通道的像素求一个平均值,然后将每个像素值减去我们的平均值,这样就可以得到像素之间的相对值,就可以排除光照的影响。参考文章OpenCV中blobFromImage函数详细解释
2.2 旋转不变性的实现方式

旋转不变性的实现,简单地来说,是不断旋转圆形邻域得到一系列初始定义的 LBP值,取其最小值作为该邻域的 LBP 值

光照不变 opencv 光照不变性_人工智能_08

1 对于这句话的理解,需要结合上图多思考思考,提出自己困惑的问题

举个例子,你是否困惑,一个图像的每一个像素点邻域内的像素点的值都是固定的,得到的采样点经过处理得到的值不是1就是0就已经确定下来了。那是如何实现圆形领域的旋转呢?

事实上,应该换个角度,并且是通过示例的方式来理解。

假设,我规定一个图像全部使用半径为1且采样点为8的邻域且这个领域中已经确定有四个点的为0,另外四个点为1,而组合顺序不定。比如其中的一种情况如下图:

光照不变 opencv 光照不变性_python_09

那么我们可以想一下,会有多少种序列的排列情况。应该是光照不变 opencv 光照不变性_光照不变 opencv_10种。

  • 事实上,如果仅告知要使用半径为1采样点为8的邻域,对于任意一个区域,圆形LBP值会产生256种不同的输出(光照不变 opencv 光照不变性_光照不变 opencv_11)。
  • 注意邻域是由半径和采样点共同决定,并且是对图像所有像素点均使用相同种类的邻域

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了。

光照不变 opencv 光照不变性_机器学习_12

  • 同理,当某个像素点的二进制模式为以下7种(11110000、01111000、00111100、00011110、00001111、10000111、11000011)的任意一种,其旋转不变性的LBP值都是15!
2.3 尺度不变性的实现方式

1 如果了解过SIFT的同学,会想到SIFT采用的方法一般是通过高斯金字塔扩展到多尺度空间 , 但是LBP有其特殊的方式

2 特殊方式即是对LBP算子进行两方面的改进:由正方形邻域转化为圆形邻域,并且可以指定半径的大小与邻域内的采样点数目.

但是我并没有想通具体是如何实现尺度不变的?若读者懂,希望不吝赐教

参考文章:
(四十三)特征点检测-LBP

3 基本LBP算子

1 基本LBP算子计算一个像素点的LBP值的流程

光照不变 opencv 光照不变性_人工智能_13

  • 在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算子,表示为光照不变 opencv 光照不变性_python_14

圆形LBP算子的特点:在半径为R的圆形区域内选择P个采样点计算中心像素的LBP值。

  • 一般地,采样点的个数是半径值的8倍。

如下图示:

光照不变 opencv 光照不变性_计算机视觉_15

计算公式如下所示
光照不变 opencv 光照不变性_机器学习_16
光照不变 opencv 光照不变性_人工智能_17

  • 从上图与上式观察可知,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值是十进制形式而不是二进制模式.

光照不变 opencv 光照不变性_机器学习_18

  • 计算每个区域的直方图,统计每个LBP值(必须是十进制形式)出现的频率,再做直方图的归一化(即灰度变换)。注意此时的直方图的横坐标取值的种类是59个。,如下图示.
  • 光照不变 opencv 光照不变性_人工智能_19

  • 最后将得到的每个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参数说明

  1. image表示的是要检测的输入图像
  2. objects表示检测到的人脸目标序列
  3. scaleFactor表示每次图像尺寸减小的比例
  4. minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸),
  5. minSize为目标的最小尺寸
  6. maxSize为目标的最大尺寸

参考文章: