首页 > 编程语言 >【进阶OpenCV】 (14)-- 人脸识别 -- LBPH 算法

【进阶OpenCV】 (14)-- 人脸识别 -- LBPH 算法

时间:2024-10-15 22:21:32浏览次数:9  
标签:LBP 人脸识别 进阶 -- LBPH cv2 像素 图像

文章目录

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. 图像预处理

准备好训练的图像,以及需要测试的图像:

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的人脸识别器
recognizer = cv2.face.LBPHFaceRecognizer_create(radius=None,neighbors=None,
                                                grid_x=None,grid_y = None,threshold=None)
  • 参数
-- radius:可选,圆形局部二进制模式的半径,建议默认
-- neighbors:可选,圆形局部二进制模式的采样点数目,建议默认
-- grid_x:可选,水平方向上的单元格数,默认为8,即将LBP特征图在水平方向上划分为8个单元
-- grid_y:可选,垂直方向上的单元格数,默认为8,建议默认
-- threshold:可选,人脸识别时使用的阈值,建议默认
  • 代码
recognizer = cv2.face.LBPHFaceRecognizer_create(threshold=80)

3. 训练实例模型

  • **函数train()**用给定的数据和相关标签训练成的实例模型。语法格式:
None = 识别器对象.train(src,labels)
  • 参数
-- src:训练图像,用来学习的人脸图像
-- labels:标签,人脸图像对应的标签
  • 代码
recognizer.train(images,np.array(labels))

4. 图像预测

  • **函数predict()**对一个待识别人脸图像进行判断,寻找与当前图像距离最近的人脸图像。
  • 与哪副人脸图像最近,就将当前待测图像标注为该人脸图像对应的标签
  • 若待识别人脸图像与所有人脸图像的距离都大于特定的距离值(阈值),则认为没有找到对应的结果

代码:

label,confidence = recognizer.predict(predict_image)
print('这人是',dic[label])
print('置信度',confidence)
----------------
这人是 yf
置信度 53.49412736939389

返回值:

-- src:需要识别的人脸图像
-- confidence:返回的置信度评分,用来衡量识别结果与原有模型之间的距离

注意!!!:评分越小表示匹配度越高,但若是高于80,则认为识别结果与原有模型差距大。

总结

本篇介绍了如何通过创建LBPH的人脸识别器来进行人脸识别。

标签:LBP,人脸识别,进阶,--,LBPH,cv2,像素,图像
From: https://blog.csdn.net/m0_74896766/article/details/142965720

相关文章

  • 深入解析CSS中的!important规则
    深入解析CSS中的!important规则一、引言在CSS的世界里,样式的优先级通常由选择器的特异性、在样式表中的位置(后来的规则覆盖先前的规则)以及继承等因素决定。然而,!important规则就像一把双刃剑,它可以打破这些规则,赋予某些样式声明更高的优先级。本文将深入探讨!important的......
  • 实验1
    task1:includeincludeincludeincludeusingnamespacestd;//声明//模板函数声明templatevoidoutput(constT&c);//普通函数声明voidtest1();voidtest2();voidtest3();intmain(){cout<<"测试1:\n";test1();cout<<"\n测试2:......
  • C语言程序设计现代方法_读书笔记
    C语言程序设计现代方法第2章C语言基本概念(P10)在C语言中,函数仅仅是一系列组合在一起并且赋予了名字的语句。(P14)一旦变量被赋值,就可以用它来辅助计算其他变量的值。(P17)C语言的一个通用原则:在任何需要数值的地方,都可以使用具有相同类型的表达式。(P19)在C语言中,标识符可......
  • CSS伪元素详解
    CSS伪元素详解一、引言在CSS中,伪元素是一个非常强大的工具,它允许我们为元素的特定部分添加样式,而无需修改HTML结构。这不仅提高了样式的灵活性,还有助于保持代码的整洁和可维护性。本文将深入探讨CSS伪元素的使用方法和一些实用技巧。二、伪元素的基本概念1、伪元素的定......
  • 公交线路查询系统|基于SprinBoot+vue公交线路查询系统(源码+数据库+文档)
    公交线路查询系统目录基于SprinBoot+vue公交线路查询系统一、前言二、系统设计三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专家博主,CSDN平台Ja......
  • 基于离群点修正、优化分解和DLinear模型的多步风速预测方法
    翻译与总结:基于离群点修正、优化分解和DLinear模型的多步风速预测方法翻译:本文提出了一种结合离群点修正、启发式算法、信号分解方法和DLinear模型的混合风速预测模型。该模型包括三个主要步骤:首先,通过 HampelIdentifier(HI) 检测并替换风速序列中的离群点,以减少其对预测......
  • 景区民宿预约|基于SprinBoot+vue景区民宿预约系统(源码+数据库+文档)
    景区民宿预约系统:目录基于SprinBoot+vue景区民宿预约系统一、前言二、系统设计三、系统功能设计 四、界面设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专家博主,CSDN平台Java......
  • JAVA输入输出,运算符
    1.输入输出packagecom.scanner;//1.导包importjava.util.Scanner;publicclassDemo1{publicstaticvoidmain(){print();}//需求:我是一个零基础小白,请帮我写一个程序,可以让用户键盘输入用户名和年龄,然后打印出来。publicstaticvoid......
  • 一. Java“速学通”之基础
    前言        Java急速学习课程是专为那些已经具备一定编程基础的同学设计的高效学习路径。这种学习方法摒弃了繁冗的理论堆砌,转而采用直接明了的代码示例与细致入微的注释来传授知识。每一个核心概念和技巧都通过精心挑选的实战代码片段来阐述,确保学习者能够通过观察......
  • 【数据结构与算法】线性表链式存储结构
    线性表链式存储结构文章目录链式存储结构*头结点和头指针一.线性链表(单链表)1.1定义1.2初始化1.2.1带头结点的初始化1.2.2不带头结点的初始化1.3插入1.3.1按位序插入1.3.2指定结点的后插入操作1.3.3指定结点的前插入操作1.4销毁1.5清空1.6删除1.6.1按位序删除1.6.2指定......