基于MATLAB的车牌识别系统:定位、分割与识别全流程实现

一、系统概述与开发意义

车牌识别系统(License Plate Recognition, LPR)是智能交通领域的关键技术,广泛应用于高速公路收费、停车场管理、交通违法监控等场景。其核心功能包括车牌定位(从图像中提取车牌区域)、字符分割(将车牌字符逐个分离)和字符识别(识别每个字符的具体内容)。MATLAB凭借其强大的图像处理工具箱和简洁的编程环境,成为开发车牌识别系统的理想选择。

相较于传统C++或Python实现,MATLAB的优势在于:

  1. 快速原型验证:无需手动管理内存或编译环境,可直接通过脚本实现算法迭代。
  2. 丰富的工具箱:Image Processing Toolbox提供边缘检测、形态学操作等现成函数。
  3. 可视化调试:实时显示中间结果(如二值化图像、轮廓检测结果),便于问题定位。

二、车牌定位:从复杂背景中提取车牌区域

车牌定位的核心是通过图像处理技术,在复杂背景中准确识别车牌的边界框。以下是基于MATLAB的典型实现步骤:

1. 图像预处理

原始图像可能存在光照不均、噪声干扰等问题,需通过以下操作增强车牌特征:

  1. % 读取图像并转换为灰度图
  2. img = imread('car.jpg');
  3. grayImg = rgb2gray(img);
  4. % 直方图均衡化增强对比度
  5. eqImg = histeq(grayImg);
  6. % 高斯滤波去噪
  7. filteredImg = imgaussfilt(eqImg, 2);

2. 边缘检测与形态学操作

车牌区域通常具有明显的边缘特征(如边框、字符),可通过Sobel算子或Canny算子检测边缘:

  1. % Sobel边缘检测
  2. edgeImg = edge(filteredImg, 'sobel');
  3. % 形态学闭运算连接断裂边缘
  4. se = strel('rectangle', [5 5]);
  5. closedImg = imclose(edgeImg, se);

3. 车牌区域筛选

通过轮廓检测和几何特征筛选车牌候选区域:

  1. % 查找连通区域
  2. [B, L] = bwboundaries(closedImg, 'noholes');
  3. % 筛选符合车牌长宽比的区域
  4. plateCandidates = [];
  5. for k = 1:length(B)
  6. boundary = B{k};
  7. rect = regionprops(L, 'BoundingBox');
  8. bbox = rect(k).BoundingBox;
  9. % 车牌长宽比通常在2:15:1之间
  10. aspectRatio = bbox(3)/bbox(4);
  11. if aspectRatio > 2 && aspectRatio < 5
  12. plateCandidates = [plateCandidates; bbox];
  13. end
  14. end
  15. % 选择面积最大的候选区域作为车牌
  16. [~, idx] = max(plateCandidates(:,3).*plateCandidates(:,4));
  17. plateBbox = plateCandidates(idx, :);

三、车牌字符分割:逐个提取字符

车牌字符分割需解决字符粘连、倾斜等问题,以下是关键步骤:

1. 车牌区域矫正

若车牌存在倾斜,需通过霍夫变换或Radon变换进行矫正:

  1. % 提取车牌区域
  2. plateImg = imcrop(img, plateBbox);
  3. % 边缘检测
  4. plateEdge = edge(rgb2gray(plateImg), 'canny');
  5. % 霍夫变换检测直线(车牌边框)
  6. [H, T, R] = hough(plateEdge);
  7. peaks = houghpeaks(H, 5);
  8. lines = houghlines(plateEdge, T, R, peaks);
  9. % 计算倾斜角度并旋转矫正
  10. angles = [lines.theta];
  11. medianAngle = median(angles);
  12. rotatedPlate = imrotate(plateImg, -medianAngle, 'bilinear', 'crop');

2. 字符垂直投影分割

通过垂直投影法统计每列的像素值,利用波谷位置分割字符:

  1. % 二值化车牌图像
  2. binaryPlate = imbinarize(rgb2gray(rotatedPlate));
  3. % 垂直投影
  4. verticalProjection = sum(binaryPlate, 1);
  5. % 寻找波谷位置(字符间隔)
  6. threshold = 0.2 * max(verticalProjection);
  7. gaps = find(verticalProjection < threshold);
  8. % 分割字符
  9. charRegions = [];
  10. startCol = 1;
  11. for i = 1:length(gaps)
  12. if gaps(i) - startCol > 10 % 忽略过小区域
  13. charRegions = [charRegions; [startCol, gaps(i)]];
  14. end
  15. startCol = gaps(i) + 1;
  16. end
  17. % 提取单个字符
  18. chars = cell(size(charRegions,1), 1);
  19. for i = 1:size(charRegions,1)
  20. chars{i} = binaryPlate(:, charRegions(i,1):charRegions(i,2));
  21. end

四、车牌字符识别:从图像到文本

字符识别是系统的最终目标,可通过模板匹配或深度学习实现:

1. 模板匹配法(适用于固定字符集)

若车牌字符集已知(如中文、字母、数字),可预先准备模板库进行匹配:

  1. % 加载模板库(需提前准备0-9A-Z的二值化模板)
  2. templates = loadTemplates('template_folder'); % 自定义函数
  3. % 对每个字符进行匹配
  4. recognizedChars = cell(size(chars));
  5. for i = 1:length(chars)
  6. maxScore = -Inf;
  7. bestMatch = '';
  8. for j = 1:length(templates)
  9. % 计算归一化互相关
  10. score = normxcorr2(templates{j}, chars{i});
  11. if max(score(:)) > maxScore
  12. maxScore = max(score(:));
  13. bestMatch = templates.labels{j}; % 模板对应的字符标签
  14. end
  15. end
  16. recognizedChars{i} = bestMatch;
  17. end
  18. % 组合识别结果
  19. licensePlate = strcat(recognizedChars{:});

2. 深度学习法(高精度场景)

对于复杂环境,可调用MATLAB的深度学习工具箱训练CNN模型:

  1. % 加载预训练模型(需提前训练或导入)
  2. net = load('plateCharRecognizer.mat'); % 包含训练好的网络
  3. % 预处理字符图像
  4. inputSize = [32 32]; % 模型输入尺寸
  5. resizedChars = cell(size(chars));
  6. for i = 1:length(chars)
  7. resizedChars{i} = imresize(chars{i}, inputSize);
  8. end
  9. % 批量预测
  10. predictions = classify(net, resizedChars);
  11. licensePlate = strjoin(string(predictions), '');

五、系统优化与实用建议

  1. 性能优化

    • 对大尺寸图像先下采样再处理,减少计算量。
    • 使用parfor并行处理多个候选区域。
  2. 鲁棒性提升

    • 增加光照归一化步骤(如Retinex算法)。
    • 对模糊车牌使用超分辨率重建(如SRCNN)。
  3. 部署建议

    • 将MATLAB代码转换为C/C++(通过MATLAB Coder)以提高执行效率。
    • 对实时性要求高的场景,可结合硬件加速(如GPU计算)。

六、总结与展望

本文详细介绍了基于MATLAB的车牌识别系统开发流程,涵盖定位、分割和识别三个核心模块。通过代码示例和优化策略,开发者可快速实现一个基础版本,并根据实际需求进一步扩展(如支持双层车牌、新能源车牌等)。未来,随着深度学习技术的演进,结合MATLAB的自动微分工具(如Deep Learning Toolbox),车牌识别的精度和效率将持续提升。