文章目录
- [LBPH 算法](#LBPH 算法)
-
- 一、基本思想
- 二、LBPH算法步骤
-
- [1. 图像划分](#1. 图像划分)
- [2. 局部二值模式特征提取](#2. 局部二值模式特征提取)
- [3. 直方图统计](#3. 直方图统计)
- [4. 特征向量生成](#4. 特征向量生成)
- [5. 相似度计算](#5. 相似度计算)
- 三、代码实现
-
- [1. 图像预处理](#1. 图像预处理)
- [2. 创建一个LBPH的人脸识别器](#2. 创建一个LBPH的人脸识别器)
- [3. 训练实例模型](#3. 训练实例模型)
- [4. 图像预测](#4. 图像预测)
- 总结
LBPH 算法
**LBPH(Local Binary Patterns Histogram,局部二值模式直方图)**算法使用的模型基于LBP(Local Binary Pattern,局部二值模式)算法。LBP 算法最早是被作为一种有效的纹理描述算子提出的,因在表述图像局部纹理特征方面效果出众而得到广泛应用。
一、基本思想
LBP算法的基本思想是对图像的像素和它局部周围像素进行对比,具体地,把某个像素作为中心,对相邻像素进行阈值比较。
如果中心像素的灰度值大于或等于其相邻像素的灰度值,则将该相邻像素标记为1,否则标记为0。这样,对于每个像素,比较结果会形成一个二进制数。这个二进制数通常是由中心像素与其周围8个像素比较得到的8位二进制序列。将这个二进制序列转换为十进制数,即得到该像素的LBP值。这个LBP值反映了中心像素与其周围像素的纹理关系。
二、LBPH算法步骤
1. 图像划分
- 将输入图像划分为若干个小区域(或称为局部区域),每个区域将独立处理。这些区域通常是像素块。
2. 局部二值模式特征提取
- 对于每个局部区域,选择一个中心像素,然后与其周围的像素进行比较。
- 比较方法是,将中心像素的灰度值与相邻像素的灰度值进行比较,如果相邻像素的灰度值大于或等于中心像素的灰度值,则将该像素标记为1,否则标记为0。
- 这一过程生成了一个二进制数字,它代表了中心像素与其周围像素的比较结果。
- 将这个二进制数字转换为十进制数作为当前像素的LBP值。
3. 直方图统计
- 对于整个图像,统计每个局部二值模式(LBP)值的出现次数,形成一个LBP直方图。
- 这个直方图反映了不同纹理特征在图像中的分布。
4. 特征向量生成
- 将每个区域的LBP直方图连接在一起,形成整个图像的LBP特征向量。
- 这个特征向量可以用于图像分类、纹理分析、人脸识别等任务。
5. 相似度计算
- 在得到每个局部区域的特征后,将这些特征串联成一个向量作为整张人脸图像的特征向量。
- 使用各种相似性度量方法(如欧几里得距离或余弦相似度)来计算两个特征向量之间的相似度。
三、代码实现
1. 图像预处理
准备好训练的图像,以及需要测试的图像:
python
import cv2
import numpy as np
"""-----训练的人脸照片-----"""
images = []
images.append(cv2.imread('f1.jpg',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('f2.jpg',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('z1.jpg',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread('z2.jpg',cv2.IMREAD_GRAYSCALE))
labels = [0,0,1,1] # 标签
dic = {0:'yf',1:'zrn',-1:'无法识别'}
predict_image = cv2.imread('f_test.jpg',cv2.IMREAD_GRAYSCALE) # 待识别的人脸图像
2. 创建一个LBPH的人脸识别器
- 函数:功能:创建一个LBPH的人脸识别器
python
recognizer = cv2.face.LBPHFaceRecognizer_create(radius=None,neighbors=None,
grid_x=None,grid_y = None,threshold=None)
- 参数:
python
-- radius:可选,圆形局部二进制模式的半径,建议默认
-- neighbors:可选,圆形局部二进制模式的采样点数目,建议默认
-- grid_x:可选,水平方向上的单元格数,默认为8,即将LBP特征图在水平方向上划分为8个单元
-- grid_y:可选,垂直方向上的单元格数,默认为8,建议默认
-- threshold:可选,人脸识别时使用的阈值,建议默认
- 代码:
python
recognizer = cv2.face.LBPHFaceRecognizer_create(threshold=80)
3. 训练实例模型
- **函数train()**用给定的数据和相关标签训练成的实例模型。语法格式:
python
None = 识别器对象.train(src,labels)
- 参数:
python
-- src:训练图像,用来学习的人脸图像
-- labels:标签,人脸图像对应的标签
- 代码:
python
recognizer.train(images,np.array(labels))
4. 图像预测
- **函数predict()**对一个待识别人脸图像进行判断,寻找与当前图像距离最近的人脸图像。
- 与哪副人脸图像最近,就将当前待测图像标注为该人脸图像对应的标签
- 若待识别人脸图像与所有人脸图像的距离都大于特定的距离值(阈值),则认为没有找到对应的结果
代码:
python
label,confidence = recognizer.predict(predict_image)
print('这人是',dic[label])
print('置信度',confidence)
----------------
这人是 yf
置信度 53.49412736939389
返回值:
python
-- src:需要识别的人脸图像
-- confidence:返回的置信度评分,用来衡量识别结果与原有模型之间的距离
注意!!!:评分越小表示匹配度越高,但若是高于80,则认为识别结果与原有模型差距大。
总结
本篇介绍了如何通过创建LBPH的人脸识别器来进行人脸识别。