LBP指局部二值模式,英文全称:Local Binary Pattern,是一种用来描述图像局部特征的算子,LBP特征具有灰度不变性和旋转不变性等显著优点。

1 LBP原理及其扩展

1.1 原始LBP

原始的LBP算子定义在像素33的邻域内,以邻域中心像素为阈值,相邻的8个像素的灰度值与邻域中心的像素值进行比较,若周围像素大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,33邻域内的8个点经过比较可产生8位二进制数,将这8位二进制数依次排列形成一个二进制数字,这个二进制数字就是中心像素的LBP值,因此LBP值有256种。中心像素的LBP值反映了该像素周围区域的纹理信息。需要注意的是,计算LBP特征的图像必须是灰度图,如果是彩色图,需要先转换成灰度图。

1.2 圆形LBP

由于原始LBP特征使用的是固定邻域内的灰度值,因此当图像的尺度发生变化时,LBP特征的编码将会发生错误,LBP特征将不能正确的反映像素点周围的纹理信息,因此研究人员对其进行了改进。基本的LBP算子的最大缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要。为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求,Ojala等对LBP算子进行了改进,将3*3邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,改进后的LBP算子允许在半径为R的圆形邻域内有任意多个像素点。从而得到了诸如半径为R的圆形区域内含有P个采样点的LBP算子,这种LBP特征叫做Extended LBP,也叫Circular LBP。

1.3 旋转不变LBP

上面的LBP特征具有灰度不变性,但还不具备旋转不变性,因此研究人员又在上面的基础上进行了扩展,提出了具有旋转不变性的LBP特征。首先不断的旋转圆形邻域内的LBP特征,根据选择得到一系列的LBP特征值,从这些LBP特征值选择LBP特征值最小的作为中心像素点的LBP特征。

1.4 Uniform Pattern LBP

为了解决二进制模式过多的问题,提高统计性,Ojala提出了采用一种“等价模式”(Uniform Pattern)来对LBP算子的模式种类进行降维。Ojala等认为,在实际图像中,绝大多数LBP模式最多只包含两次从1到0或从0到1的跳变。因此,Ojala将“等价模式”定义为:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类。如00000000(0次跳变),00000111(只含一次从0到1的跳变),10001111(先由1跳到0,再由0跳到1,共两次跳变)都是等价模式类。除等价模式类以外的模式都归为另一类,称为混合模式类,例如10010111(共四次跳变)。通过这样的改进,二进制模式的种类大大减少,而不会丢失任何信息。模式数量由原来的2P种减少为P(P-1)+2种,其中P表示邻域集内的采样点数。对于3*3邻域内8个采样点来说,二进制模式由原始的256种减少为58种,即:它把值分为59类,58个uniform pattern为一类,其它的所有值为第59类。这样直方图从原来的256维变成59维。这使得特征向量的维数更少,并且可以减少高频噪声带来的影响。具体实现如下:

采样点数目为8个,即LBP特征值有28种,共256个值,正好对应灰度图像的0-255,因此原始的LBP特征图像是一幅正常的灰度图像,而等价模式LBP特征,根据0-1跳变次数,将这256个LBP特征值分为了59类,从跳变次数上划分:跳变0次—2个,跳变1次—0个,跳变2次—56个,跳变3次—0个,跳变4次—140个,跳变5次—0个,跳变6次—56个,跳变7次—0个,跳变8次—2个。共9种跳变情况,将这256个值进行分配,跳变小于2次的为等价模式类,共58个,他们对应的值按照从小到大分别编码为1-58,即它们在LBP特征图像中的灰度值为1-58,而除了等价模式类之外的混合模式类被编码为0,即它们在LBP特征中的灰度值为0,因此等价模式LBP特征图像整体偏暗。

1.5 MB-LBP

MB-LBP的原理:将图像分成一个个小块(Block),每个小块再分为一个个的小区域(类似于HOG中的cell),小区域内的灰度平均值作为当前小区域的灰度值,与周围小区域灰度进行比较形成LBP特征,生成的特征称为MB-LBP,Block大小为33,则小区域的大小为1,就是原始的LBP特征,Block大小为99,小区域的大小为3*3。接下来对得到LBP特征进行均值模式编码,通过对得到的特征图求直方图,得到了LBP特征值0-255之间(0-255即直方图中的bin)的特征数量,通过对bin中的数值进行排序,通过权衡,将排序在前63位的特征值看作是等价模式类,其他的为混合模式类,总共64类,作者在论文中称之为SEMB-LBP(Statistically Effective MB-LBP)。类似于等价模式LBP,等价模式的LBP的等价模式类为58种,混合模式类1种,共59种。二者除了等价模式类的数量不同之外,主要区别在于:对等价模式类的定义不同,等价模式LBP是根据0-1的跳变次数定义的,而SEMB-LBP是通过对直方图排序得到的。

2. 对于边缘点的处理

对于图像边缘的点,由于通常不能用上述方法来处理成LBP特征点,一般来说有以下几种处理方法:
(1)将边缘的提取不到周围特征的点不进行LBP处理,结果LBP特征图片的像素点会比之前少。
(2)将边缘不存在的邻域点值设置为0。
(3)将边缘的提取不到周围特征的点用原像素点的值取代。

3. LBP的Python应用

Python skimage库中使用local_binary_pattern函数实现LBP提取特征,其函数原型如下:

local_binary_pattern(image, P, R, method='default')

参数说明:

  • image:(N,M)阵列Graylevel图像。

  • P:int圆对称邻居设置点的数量(角度空间的量化)。

  • R:float圆的半径(操作员的空间分辨率)。

  • method:{‘default’,‘ror’,‘uniform’,‘var’}确定模式的方法。

    • ‘default’:原始的局部二值模式,它是灰度但不是旋转不变的。
    • ‘ror’:扩展灰度和旋转不变的默认实现。
    • ‘uniform’:改进的旋转不变性和均匀的模式以及角度空间的更精细的量化,灰度和旋转不变。
    • ‘nri_uniform’:非旋转不变的均匀图案变体,它只是灰度不变的R199。
    • ‘VAR’:局部对比度的旋转不变方差度量,图像纹理是旋转但不是灰度不变的。

测试代码如下:

# -*- coding:utf-8 -*-

from skimage.feature import local_binary_pattern
import matplotlib.pyplot as plt
import cv2

# settings for LBP
radius = 1  # LBP算法中范围半径的取值
n_points = 8 * radius   # 领域像素点数

image = cv2.imread('lenna.jpg')  # 读取图像
image1 = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 按照RGB顺序展示原图
image2 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)   # 灰度转换

# LBP处理
lbp = local_binary_pattern(image2, n_points, radius)

plt.subplot(131), plt.imshow(image1), plt.title('Original Image'), plt.axis('off')
plt.subplot(132), plt.imshow(image2, 'gray'), plt.title('Gray Image'), plt.axis('off')
plt.subplot(133), plt.imshow(lbp, 'gray'), plt.title('LBP Image'), plt.axis('off')
plt.show()

效果如下:

在这里插入图片描述

4. LBPH算法及其应用

4.1 LBPH算法原理

LBPH(Local Binary Patterns Histograms)局部二进制编码直方图,是一种人脸识别算法,用于识别人脸,它以其性能以及如何能够从正面和侧面识别人脸而闻名。建立在LBPH基础之上的人脸识别法基本思想如下:首先以每个像素为中心,判断与周围像素灰度值大小关系,对其进行二进制编码,从而获得整幅图像的LBP编码图像;再将LBP图像分为个区域,获取每个区域的LBP编码直方图,继而得到整幅图像的LBP编码直方图,通过比较不同人脸图像LBP编码直方图达到人脸识别的目的,其优点是不会受到光照、缩放、旋转和平移的影响。

一幅图像具体的计算LBPH的过程如下:

a. 计算图像的LBP特征图像;

b. 将LBP特征图像进行分块,Opencv中默认将LBP特征图像分成8行8列64块区域;

c. 计算每块区域特征图像的直方图cell_LBPH,将直方图进行归一化;

d. 将上面计算的每块区域特征图像的直方图按分块的空间顺序依次排列成一行,形成LBP特征向量;

e. 用机器学习的方法对LBP特征向量进行训练,用来检测和识别目标。

4.2 LBPH识别应用

如下是LBPH人脸识别的部分测试代码:

在这里插入图片描述

根据上述代码,基于LBPH的人脸识别基本步骤可以概括如下:

a. 创建空列表分别存储用于训练的人脸和人脸标签;

b. 遍历训练集,将训练人脸及便签存进空列表;

c. 通过OpenCV的LBPH识别函数对训练集中的人脸和人脸标签生成识别器;

d. 读取测试图像,通过识别器进行预测识别该人脸属于哪一类。

5. 源码仓库地址

🌼 图像处理、机器学习的常用算法汇总

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐