LBHP(Local Binary Pattern Histogram,局部二值模式直方图)所使用的模式基于LBP算法。LBP是一种有效的纹理描述算子提出的,在表述图像局部纹理特征上效果出众。

LBP的基本原理

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

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

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

这里举个例子:

LBP原理示意图

二值化之后,任意指定一个位置开始,将二值进行序列化,组成一个8位的二进制数,例如上图中可以是01011001。转化为十进制就是89。最为当前中心点的像素值。

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

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

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

函数介绍

1、cv2.face.LBPHFaceRecognizer_create()函数生成识别器模型

语法:

retval = cv2.face.LBPHFaceRecognizer_create([,radius[,neighbor[,grid_x[,grid_y[,threshold]]]]])

参数全是可选的。

  • radius 半径值,默认值为1
  • neighbor 领域点的个数,默认是8,根据需要可以计算更多的领域点
  • grid_x 将LBP特征图像划分为一个个单元格时,每个单元格在垂直方向上的像素个数。默认值为8,即在图像行的方向上以8个像素为单位分组
  • grid_y 将LBP特征图像划分为一个个单元格时,每个单元格在数值方向上的像素个数。默认值为8,即在图像列 的方向上以8个像素为单位分组
  • threshold 在预测时所使用的阈值,如果大于该阈值,就认为没有识别到任何目标对象

2、函数cv2.face_FaceRecognizer.train()

使用该函数完成训练,对每个参考图像计算LBPH,得到一个向量,每个人脸都是整个向量集中的一个点。

该函数的语法格式为:

None = cv2.face_FaceRecognizer.train(src,labels)
  • src 训练图像,用来学习的人脸图像
  • labels 标签,人脸图像所对象的标签

3、函数cv2.face_FaceRecognizer.predict()

函数cv2.face_FaceRecognizer.predict()是对待测人脸进行判断,寻找与当前图像距离最近的人脸图像。并返回对应的标签。如果都大于create里的thresold所指定的距离值,则认为没有找到对应的图像,即无法识别当前人脸。

label, confidence = cv2.face_FaceRecognizer.predict( src )
  • src 需要识别的人脸图像
  • label 返回的识别结果标签
  • confidence 返回的置信度评分。0表示完全匹配,一般小于50的值是可以接受的。如果大于80则认为差别较大。

人脸识别

用一个小案例来介绍如何使用LBPH算法来识别人脸。

import cv2
import numpy as np

# 读取图像
images=[]
images.append(cv2.imread("liudehua1.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("liudehua2.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("wujing1.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("wujing2.png",cv2.IMREAD_GRAYSCALE))

# 贴上标签
labels=[0,0,1,1]
#print(labels)

#调用LBPH
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.train(images, np.array(labels))  
predict_image=cv2.imread("test.png",cv2.IMREAD_GRAYSCALE)
#返回判断值
label,confidence= recognizer.predict(predict_image) 

#输出结果
print("label=",label)
print("confidence=",confidence)

运行结果:

label= 1
confidence= 61.41541874084526

也就是说,test图像时和wujing1/wujing2是一组的,置信区间为61,偏差稍大,但是可以接受。这是因为训练的图片太少,如果加大训练的数量,可以较大得提高可信度。

训练用到的图像

test测试图像



博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/CVLBPH.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 25 日
如果觉得我的文章对你有用,请随意赞赏