一、介绍
本次使用OpenCV的LBPH(局部二值模式直方图)算法进行人脸识别的python代码,下面我将从整体流程、关键步骤、算法原理、参数含义、与EigenFace的对比、潜在问题与改进建议六个方面进行详细讲解。
该程序的目标与之前EigenFace一致:
1.用4张已知身份的人脸图像(黎明2张。安志杰2张)训练一个LBPH识别器。
2.对测试图像预测身份,并输出标签与置信度。
3.与EigenFace不同的是,没有进行图像尺寸缩放 ,也没有显示图像,仅输出控制台结果。
二、核心代码讲解
2.1导入库与图像读取

使用cv2.IMREAD_GRAYSCALE明确以灰度模式读取。
关键区别 :这里没有 对图像进行resize操作。因为LBPH算法不要求所有图像尺寸一致,二EigenFace必须要求统一尺寸。但为了更好的效果,通常建议统一尺寸。
2.2标签与测试图像

标签对应每个人的ID:0代表"黎明",1代表"安志杰"。前两张是黎明,后两张是安志杰。
下面同样以灰度读入并缩放到相同尺寸,保证与训练样本维度匹配。
2.3创建LBPH识别器

无参数创建,使用默认参数:
半径(radius)=1
邻域点数(neighbors)=8
网格划分(grid_x,grid_y)=(8,8)
阈值(threshold)=浮点数最大值
2.4训练与预测

train()训练模型,内部提取每张图像的LBPH特征向量并存储。
predict()返回标签和置信度。LBPH的置信度表示欧式距离,数值越小表示匹配度越高。
三、LBPH算法核心原理
LBPH是一种纹理描述符,对光照变化具有较强鲁棒性,计算步骤如下:
1.局部二值模式(LBP)编码
对每个像素,以它为中心,比较其与周围邻域的灰度值。
若邻点灰度>=中心灰度,则该位为1,否则为0.
将8位二进制数转为十进制(0-255),作为该像素的LBP值。
2.分块直方图统计
将图像划分为若干小网络(如8*8网格)
对每个网格,统计LBP值的直方图(256个bin)。
将所有网格的直方图串联,形成该图像的特征向量。
3.直方图相似度度量
训练时存储每张图像的特征向量及对应标签。
预测时计算测试图像与所有训练图像的直方图距离。
返回距离最近者的标签和距离值。
优点:对光照、姿态变化较鲁棒,计算效率高,无需图像尺寸统一。