基于LBP算法的人脸特征提取与识别系统
项目简介
本项目是一个完整的人脸识别系统实现,核心算法基于局部二值模式(Local Binary Patterns, LBP)。系统专注于利用图像的局部纹理纹理特征进行身份验证,能够有效应对光照变化带来的识别难题。该程序集成了从数据准备、图像预处理、纹理特征提取、空间直方图统计到最终特征匹配分类的全流程。
为了确保代码的即时可用性和便于演示,本项目内置了一个合成人脸数据生成器,可以在不依赖外部图像文件的情况下模拟人脸数据集并运行识别流程。
功能特性
- 全流程人脸识别 pipeline:实现了从原始图像到最终身份判定的完整处理链路。
- 内置数据模拟:无需外部数据集,通过数学函数模拟具有特定纹理(如条纹、棋盘格、渐变)的“人脸”数据,并自动添加噪声和光照干扰,用于验证算法的鲁棒性。
- 稳健的特征描述:采用LBP算子捕获微观纹理,结合空间分块策略保留宏观位置信息。
- 抗光照干扰:通过直方图均衡化和LBP本身的灰度不变性,有效抵抗光照强度变化。
- 可视化展示:
*
处理过程可视化:展示原始图、预处理图、LBP纹理图及直方图特征向量。
*
识别结果可视化:动态展示测试样本、其特征图以及匹配到的库内样本,并标记识别成功或失败。
- 距离度量:采用卡方距离(Chi-Square Distance)进行特征比对,相比欧氏距离更适合直方图类型的特征匹配。
系统要求
- MATLAB R2016a 或更高版本
- Image Processing Toolbox(图像处理工具箱)
使用方法
- 确保MATLAB已安装并包含图像处理工具箱。
- 打开MATLAB环境,定位到项目所在目录。
- 直接运行主程序函数。
- 程序将自动开始如下流程:
* 初始化系统参数。
* 生成模拟训练集和测试集。
* 提取训练集特征构建特征库。
* 对测试集进行逐一识别测试。
* 弹出窗口动态显示识别结果。
* 在控制台输出最终的识别准确率。
核心算法与实现细节
本项目代码完全由MATLAB编写,以下是代码内部实现的具体逻辑分析:
1. 数据准备与模拟
程序首先通过内部函数生成模拟数据集,模拟了4个不同身份(Subject),每个身份具有独特的基础纹理模式(如纵向条纹、横向条纹、正弦棋盘格、径向渐变)。
- 变异模拟:为了贴近真实场景,程序在基础纹理上叠加了随机高斯噪声、光照渐变以及微小的位移,确保训练样本和测试样本虽同源但存在差异。
- 数据集划分:默认将60%的数据用于训练(注册),40%的数据用于测试(识别)。
2. 图像预处理管线
在特征提取前,所有图像(训练及测试)均经过统一的预处理步骤:
- 灰度转换:如果输入是彩色图像,转换为灰度图。
- 尺寸归一化:将图像统一缩放到 64x64 像素,确保特征向量维度一致,减少计算量。
- 直方图均衡化:通过
histeq函数增强图像对比度,削弱由于模拟光照带来的整体亮度差异。
3. LBP特征提取原理
程序自定义实现了基础LBP算子。算法遍历图像的每一个非边界像素:
- 邻域采样:以当前像素为中心,选取半径为1的3x3邻域(8个周边像素)。
- 阈值比较:将周围8个像素的灰度值与中心像素值进行比较。若邻域像素大于等于中心像素,标记为1,否则为0。
- 二进制编码:将8个比较结果按特定顺序(顺时针)组成一个8位的二进制数,并转换为十进制(0-255),作为该中心像素的LBP纹理值。
- 最终生成与原图同尺寸的LBP特征图(LBP Map)。
4. 空间直方图特征(Spatial Histogram)
为了保留人脸的空间结构信息(例如眼睛在上方,嘴巴在下方),代码并未直接统计全图直方图,而是采用
分块策略:
- 网格划分:将LBP特征图划分为 8x8 的矩形子块(Grid)。
- 局部统计:计算每个子块内的LBP灰度直方图(256个bin)。
- 局部归一化:对每个子块的直方图进行归一化处理,消除区域大小带来的幅值差异。
- 特征级联:将所有子块的直方图按空间顺序首尾相连,形成一个高维的全局特征向量。
- *特征维数计算*:8(行) × 8(列) × 256(bin) = 16,384维。
5. 分类识别逻辑
在识别阶段,系统采用最近邻分类器(Nearest Neighbor Classifier):
- 特征提取:对待识别的测试图像进行同样的预处理和LBP空间直方图提取。
- 距离度量:计算测试图特征向量与所有特征库模板向量之间的卡方距离(Chi-Square Distance)。
* 代码中使用的公式为:Sum( (x - y)^2 / (x + y + eps) )。
* 卡方距离在衡量两个概率分布(直方图)的相似性方面优于传统的欧氏距离。
- 判决:选取距离最小的训练样本所属的标签作为预测身份。
性能评估
程序运行结束后,会统计正确识别的样本数量,并计算系统的总识别率。结果将以格式化的文本打印在MATLAB命令窗口中。