基于MATLAB的智能车牌自动识别系统
1. 项目介绍
本项目是一个基于MATLAB平台开发的车辆牌照识别应用程序。该系统旨在通过数字图像处理技术,将包含车牌的车辆图像转化为可编辑的文本字符。程序采用“单一脚本、自包含”的设计理念,不仅实现了从图像预处理、车牌定位、字符分割到字符识别的全流程,还具备自我生成字符模板库的能力,无需依赖外部训练数据集或模板文件即可运行。
系统特别针对常见的蓝底白字车牌进行了优化,并提供了详细的分步可视化界面,非常适合用于理解计算机视觉在智能交通系统(ITS)中的基本工作原理。
2. 功能特性
- 全流程图像处理:涵盖图像加载、灰度化、去噪、边缘检测、二值化、分割及识别。
- 可视化交互界面:通过统一的Figure窗口展示9个关键处理步骤的中间结果,直观呈现算法运行过程。
- 鲁棒的车牌定位策略:采用“边缘检测+形态学”为主,辅助以“HSV颜色空间分析”的双重定位策略,在光照不均或边缘模糊时自动切换算法,提高定位成功率。
- 自适应字符分割:利用垂直投影法结合波谷检测,能够适应不同宽度的字符间隔。
- 动态模板生成技术:程序不依赖外部模板图片,而是在运行时通过代码动态绘制字符并转换为位图及其内存模板,极大地简化了项目部署(无需管理大量模板文件)。
- 相关性匹配识别:基于二维相关系数(Correlation Coefficient)进行模板匹配,具有较好的抗干扰能力。
3. 系统要求
- 运行环境:MATLAB R2016a 及以上版本
- 工具箱依赖:Image Processing Toolbox(图像处理工具箱)
* 必须包含
edge,
strel,
imclose,
regionprops,
imbinarize,
corr2 等基础函数。
- 硬件要求:建议 4GB 以上内存,普通PC即可运行。
4. 使用方法
- 启动MATLAB,将工作路径切换到脚本所在目录。
- 在命令行窗口输入主函数名称并回车运行。
- 程序将弹出文件选择对话框,请选择一张包含清晰车牌的图片(支持 JPG, PNG, BMP, TIF 格式)。
- 系统将自动弹出一个名为“智能车牌识别系统”的窗口,按顺序展示处理过程,并在最终弹出对话框显示识别结果。
5. 实现功能与逻辑详解
本系统的核心逻辑完全包含在主入口函数及其子函数中,具体实现步骤如下:
第一阶段:图像输入与预处理
程序首先通过图形化界面引导用户选择图片,并进行防错处理。
- 尺寸归一化:为了统一后续处理参数并提升速度,脚本会检查图片宽度,若超过800像素则按比例缩小。
- 灰度与降噪:将彩色图像转换为灰度图,并使用 3x3 的中值滤波(Median Filter)去除椒盐噪声,保留边缘信息。
第二阶段:车牌区域定位(核心算法)
系统实现了两种定位逻辑,优先使用边缘检测,失败时启用颜色检测。
* 使用 Sobel 算子检测垂直边缘,因为车牌区域具有密集的垂直纹理。
* 通过形态学闭运算(使用扁长矩形结构元素)将分散的边缘连成连通域。
* 执行孔洞填充和小面积噪点移除。
*
几何筛选:通过
regionprops 分析连通域的包围盒(BoundingBox),筛选长宽比在 2.2 到 6 之间且面积最大的区域作为车牌。
* 当上述方法未检测到有效区域时,程序自动转换到HSV色彩空间。
* 根据蓝色车牌的色调(H)、饱和度(S)和亮度(V)阈值提取掩模。
* 选取掩模中面积最大的区域作为车牌。
- 裁剪:根据定位坐标从原图中裁剪出车牌区域,并在原图上绘制红框标识。
第三阶段:二值化与精细处理
对裁剪出的车牌进行字符提取前的准备。
- Otsu二值化:自适应计算阈值,将车牌转为黑白二值图像。
- 像素反转逻辑:统计白色像素占比,确保处理后的图像背景为黑色,文字为白色(若原图为白底黑字或反转,程序会自动纠正)。
- 边缘清理:移除车牌边框、铆钉等小面积干扰噪点。
第四阶段:字符分割
采用基于投影的分割算法将车牌切割为独立字符。
- 垂直投影:统计二值图像每一列的白色像素数量,形成投影曲线。
- 曲线平滑:通过移动平均算法平滑投影曲线,消除锯齿干扰。
- 波谷分割:设定阈值(平均值的20%),在投影曲线上寻找连续的非零波峰区域。
- 字符提取:根据波峰的起止坐标切割字符,并去除单个字符上下的空白黑边。
- 归一化:将所有分割出的字符图像强制缩放为 40x20 像素的标准尺寸,以便于模板匹配。
第五阶段:字符识别
* 程序中定义了一个特殊的子函数,它不读取硬盘文件,而是创建一个不可见的绘图窗口。
* 将预定义的字符集(0-9, A-Z, 汉字)绘制在窗口中,然后截取这些绘制内容作为标准模板。
* 这种方法保证了代码的极度轻量化和字体的标准性。
* 将待识别的字符图像与内存中的每一个模板进行比对。
* 算法使用二维相关系数(
corr2)计算相似度。
* 选取相关系数最高的模板对应的字符作为识别结果。
- 位置启发式策略:代码中预留了基于字符位置的逻辑(例如第一位倾向于匹配汉字,第二位倾向于匹配字母),以提高识别准确率。
6. 代码关键函数解析
- main():程序主入口,负责整体流程控制、GUI绘图布局及结果输出。
- smooth_curve(y):自定义算法,用于平滑垂直投影的波形,防止因噪点导致的错误分割。
- find_segments(proj, width):核心分割逻辑,负责根据投影值和阈值判定字符的起始列和终止列,并过滤掉过窄的无效分割(如车牌边框残留)。
- generate_template_library(h, w):无需素材包的“黑科技”函数,通过代码动态生成标准字符位图,并存入
containers.Map 供匹配使用。 - match_character(...):识别引擎,遍历模板库计算最佳匹配项。