基于MATLAB的局部二值模式(LBP)特征提取与图像分析系统
项目简介
本项目是一个基于MATLAB环境开发的图像纹理特征提取系统,旨在完整实现局部二值模式(Local Binary Pattern, LBP)算法。该系统集成了图像读取、预处理、LBP特征计算、直方图统计以及结果可视化等功能。通过高效的矢量化矩阵运算,系统能够快速生成反映图像局部纹理结构的特征图及统计直方图,适用于纹理分析、计算机视觉教学及算法验证。
功能特性
- 灵活的图像输入:支持用户交互式选择多种格式的图像文件(.jpg, .png, .bmp, .tif等),若用户取消选择,系统具备自动加载内置示例图像(peppers.png)的容错机制。
- 自动图像预处理:能够自动检测输入图像的通道数,将彩色RGB图像转换为灰度空间的双精度矩阵,确保算法处理的一致性。
- 高效的算法实现:核心LBP算法采用矢量化编程(Vectorized Implementation),避免了低效的像素级循环,显著提升了特征提取的计算速度。
- 特征统计分析:自动计算LBP特征的归一化直方图,剔除边缘无效像素的影响,生成具有旋转不变性和灰度不变性特性的统计描述符。
- 全方位可视化:提供2x2的综合展示窗口,同步显示原始图像、灰度预处理图像、LBP纹理特征图以及LBP特征直方图。
系统要求
- MATLAB R2016b 或更高版本
- Image Processing Toolbox(用于图像读取与基本的灰度转换)
使用方法
- 将项目代码保存为
main.m 文件。 - 在MATLAB命令窗口中输入
main 并回车运行。 - 在弹出的文件选择对话框中选择一张图片。
- 系统将自动进行处理,并在控制台输出处理进度、图像尺寸、计算耗时及部分特征向量数据。
- 查看弹出的图形窗口,分析图像的纹理特征分布。
---
核心算法与代码实现详解
本项目在 main.m 中通过模块化设计实现了完整的LBP流程,具体实现逻辑如下:
1. 图像读取与预处理模块
- 交互式输入:通过标准对话框获取文件路径,逻辑判断能够处理用户取消操作的情况。
- 灰度转换:算法核心依赖于亮度比较,因此代码首先判断图像维度。若为三通道(RGB),使用加权平均法转换为灰度图;若为单通道,则直接转换为
double 类型以进行后续的高精度计算。
2. LBP核心特征提取(矢量化实现)
核心函数
computeLBP_Vectorized 摈弃了传统的双重
for 循环遍历像素的方法,采用了矩阵整体位移的
矢量化计算策略,极大提高了MATLAB下的运行效率。
- 算子定义:采用经典的基础LBP算子,定义了3x3邻域内的8个采样点。
- 权重分配:按照特定顺序(左上、上、右上、右、右下、下、左下、左)为8个邻域像素分配二进制权重(128, 64, 32...1),对应二进制的第7位到第0位。
- 矩阵位移逻辑:
* 代码提取图像的中心区域矩阵(去除1像素边缘)。
* 针对8个方向,分别提取对应的邻域矩阵。
*
阈值化:将邻域矩阵与中心矩阵进行比较操作(
neighborImg >= centerImg),生成逻辑矩阵(0或1)。
*
加权累加:将逻辑矩阵乘以对应的权重值,并累加到结果矩阵中,最终得到LBP特征图。
- 边缘处理:最终输出的LBP图保持与原图尺寸一致,图像四周无法计算的1像素边缘填充为0。
3. 特征统计与描述(直方图计算)
为了量化纹理特征,
computeLBPHistogram 函数对生成的LBP图进行统计:
- 有效区域提取:代码显式执行了裁剪操作,提取LBP特征图的内部有效区域(
2:rows-1, 2:cols-1),排除了边缘填充0对统计结果的干扰。 - 直方图统计:在0到255的范围内统计各LBP值的出现频次。
- 归一化:将频次除以像素总数,计算出概率密度,使得特征向量具有尺度不变性,便于不同分辨率图像之间的对比。
4. 结果可视化
主程序最后构建了一个包含四个子图的图形窗口:
- 子图1:展示原始输入图像。
- 子图2:展示预处理后的灰度图像,直观反映亮度分布。
- 子图3:展示生成的LBP特征图,利用灰度值(0-255)可视化局部纹理模式。
- 子图4:绘制LBP特征直方图(Bar Chart),横轴代表256种纹理模式,纵轴代表归一化频率,清晰展示了图像中纹理的分布规律。