基于局部二值模式(LBP)的人脸识别系统
项目简介
本项目是一个基于MATLAB平台开发的完整人脸识别应用系统。核心算法利用
局部二值模式(Local Binary Patterns, LBP)提取人脸图像的纹理特征,结合
分块空间直方图(Spatial Histogram)保留空间结构信息,并通过
卡方距离(Chi-square Distance)进行相似度度量,实现高效的人脸身份认证。系统包含完整的图形用户界面(GUI),集成了数据加载、模型训练、单样本识别演示及批量测试分析功能。
系统要求
- 开发环境:MATLAB
- 工具箱依赖:基础图像处理工具箱(Image Processing Toolbox)用于图像读取、缩放和直方图均衡化操作。
功能特性
- 交互式GUI界面:提供清晰的操作面板和可视化区域,实时展示识别过程中的原始图、LBP特征图和匹配结果。
- 数据管理:支持加载用户自定义的人脸数据库(按文件夹分类)或生成模拟数据,并自动按 70% / 30% 的比例随机划分训练集和测试集。
- 图像预处理:自动进行灰度转换、尺寸标准化和光照归一化处理。
- 特征提取:采用经典LBP算子结合分块策略,生成高维特征向量。
- 识别与评估:
*
单张测试:随机抽取样本进行识别,可视化展示特征分布及与数据库中最佳匹配项的对比。
*
批量测试:对测试集所有样本进行识别,计算系统整体准确率并绘制距离分布图。
算法实现细节
本项目的主要代码逻辑集中在单一文件中,核心算法的具体实现机制如下:
1. 图像预处理机制
系统在进行特征提取前,对所有输入图像执行标准化的预处理流程:
- 灰度化:若输入为彩色图像,首先转换为灰度图。
- 几何归一化:将所有图像强制缩放至 64x64 像素的标准尺寸,确保特征维度一致。
- 光照归一化:应用全局直方图均衡化(Histogram Equalization),增强图像对比度并减少光照变化对识别结果的影响。
2. LBP 特征提取核心逻辑
代码未直接调用工具箱函数,而是手动实现了高效的向量化LBP算法:
* 在 3x3 的邻域内,将中心像素与周围 8 个邻居像素逐一比较。
* 若邻居像素值大于等于中心像素,标记为1,否则为0。
* 按顺时针方向对二值结果赋权(1, 2, 4, ..., 128),求和得到中心像素的 LBP 编码值(0-255)。
* 代码采用了矩阵位移(Vectorized shifting)的方式代替多层循环,显著提高了计算速度。
- 分块空间直方图(Spatial Histograms):
* 为了保留人脸的空间结构信息,将 64x64 的 LBP 特征图划分为
4x4 的网格,共 16 个子区域(Cells)。
* 对每个子区域计算 256 维的 LBP 统计直方图,并进行归一化处理。
* 最终将这 16 个归一化的直方图首尾连接,形成一个长特征向量(维度为 16 * 256 = 4096维),作为该人脸的全局描述符。
3. 分类与度量方法
- 距离度量:系统实现了卡方距离(Chi-Square Distance)算法,专门用于衡量两个直方图分布之间的差异。相比于欧氏距离,卡方距离在纹理直方图匹配中通常具有更好的性能。
- 分类策略:采用了最近邻分类器(KNN, K=1)。识别时,计算测试样本特征向量与所有训练样本特征向量之间的卡方距离,距离最小的训练样本所属的类别即为预测身份。
4. 数据结构与流程控制
- 全局数据结构:使用
setappdata 和 getappdata 在 GUI 不同回调函数间共享数据结构,包括训练/测试图像集、标签及训练好的特征矩阵 (trainFeatures)。 - 训练流程:遍历训练集图像,预处理后提取 LBP 特征并存储,为后续识别建立特征库。
- 测试流程:对查询图像执行相同的预处理和特征提取,然后在特征库中搜索最佳匹配。
使用方法
- 启动系统:运行主函数,系统界面将初始化并显示。
- 加载数据:
* 点击
"1. 加载人脸数据库" 按钮,选择包含人脸图像的根目录(要求每个子文件夹代表一个人,包含相应的图片)。
* 或者点击
"生成模拟数据" 按钮,系统会尝试生成虚拟数据用于流程演示。
* 系统会自动完成训练集和测试集的随机划分。
- 模型训练:
* 点击
"2. 训练模型" 按钮。
* 系统将提取训练集中所有图像的 LBP 特征。进度条或状态栏会显示当前提取进度。
- 识别测试:
* 点击
"3. 单张识别测试":系统将随机从数据集中选取一张图像,显示其原始图、计算得到的 LBP 特征图、以及数据库中匹配到的最相似人脸,并输出判别结果和卡方距离值。右下方会绘制两个样本的直方图曲线对比。
* 点击
"4. 批量测试与准确率":系统将对预留的测试集进行全量测试,计算整体识别准确率,并在界面下方绘制所有测试样本的匹配距离分布直方图。
备注
- 代码中包含了详细的GUI构建逻辑,使用了
uipanel、uicontrol 和 axes 进行布局。 - 图像读取模块假设目录结构为
根目录/类别名/图片文件。