LBPH

基本原理是将像素点A的值与其最临近的8个像素点的值逐个比较:

  • 如何A大于其临近点的像素值,则得到0
  • 如何A小于其临近点的像素值,则得到1

最后,将所得到的8个01连起来。得到一个8位的二进制序列。将该二进制序列转换为十进制作为A的LBP值。

这里举个例子:

lbph 的图像结果

对图像逐个像素进行处理,就会得到LBP特征图像。这个特征图像的直方图被称为LBPH,或称为LBP直方图。

为了得到不同尺度下的纹理结构,还可以用圆形领域将计算扩大到任意大小的领域内。圆形领域用(P,R)表示。P表示参与的像素点个数,R表示邻域的半径。

人脸的整体灰度由于收到光线的作用,经常会发生变化,但是人脸各部分的相对灰度会基本保持一致。LBP的主要思想是以当前点与其领域像素的相对关系作为处理结果,因此在图像灰度整体发生变化时(单调变化),从LBP算法中提取的特征值能保持不变。

人脸识别流程

使用OpenCV中进行人脸识别时,LBPH会在图像中构建不重叠区域,在每个区域内构建灰度直方图特征,最后拼接构成人脸图像的整体特征,进而进行对比识别。具体流程如下:

  1. 先使用LBP提取图片特征,获取灰度图像的LBP;

  2. 将图像划分为不重叠区域,在OpenCV中默认为8行8列64个区域;

  3. 在每个区域内构建灰度直方图,OpenCV中默认采用灰度不变LBP;

  4. 将整张图像的灰度直方图特征按照一定的顺序进行拼接,构建整体特征;

  5. 将待识别人脸和人脸底库的特征进行相似性计算,相似度最高的即为同一个人。

从流程上看整个过程十分直观,实现效率也很高。虽然采用的是灰度图像,但不受光线、亮度等影响,而且可以减少人脸位置、大小等问题所造成的偏差,有较强的鲁棒性。

Demo

1
2
3
4
5
6
7
8
9
10
11
faces, ids = getlable(path)  # 获取图像数组和id标签数组和姓名
recognizer = cv2.face.LBPHFaceRecognizer_create() # 获取训练对象
recognizer.train(faces, np.array(ids)) # 提取LBPH特征并进行识别
recognizer.write('trainer.yml') # 保存生成的人脸特征数据文件

img # 输入的人脸图片

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换为灰度图像
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 加载目标识别器
face = face_detector.detectMultiScale(gray, 1.3, 5, cv2.CASCADE_SCALE_IMAGE, (100, 100), (300, 300))# 获取人脸的坐标