计算机视觉基础(八)—— LBP特征描述算子之人脸检测

2023-11-09

1 简介

LBP指局部二值模式(Local Binary Pattern),是一种用来描述图像局部特征的算子,具有灰度不变性和旋转不变性等显著优点。LBP常应用于人脸识别和目标检测中,在OpenCV中有使用LBP特征进行人脸识别的接口,也有用LBP特征训练目标检测分类器的方法,OpenCV实现了LBP特征的计算,但没有提供一个单独的计算LBP特征的接口。也就是说OpenCV中使用了LBP算法,但是没有提供函数接口。

2 算法理论介绍

2.1 LBP原理介绍

  LBP特征用图像的局部领域的联合分布 T T T 来描述图像的纹理特征,如果假设局部邻域中像素个数为 P ( P > 1 ) P(P >1) P(P>1),那么纹理特征的联合分布 T T T 可以表述成:
T = t ( g c , g 0 , … , g p − 1 ) p = 0 , … , P − 1 (2-1) T=t\left(g_{c}, g_{0}, \ldots, g_{p-1}\right) \quad p=0, \ldots, P-1\tag{2-1} T=t(gc,g0,,gp1)p=0,,P1(2-1)
  其中, g c g_c gc 表示相应局部邻域的中心像素的灰度值, g p g_p gp 表示以中心像素圆心,以R为半径的圆上的像素的灰度值。
  假设中心像素和局部邻域像素相互独立,那么这里可以将上面定义式写成如下形式:
T = t ( g c , g 0 − g c , … , g p − 1 − g c ) p = 0 , … , P − 1 ≈ t ( g c ) t ( g 0 − g c , … , g p − 1 − g c ) (2-2) \begin{aligned} T &=t\left(g_{c}, g_{0}-g_{c}, \ldots, g_{p-1}-g_{c}\right) \quad p=0, \ldots, P-1 \\ & \approx t\left(g_{c}\right) t\left(g_{0}-g_{c}, \ldots, g_{p-1}-g_{c}\right) \end{aligned}\tag{2-2} T=t(gc,g0gc,,gp1gc)p=0,,P1t(gc)t(g0gc,,gp1gc)(2-2)

  其中 t ( g c ) t(g_c) t(gc)决定了局部区域的整体亮度,对于纹理特征,可以忽略这一项,最终得到:
T ≈ t ( g 0 − g c , … , g p − 1 − g c ) p = 0 , … , P − 1 (2-3) T \approx t\left(g_{0}-g_{c}, \ldots, g_{p-1}-g_{c}\right) \quad p=0, \ldots, P-1\tag{2-3} Tt(g0gc,,gp1gc)p=0,,P1(2-3)
  上式说明,将纹理特征定义为邻域像素和中心像素的差的联合分布函数,因为 g p − g c g_p − g_c gpgc是基本不受亮度均值影响的,所以从上式可以看出,此时统计量T 是一个跟亮度均值,即灰度级无关的值。

  最后定义特征函数如下:
T ≈ t ( s ( g 0 − g c ) , … , s ( g p − 1 − g c ) ) p = 0 , … , P − 1 s ( x ) = { 1 , x ≥ 0 0 , x < 0 (2-4) \begin{array}{l} T \approx t\left(s\left(g_{0}-g_{c}\right), \ldots, s\left(g_{p-1}-g_{c}\right)\right) p=0, \ldots, P-1 \\ s(x)=\left\{\begin{array}{l} 1, x \geq 0 \\ 0, x<0 \end{array}\right. \end{array}\tag{2-4} Tt(s(g0gc),,s(gp1gc))p=0,,P1s(x)={1,x00,x<0(2-4)

  定义灰度级不变LBP为:
L B P P , R = ∑ p = 0 P − 1 s ( g p − g c ) 2 p (2-5) L B P_{P, R}=\sum_{p=0}^{P-1} s\left(g_{p}-g_{c}\right) 2^{p}\tag{2-5} LBPP,R=p=0P1s(gpgc)2p(2-5)
  即二进制编码公式。

通俗解释:
  原始的LBP算子定义在像素 3 ∗ 3 3*3 33的邻域内,以邻域中心像素为阈值,相邻的8个像素的灰度值与邻域中心的像素值进行比较,若周围像素大于中心像素值,则该像素点的位置被标记为1,否则为0。这样, 3 ∗ 3 3*3 33邻域内的8个点经过比较可产生8为二进制数,将这8位二进制数依次排列形成一个二进制数字,这个二进制数字就是中心像素的LBP值,LBP值共有28种可能,因此LBP值有256种可能。中心像素的LBP值反映了该像素周围区域的纹理信息。

注意:计算LBP特征的图像必须是灰度图,如果是彩色图,需要先转换成灰度图


LBP计算示意图

2.2 圆形LBP算子

  基本的 LBP算子的最大缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要。为了适应不同尺度的纹理特征,并达到灰度级和旋转不变性的要求,Ojala等对 LBP算子进行了改进,将 3×3邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,改进后的 LBP算子允许在半径为 R的圆形邻域内有任意多个像素点。从而得到了诸如半径为R的圆形区域内含有P个采样点的LBP算子,表示为 L B P P R LBP^{R}_P LBPPR


圆形LBP示意图
    对于给定中心点$(x_c,y_c)$,其邻域像素位置为$(x_p,y_p)$,$p∈P$,其采样点$(x_p,y_p)$用如下公式计算:

x p = x c + Rcos ⁡ ( 2 π p P ) y p = y c + Rsin ⁡ ( 2 π p P ) (2-6) \begin{array}{l} x_{p}=x_{c}+\operatorname{Rcos}\left(\frac{2 \pi p}{P}\right) \\ y_{p}=y_{c}+\operatorname{Rsin}\left(\frac{2 \pi p}{P}\right) \end{array}\tag{2-6} xp=xc+Rcos(P2πp)yp=yc+Rsin(P2πp)(2-6)
  R是采样半径,p是第p个采样点,P是采样数目。如果近邻点不在整数位置上,就需要进行插值运算,可以参考这篇博客 OpenCV框架下的插值算法

2.3 LBP旋转不变性及等价模式

  LPB特征是灰度不变,但不是旋转不变的,同一幅图像,进行旋转以后,其特征将会有很大的差别,影响匹配的精度。Ojala在LBP算法上,进行改进,实现了具有旋转不变性的LPB的特征。
  实现方法:不断旋转圆形邻域得到一系列初始定义的LPB值,取最小值作为该邻域的值。
L B P P R r i = min ⁡ ( R O R ( L B P P , R r i , i ) ∣ i = 0 , 1 , … , P − 1 ) (2-7) L B P_{P R}^{ri}=\min \left(R O R\left(L B P_{P, R}^{ri}, i\right) | i=0,1, \ldots, P-1\right)\tag{2-7} LBPPRri=min(ROR(LBPP,Rri,i)i=0,1,,P1)(2-7)
  其中 L B P P R r i L B P_{P R}^{ri} LBPPRri表示具有旋转不变性的LBP特征。 R O R ( x , i ) ROR(x, i) ROR(x,i)为旋转函数,表示将 x x x右循环 i i i位。


求取旋转不变的LPB特征示意图

等价模式:
  一个LBP算子可以产生不同的二进制模式,对于 L B P p R LBP^{R}_p LBPpR将会产生 2 p 2^p 2p种模式。比如 7 ∗ 7 7*7 77邻域内有 2 36 2^{36} 236种模式。如此多的二值模式对于信息的提取和识别都是不利的。
  Ojala等认为,在实际图像中,绝大多数LPB模式最多只包含两次从1到0或从0到1的跳变。

等价模式:当某个局部二进制模式所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该局部二进制模式所对应的二进制就称为一个等价模式。
  比如:00000000,11111111,11110010,10111111都是等价模式。
  检查某种模式是否是等价模式:
U ( G p ) = ∣ s ( g p − 1 − g c ) − s ( g 0 − g c ) ∣ + ∑ p = 1 P − 1 ∣ s ( g p − g c ) − s ( g P − 1 − g c ) ∣ (2-8) U\left(G_{p}\right)=\left|s\left(g_{p_{-1}}-g_{c}\right)-s\left(g_{0}-g_{c}\right)\right|+\sum_{p=1}^{P_{-1}}\left|s\left(g_{p}-g_{c}\right)-s\left(g_{P-1}-g_{c}\right)\right|\tag{2-8} U(Gp)=s(gp1gc)s(g0gc)+p=1P1s(gpgc)s(gP1gc)(2-8)
  将其和其移动一位后的二进制模式按位相减。并绝对值求和。若U ( G p ) \left(G_{p}\right) (Gp) 小于等于2,则为等价模式。
  混合模式:除了等价模式之外的称为混合模式。
  改进后的LPB模式数由2 p ^{p} p(p为邻域集内的采集点数 ) 降维为 p ∗ ( p − 1 ) + 2 p*(p-1)+2 p(p1)+2 。维数减少,可以降低高频噪声的影响。Ojala认为等价模式占总模式中的绝大数。图2.4 ( a ), ( b ), ( c )等价模式分别占88%,93%和76%。


    可以通过低通滤波的方法来增强等价模式所占的比例。图( c )经过高斯滤波后,其等价模式所占比可以增加到90%。

2.4 人脸检测流程

  人脸检测过程采用多尺度滑窗搜索方式,每个尺度通过一定步长截取大小为20x20的窗口,然后将窗口放到分类器中进行是不是人脸的判决,如果是人脸则该窗口通过所有分类器;反之,会在某一级分类器被排除。


图 2.3.5 人脸检测流程图

2.4 基于OpenCV的实现

python

  • 使用OpenCV的LBP于预训练模型
  • 将haarcascade_frontalface_default.xml下载至本地以方便调用,下载链接:https://github.com/opencv/opencv/blob/master/data/lbpcascades/lbpcascade_frontalface_improved.xml
#coding:utf-8
import cv2 as cv
# 读取原始图像
img= cv.imread('*.png')
#face_detect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
face_detect = cv.CascadeClassifier("lbpcascade_frontalface_improved.xml")
# 检测人脸
# 灰度处理
gray = cv.cvtColor(img, code=cv.COLOR_BGR2GRAY)
# 检查人脸 按照1.1倍放到 周围最小像素为5
face_zone = face_detect.detectMultiScale(gray, scaleFactor = 2, minNeighbors = 2) # maxSize = (55,55)
print ('识别人脸的信息:\n',face_zone)
# 绘制矩形和圆形检测人脸
for x, y, w, h in face_zone:
    # 绘制矩形人脸区域
    cv.rectangle(img, pt1 = (x, y), pt2 = (x+w, y+h), color = [0,0,255], thickness=2)
    # 绘制圆形人脸区域 radius表示半径
    cv.circle(img, center = (x + w//2, y + h//2), radius = w//2, color = [0,255,0], thickness = 2)
# 设置图片可以手动调节大小
cv.namedWindow("Easmount-CSDN", 0)
# 显示图片
cv.imshow("Easmount-CSDN", img)
# 等待显示 设置任意键退出程序
cv.waitKey(0)
cv.destroyAllWindows()

关于Datawhale

Datawhale是一个专注于数据科学与AI领域的开源组织,汇集了众多领域院校和知名企业的优秀学习者,聚合了一群有开源精神和探索精神的团队成员。Datawhale以“for the learner,和学习者一起成长”为愿景,鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机视觉基础(八)—— LBP特征描述算子之人脸检测 的相关文章

随机推荐

  • 基于Spark的分布式数据处理和机器学习技术【上进小菜猪大数据】

    上进小菜猪 沈工大软件工程专业 爱好敲代码 持续输出干货 大数据已经成为当今社会中一个重要的资源和挑战 随着数据规模的不断增长 如何高效地处理和分析这些数据成为了一个关键问题 本文将介绍基于Apache Spark的分布式数据处理和机器学习
  • 【机器学习】通俗易懂决策树(原理篇)

    决策树 引言 决策树是什么 怎样利用决策树来帮助我们分类 怎样构建自己的决策树 决策树是一种类似流程图的结构 其中每个内部节点代表一个属性的 测试 例如硬币翻转出现正面朝上或反面朝上 每个分支代表测试的结果 每个叶节点代表一个类标签 在计算
  • flutter_tools/gradle/app_plugin_loader.gradle‘ as it does not exist

    背景 flutter 1 17 hotfix5 因为使用flutter crate 来创建新项目的 在之前的windows电脑能够正常运行 但是在mac电脑上死活运行不上去 查了很久 github上也查看了相关issuer 发现解决问题的方
  • MPP数据库简介及架构分析

    目录 什么是MPP 特性 并行处理 超大规模 数据仓库真正适合什么 典型的分析工作量 数据集中化 线性可伸缩性 MPP架构技术特性 数据库架构分析 Shared Everything Shared Disk Share Memory Sha
  • elastic weight consolidation

    GitHub kuc2477 pytorch ewc Unofficial PyTorch implementation of DeepMind s PNAS 2017 paper Overcoming Catastrophic Forge
  • Springboot简单实现用户登录操作

    从0开始开发SpringBoot vue前后端分离项目 文章目录 从0开始开发SpringBoot vue前后端分离项目 一 创建Springboot项目 二 引入依赖 三 插件推荐 1 Mybatis Log Free 2 Free My
  • c# 代码实现通过域名获取IPV4地址

    c 代码实现通过域名获取IPV4地址 IPHostEntry iPHostEntry Dns GetHostByName www baidu com IPAddress ip iPHostEntry AddressList 0 label1
  • 每日一题(两数相加)

    每日一题 两数相加 2 两数相加 力扣 LeetCode 思路 思路 由于链表从头开始向后存储的是低权值位的数据 所以只需要两个指针p1和p2 分别从链表的头节点开始遍历 同时创建一个新的指针newhead 用于构造新链表 将创建的新节点进
  • 交换两数(不使用中间变量)

    引出问题 说到交换两数的值 对大家来说应该是一个非常简单的任务 但是 我们最常用的方法就是创建一个临时变量 再通过这个临时变量来改变两值 如下 int temp a a b b temp 但是 难道交换两个变量就只有这一种做法吗 方法1 其
  • IntelliJ IDEA写JSP文件出现“cannot resolve method”解决办法

    最近在使用IDEA写JSP文件的时候 有些内置对象出现了cannot resolve method的警告提示 代码运行没有问题 在编写的时候也不会提示 最后请教了万能的搜索引擎 解决了此问题 解决办法 该错误的导致的原因是因为没有在项目中添
  • 利用 Android Studio 和 Gradle 打包多版本APK( applicationIdSuffix)

    在项目开发过程中 经常会有需要打包不同版本的 APK 的需求 比如 debug版 release版 dev版等等 有时候不同的版本中使用到的不同的服务端api域名也不相同 比如 debug api com release api com d
  • Node.js到底是什么?

    前言 Node js是一个基于Chrome V8引擎的JavaScript运行环境 JavaScript是脚本语言 脚本语言需要一个解析器 运行环境 才能运行 若运行在浏览器中 则浏览器就是JavaScript的解析器 运行环境 而对于独立
  • Spark数据分析之pyspark

    Spark数据分析之pyspark 一 大数据简史 从hadoop到Spark 1 hadoop的出现 1 问题 1990年 电商爆发以及机器产生了大量数据 单一的系统无法承担 2 办法 为了解决 1 的问题许多公司 尤其是大公司领导了普通
  • 【VUE】拖动侧边栏以便自由调整左右两侧的宽度

    效果 1 拖动前 2 拖动后 主要代码
  • Python 爬虫爬取豆瓣读书小说类前十页标签

    呜呜呜 小白的爬虫之路 留个记录 一 导入库 import requests from bs4 import BeautifulSoup import sqlite3 二 获取豆瓣读书小说类1 10页网址 获取分页的地址 root url
  • 关于Jquery中ajax方法data参数用法的总结

    data 发送到服务器的数据 将自动转换为请求字符串格式 GET 请求中将附加在 URL 后 查看 processData 选项说明以禁止此自动转换 必须为 Key Value 格式 如果为数组 jQuery 将自动为不同值对应同一个名称
  • 高级API(UDP连接&Map集合&Collection集合)

    UDP协议 DatagramSocket 该对象可以代表接收端也可以代表发送端 DatagramPacket 数据打包对象 数据报对象 将发送的内容通过该对象进行打包 在通过指定的方法将该对象进行传输 1 通过DatagramSocket建
  • STM32学习笔记—I2C通信

    1 I2C介绍 2 I2C通讯过程介绍 3 函数配置 4 代码 1 I2C介绍 i2c总线是nxp公司 philp公司 开发的两线式串行总线 用于连接微控制器及外围设备 它是由数据线SDA和时钟线SCL构成 我们平常使用还会加上一个供电即v
  • Centos下安装gitolite+git

    一直以来我都是用SVN的 但最近做迭代开发 多分支时 发现SVN使用起来极不方便 因此打算换成git做源码管理 git的理论以及特性本文就不做讲解了 本主主要讲解怎么安装 配置git 以及git权限管理服务gitolite 组网结构 git
  • 计算机视觉基础(八)—— LBP特征描述算子之人脸检测

    1 简介 LBP指局部二值模式 Local Binary Pattern 是一种用来描述图像局部特征的算子 具有灰度不变性和旋转不变性等显著优点 LBP常应用于人脸识别和目标检测中 在OpenCV中有使用LBP特征进行人脸识别的接口 也有用