基于Matlab的车牌识别,步骤完整思路

图片

车牌识别是数字图像处理常见课程设计题目,用 Matlab 做整个流程不难,主要分几步:预处理、车牌定位、字符分割、字符识别。本文把每步思路理清楚,代码结构清晰,照着做就能做出来。

整体流程

  1. 读取原图,转灰度
  2. 预处理:去噪、边缘增强
  3. 车牌定位:找到车牌所在区域
  4. 倾斜校正:把歪的车牌摆正
  5. 字符分割:把每个字符切出来
  6. 字符识别:识别每个字符是什么
  7. 输出结果

每一步都能用到 Matlab 自带函数,不用从零写算法。

第一步:读取图像预处理

img = imread('car.jpg');
gray = rgb2gray(img);
% 高斯去噪
gray = imgaussfilt(gray, 2);
% 边缘检测
bw = edge(gray, 'canny');

转灰度去掉颜色信息,高斯模糊去噪声,Canny 边缘检测得到轮廓,后面定位车牌用。

第二步:车牌定位

车牌是矩形,长宽比大概 4.5:1,根据这个特征找候选区域。

步骤:

  1. 找所有轮廓,bwboundaries 提取连通域
  2. 对每个连通域算外接矩形,算长宽比面积
  3. 过滤掉不符合长宽比,面积太小太大的
  4. 剩下最像车牌那个就是候选

代码框架:

[~, L] = bwboundaries(bw, 8);
stats = regionprops(L, 'BoundingBox', 'Area');
% 遍历找候选
for i = 1:length(stats)
    bbox = stats(i).BoundingBox;
    w = bbox(3);
    h = bbox(4);
    ratio = w/h;
    % 车牌比例大概 2-5 之间,过滤
    if ratio > 2 && ratio < 5
        % 看看面积对不对,保存候选
        candidate = [candidate; stats(i)];
    end
end

选最大最符合的那个,裁剪出来就是车牌区域。

第三步:倾斜校正

车牌拍歪了要校正,用 Hough 变换检测直线,找倾斜角度,然后旋转:

% 车牌二值
level = graythresh(plate_gray);
bw_plate = imbinarize(plate_gray, level);
% 边缘检测找直线
[H, T, R] = hough(bw_plate);
P = houghpeaks(H, 10);
lines = houghlines(bw_plate, T, R, P);
% 算平均角度
angle = mean([lines.theta]);
% 旋转校正
plate_rotated = imrotate(bw_plate, -angle, 'bilinear');

校正完车牌就是正的了,后面分割字符准确。

第四步:字符分割

校正完二值,投影分割:

垂直方向投影,算每一列黑像素个数,从左到右找间隙,分开每个字符:

proj = sum(bw_plate, 1); % 垂直投影,每一列和
% 找谷点,就是间隙
% 分割得到每个字符区域
for i = 1:num_chars
    char_img = bw_plate(:, start(i):end(i));
    char_img = imresize(char_img, [16 8]); % 归一化大小
    chars{i} = char_img;
end

一般车牌七个字符,切出来七个,大小归一化送识别。

第五步:字符识别

切好的字符,用模板匹配,或者神经网络识别。新手做课程设计模板匹配最简单:

提前准备好每个字符标准模板,输入字符和每个模板算相关系数,最大那个就是识别结果。

% templates 是预存的模板,每个字符一个
labels = {'0','1',...,'Z'};
max_corr = 0;
result = '';
for i = 1:length(templates)
    corr = corr2(char_img, templates{i});
    if corr > max_corr
        max_corr = corr;
        result = labels{i};
    end
end

这样就能识别出来。想用更准就训练一个 BP 神经网络,输入归一化图像,输出分类结果,正确率更高。

总结难点

  • 车牌定位容易错,背景复杂会多候选,调整阈值比例范围慢慢试
  • 倾斜校正角度算错了,切字符就错,Hough 直线找对很重要
  • 字符粘连分不开,投影找阈值慢慢调

整个流程下来,Matlab 做完整车牌识别课程设计没问题,代码量不大,每一步都有现成函数调用,调试也方便。

,背景复杂会多候选,调整阈值比例范围慢慢试

  • 倾斜校正角度算错了,切字符就错,Hough 直线找对很重要
  • 字符粘连分不开,投影找阈值慢慢调

整个流程下来,Matlab 做完整车牌识别课程设计没问题,代码量不大,每一步都有现成函数调用,调试也方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值