项目实践|如何在较暗环境进行人脸检测?

本文介绍了如何在光照不足的环境下进行人脸检测,重点探讨了LBP(Local Binary Pattern)特征的作用。LBP对光照变化具有鲁棒性,可用于减弱光照不均匀对人脸识别的影响。文章详细讲解了基本LBP、圆形邻域LBP算子、旋转不变的LBP算子和统一化的LBP算子,并通过案例展示了在实际图像中应用这些方法进行人脸检测的过程。
摘要由CSDN通过智能技术生成

↑↑↑关注后"星标"Datawhale

每日干货 & 每月组队学习,不错过

 Datawhale干货 

作者:游璐颖,Datawhale优秀学习者,福州大学

计算机视觉在人脸检测领域的应用已经较为成熟,但依然存在较多难点。其中一大难点是光照问题,由于人脸的3D结构,光照投射出的阴影,会加强或减弱原有的人脸特征。如何解决光照问题对人脸检测带来的影响呢?

(本图在较暗环境下拍摄,利用LBP特征的人脸检测后,有效识别了图片中的小姐姐)

LBP特征是常用的方法之一,该方法对诸如光照变化等造成的灰度变化具有较强的鲁棒性,可以减弱光照不均匀对于人脸识别的影响。很多学者都采用adaboost+LBP的方式解决人脸识别问题,被誉为“万能算法”。具体本文将详细讲解:

本文目录:   

    1. 基本LBP

  • 1.1 概念理解

    1.2 主要步骤

    2. 圆形领域的LBP算子

  • 2.1 概念理解

    2.2 计算方法

    3. 旋转不变的LBP算子

    4. 统一化的LBP算子

  • 4.1 理论基础

    4.2 统一化的意义

    4.3 收集箱个数计算

    5. 案例实战

  • 5.1 读取图片

    5.2 加载级联文件

    5.3 人脸检测

    5.4 处理脏数据

一、基本LBP

1.1 概念理解

LBP算子的基本思想是将中心像素的灰度值作为一个阈值,将其邻域内的像素点灰度值进行比较,从而得到二进制编码表示,来表示局部纹理特征。

邻域的类型可分为四邻域、D邻域、八邻域。

  • 四邻域:该像素点的上下左右四个位置;

  • D领域:该像素点斜对角线上的四个相邻位置。

  • 八邻域:四邻域与D邻域的并集。

  • 基本的LBP算子考虑的是像素的八邻域。

LBP表示方法有一个较为明显的特点,它不容易收到图像整体灰度线性变化的影响。也就是说,当图像由于光线的影响使得整体灰度值发生线性均匀变化时,其LBP特征编码是不变的。换句话说,它并不在意整体的灰度变化,而是关注像素之间的相对灰度改变。

例如,在某些情况下,阳光照射强度更低,导致拍摄图像的整体亮度降低,但是实际上每个像素之间的差值仍然是固定的。那么在这种情况下,在图片亮度对LBP特征编码无影响。

1.2 主要步骤

使用一个3*3的矩形,处理待判断像素点及其邻域之间的关系。

步骤1:二值化过程

将像素点A的值与其八邻域处的像素点逐一比较:

  1. 如果A的像素值大于其邻近点的像素值,则得到0。

  2. 如果A的像素值小于其邻近点的像素值,则得到1。

此过程以中心像素的灰度值为阈值,与邻域的8个灰度值进行比较。

最后,根据顺时针方向,将像素点A与周围8个像素点比较所得到的0、1值连接起来,得到一个8位的二进制序列,然后将该二进制序列转换为十进制数字作为点A的LBP值。

如下图LBP原理示意图所示,在左侧 的区域中,中心点的像素为76,并设置它为此次的阈值。然后现在我们对该中心点的8邻域做进一步的处理。

  • 将中心点周围的8个位置中灰度值大于76的像素点处理为1。例如,其邻域中像素值为128、251、99、213的点,都被处理为1,填入对应的像素点位置上。

  • 将中心点周围的8个位置中灰度值值小于76的像素点处理为0。例如,其邻域中像素值为36、9、11、48的点,都被处理为0,填入对应的像素点位置上。

  • 最后得到的二值结果如右图所示。

步骤2:中心点处理

完成上述的二值化过程之后,例如从像素点的正上方开始将得到的二值结果进行序列化,所以在上述例子中,二进制序列结果为“01011001”。

最后再将该二进制序列结果转换为对应的十进制数“89”,作为当前中心点的像素值,如下图所示。

步骤3:整合处理

上述过程仅仅是对一个像素点的处理过程,结果是一个LBP“编码”。所以对于某幅图像而言,需要进行逐行扫描完成每个像素点数值的更新。我们将采用分块的形式进行编码。其编码过程如下:

假设此时有一幅100*100大小的图像。

  1. 在初始化时,将该图划分为10*10个Block,其中每个Block的大小为10*10。

  2. 对每个Block的像素点提取其LBP特征,并建立一个计算某个“数字”出现的频率统计直方图。

  3. 结束时,将生成10*10个统计直方图,选择性地对直方图进行规范化处理。

  4. 连接所有小块的(规范化的)直方图,整合后构成了整个窗口的特征向量,用来描述这幅图片。

  5. 得到特征向量之后,就可以使用各类算法对该图像进行特定的处理了。

二、圆形邻域的LBP算子

2.1 概念理解

基本LBP算子可以被进一步推广到使用不同大小和形状的邻域。采用圆形的邻域并结合双线性插值运算使得我们可以获得任意半径和任意数目的邻域像素点。该圆形邻域可以用 表示,其中P表示圆形邻域内参与运算的像素点个数,R表示邻域的半径。

2.2 计算方法

假设此时给出了一个半径为2的8邻域像素的圆形邻域,图中每个方格对应一个像素。

  1. 处在方格中心的邻域点(左、上、右、下4个黑点):以该点所在方格的像素值作为它的值

  2. 不在方格中心的邻域点(斜45°方向的4个黑点&#

OpenCV进行人脸检测主要依赖于级联分类器(Cascading Classifier)。级联分类器是一种机器学习方法,它可以用来快速检测图像中的特定对象。在人脸检测中,OpenCV提供了预训练的人脸检测分类器,这些分类器通常使用Haar特征或深度学习模型。下面是一个使用OpenCV进行人脸检测的基本步骤: 1. 安装OpenCV:首先需要在你的开发环境中安装OpenCV库。如果你使用的是Python,可以通过pip命令安装: ```bash pip install opencv-python ``` 2. 加载人脸检测模型:使用OpenCV自带的预训练级联分类器,通常是`haarcascade_frontalface_default.xml`。 3. 读取图像:使用OpenCV读取需要进行人脸检测的图像。 4. 进行人脸检测:使用级联分类器的`detectMultiScale`方法对图像进行人脸区域的检测。该方法会返回检测到的人脸区域的矩形框。 5. 在原图上绘制矩形框:遍历检测到的人脸区域,使用OpenCV的绘图函数在人脸区域周围绘制矩形框。 下面是一个简单的Python代码示例: ```python import cv2 # 加载级联分类器 face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') # 读取图像 image = cv2.imread('path_to_image.jpg') # 进行人脸检测 faces = face_cascade.detectMultiScale(image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) # 在检测到的人脸周围绘制矩形框 for (x, y, w, h) in faces: cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2) # 显示图像 cv2.imshow('Faces found', image) cv2.waitKey(0) # 关闭窗口 cv2.destroyAllWindows() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值