OPENCV中的LBPH算法

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

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LBPH是一种基于纹理的人脸识别算法,它的实现原理如下: 1.将图像分割成小的区域,称为像素块。 2.对于每个像素块,将其转换为LBP特征向量。LBP特征向量是由像素块心像素与周围像素的比较结果组成的二进制数列。 3.对于每个图像,将其所有像素块的LBP特征向量组合成一个大的特征向量。 4.使用这些特征向量来训练分类器,例如支持向量机(SVM)或k最近邻(KNN)。 5.对于新的图像,提取其LBP特征向量,并使用训练好的分类器来预测其标签。 下面是一个使用opencv实现LBPH算法的例子: ```python import cv2 # 加载训练数据 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') recognizer = cv2.face.LBPHFaceRecognizer_create() recognizer.read('trainer.yml') # 打开摄像头 cap = cv2.VideoCapture(0) while True: # 读取摄像头的图像 ret, img = cap.read() # 将图像转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 检测人脸 faces = face_cascade.detectMultiScale(gray, 1.3, 5) # 对于每个检测到的人脸,进行识别 for (x, y, w, h) in faces: # 提取人脸图像 roi_gray = gray[y:y+h, x:x+w] # 进行识别 id_, confidence = recognizer.predict(roi_gray) # 如果置信度足够高,则显示标签 if confidence < 100: label = "person {}".format(id_) else: label = "unknown" cv2.putText(img, label, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2) # 显示图像 cv2.imshow('img', img) # 按下q键退出 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头并关闭窗口 cap.release() cv2.destroyAllWindows() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值