图像处理Task02 —— LBP特征描述算子-人脸检测(基于OpenCV)

图像处理Task02 —— LBP特征描述算子-人脸检测(基于OpenCV)

2.1 简介

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

2.2 学习目标

  • 了解人脸检测相关流程
  • 理解LBP算法相关原理
  • 掌握基于OpenCV的LBP算法实现

2.3 具体内容

2.3.1 人脸检测的相关流程

人脸识别技术是基于人的脸部特征,对输入的人脸图象或者视频流 。 首先判断其是否存在人脸 ,如果存在人脸,则进一步的给出每个脸的位置、大小和各个主要面部器官的位置信息。并依据这些信息,进一步提取每个人脸中所蕴涵的身份特征,并将其与已知的人脸进行对比,从而识别每个人脸的身份。
人脸识别技术原理分析
人脸识别主要分为人脸检测(face detection)、特征提取(feature extraction)和人脸识别(face recognition)三个过程。

  • 人脸检测:人脸检测是指从输入图像中检测并提取人脸图像,通常采用haar特征和Adaboost算法 训练级联分类器对图像中的每一块进行分类。如果某一矩形区域通过了级联分类器,则被判别为人脸图像。

  • 特征提取:特征提取是指通过一些数字来表征人脸信息,这些数字就是我们要提取的特征。

常见的人脸特征分为两类,一类是几何特征,另一类是表征特征。几何特征是指眼睛、鼻子和嘴等面部特征之间的几何关系,如距离、面积和角度等。由于算法利用了一些直观的特征,计算量小。

不过,由于其所需的特征点不能精确选择,限制了它的应用范围。另外,当光照变化、人脸有外物遮挡、面部表情变化时,特征变化较大。所以说,这类算法只适合于人脸图像的粗略识别,无法在实际中应用。

表征特征利用人脸图像的灰度信息,通过一些算法提取全局或局部特征。其中比较常用的特征提取算法是LBP算法。LBP方法首先将 图像分成若干区域,在每个区域的像素640x960邻域中用中心值作阈值化,将结果看成是二进制数。
在这里插入图片描述
人脸检测过程采用多尺度滑窗搜索方式,每个尺度通过一定步长截取大小为20x20的窗口,然后将窗口放到分类器中进行是不是人脸的判决,如果是人脸则该窗口通过所有分类器;反之,会在某一级分类器被排除。

在这里插入图片描述

2.3.2 LBP算法相关原理

(1) 原始的LBP算子定义为在3x3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3x3邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像素点的LBP值,并用这个值来反映该区域的纹理信息。如下图所示:
注意:计算LBP特征的图像必须是灰度图,如果是彩色图,需要先转换成灰度图
在这里插入图片描述
(2) 圆形LBP算子
基本的 LBP 算子的最大缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要。为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求,Ojala 等对 LBP 算子进行了改进,将 3×3 邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,改进后的 LBP 算子允许在半径为 R 的圆形邻域内有任意多个像素点。从而得到了诸如半径为R的圆形区域内含有P个采样点的LBP算子;
在这里插入图片描述
(3) LBP旋转不变性及等价模式
LPB特征是灰度不变,但不是旋转不变的,同一幅图像,进行旋转以后,其特征将会有很大的差别,影响匹配的精度。Ojala在LBP算法上,进行改进,实现了具有旋转不变性的LPB的特征。
图 2.5 给出了求取旋转不变的 LBP 的过程示意图,图中算子下方的数字表示该算子对应的 LBP 值,图中所示的 8 种 LBP模式,经过旋转不变的处理,最终得到的具有旋转不变性的 LBP 值为 15。也就是说,图中的 8 种 LBP 模式对应的旋转不变的 LBP 模式都是00001111。
在这里插入图片描述
等价模式:
一个LBP算子可以产生不同的二进制模式,对于半径为R的圆形区域内含有P个采样点的LBP算子将会产生P2 种模式。很显然,随着邻域集内采样点数的增加,二进制模式的种类是急剧增加的。例如:5×5邻域内20个采样点,有220=1,048,576种二进制模式。如此多的二值模式无论对于纹理的提取还是对于纹理的识别、分类及信息的存取都是不利的。同时,过多的模式种类对于纹理的表达是不利的。例如,将LBP算子用于纹理分类或人脸识别时,常采用LBP模式的统计直方图来表达图像的信息,而较多的模式种类将使得数据量过大,且直方图过于稀疏。因此,需要对原始的LBP模式进行降维,使得数据量减少的情况下能最好的代表图像的信息。
为了解决二进制模式过多的问题,提高统计性,Ojala提出了采用一种“等价模式”(Uniform Pattern)来对LBP算子的模式种类进行降维。Ojala等认为,在实际图像中,绝大多数LBP模式最多只包含两次从1到0或从0到1的跳变。
等价模式:当某个局部二进制模式所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该局部二进制模式所对应的二进制就称为一个等价模式。
比如:00000000,11111111,11110010,10111111都是等价模式。
除等价模式类以外的模式都归为另一类,称为混合模式类,例如10010111(共四次跳变)

2.3.3 基于OpenCV的实现

将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('4.jpeg')

face_detect = cv.CascadeClassifier("haarcascade_frontalface_default.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()
  • 原图
    在这里插入图片描述
  • 结果图
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值