1. 项目概述
上周帮室友调试他的毕业设计项目——基于MATLAB的车牌识别系统。这个看似简单的demo在实际实现过程中遇到了不少坑,从图像预处理到字符识别,每个环节都需要精细调参。经过一周的反复测试,最终实现了一个稳定运行的版本,识别准确率达到87.5%(测试样本8张,正确识别7张)。本文将完整呈现整个实现流程,包括所有关键代码和调试经验。
车牌识别系统本质上是一个典型的模式识别问题,核心流程可分为五个阶段:图像采集→预处理→车牌定位→字符分割→字符识别。每个阶段都有其技术难点和解决方案,下面我将结合具体代码和实际测试结果详细说明。
提示:本文所有代码均在MATLAB R2021b环境下测试通过,建议使用相同或更高版本运行。完整项目文件包含测试图片和字符模板,可在文末提供的GitHub链接获取。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 图像预处理实战
2.1 图像读取与去噪处理
原始车牌图像往往存在多种噪声干扰,如拍摄时的运动模糊、传感器噪声、光照不均等。我们首先使用imread函数读取图像:
matlab复制% 读取原始图像(替换为你的图片路径)
car_img = imread('car_plate.jpg');
figure; imshow(car_img); title('原始车牌图像');
在实测中发现,直接对原始图像进行边缘检测会导致大量噪声干扰。我们对比了三种去噪方法:
- 均值滤波:简单但会导致边缘模糊
- 高斯滤波:对高斯噪声有效但保留脉冲噪声
- 中值滤波:对脉冲噪声特别有效且能较好保留边缘
最终选择3×3窗口中值滤波:
matlab复制% 中值滤波去噪
car_img_denoise = medfilt2(car_img, [3 3]);
figure; imshow(car_img_denoise); title('去噪后图像');
注意事项:窗口大小选择很关键。实测发现3×3窗口在去噪和边缘保留之间取得最佳平衡,5×5窗口会导致字符笔画粘连。
2.2 对比度增强技巧
光照条件不理想时,车牌区域对比度可能不足。我们采用自适应直方图均衡化(CLAHE)来增强局部对比度:
matlab复制% 转换为灰度图
gray_img = rgb2gray(car_img_denoise);
% 自适应直方图均衡化
gray_img = adapthisteq(gray_img);
figure; imshow(gray_img); title('对比度增强后图像');
这种方法比全局直方图均衡化更能保留细节,特别是在车牌区域与车身颜色相近时效果显著。
3. 车牌定位关键技术
3.1 边缘检测与参数优化
车牌定位的核心是找到包含车牌的矩形区域。我们使用Canny边缘检测算法:
matlab复制% Canny边缘检测
edge_img = edge(gray_img, 'canny', [0.1 0.2]);
figure; imshow(edge_img); title('边缘检测结果');
阈值选择经验:
- 低阈值设为0.1-0.15能捕捉微弱边缘
- 高阈值设为低阈值的2-3倍
- 过高的阈值会丢失车牌边框信息
3.2 基于几何特征的筛选策略
获取边缘后,使用bwboundaries查找所有轮廓,然后通过几何特征筛选:
ma复制
