LBPH(Local Binary Patterns Histograms,局部二值模式直方图)的原理主要基于LBP(Local Binary Patterns,局部二值模式)算法,并通过计算并比较图像中局部区域的LBP直方图来进行特征提取和识别。以下是LBPH原理的详细解释:
一. LBP基本原理
1.局部二值模式特征提取
对于图像中的每个像素,将其邻域的像素与该像素进行比较。如果邻域像素大于或等于中心像素,则该邻域像素被标记为1,否则为0。
2.二进制数转换
对于每个像素,比较结果会形成一个二进制数。这个二进制数通常是由中心像素与其周围8个像素比较得到的8位二进制序列。将这个二进制序列转换为十进制数,即得到该像素的LBP值。
二. LBPH实现步骤
1.图像划分
将输入图像划分为若干个小区域(或称为局部区域),每个区域将独立处理。
2.LBP直方图计算
对于每个局部区域,计算其LBP值的直方图。直方图的每个条目记录了特定LBP模式在该区域中出现的频率。
3.特征向量形成
将所有局部区域的LBP直方图串联起来,形成一个长特征向量。这个特征向量代表了整个图像的纹理特征。
三. 识别阶段
1.计算输入图像的LBP直方图
在识别阶段,对于输入的待识别图像,同样进行图像划分和LBP直方图的计算。
2.比较直方图
将输入图像的LBP直方图与预先存储的训练图像的直方图进行比较。通常使用某种形式的距离度量(如欧几里得距离或卡方距离)来评估相似度。
3.识别决策
基于上述的相似度或距离度量,选择最匹配或最接近的训练图像,将其对应的标签作为识别结果。
四. 算法特点
1.旋转不变性
LBP算法具有旋转不变性,即当图像发生旋转时,LBP值不会发生改变(或在一定程度上保持稳定性)。这使得LBPH算法对于旋转变化具有一定的鲁棒性。
2.灰度不变性
LBP算法主要关注像素之间的相对关系,而不是绝对灰度值。因此,它对于光照变化等灰度变化因素具有一定的鲁棒性。
五.代码示例
import cv2
import numpy as np
#将人脸图像读入列表
images=[]
images.append(cv2.imread("a1.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("a2.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("b1.png",cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread("b2.png",cv2.IMREAD_GRAYSCALE))
#标签列表,对应于images列表中的图像,0表示是Andy的图像,1表示是Tony的图像
labels = [0,0,1,1]
# 读取预测图像
predict_image=cv2.imread("a3.png",cv2.IMREAD_GRAYSCALE)
# 创建LBPH人脸识别器对象,并设置阈值
recognizer = cv2.face.LBPHFaceRecognizer_create(threshold = 80)
# 使用训练数据和对应的标签训练识别器
recognizer.train(images,np.array(labels))#
# 对预测图像进行预测
label,confidence =recognizer.predict(predict_image)
# 根据预测结果输出标签和置信度
if label == 0:
print("对应的标签label=Andy")
elif label == 1:
print("对应的标签label=Tony")
print("置信度confidence=",confidence)
#代码运行结果:
#对应的标签label=Andy
#置信度confidence= 67.6856704732354