
车牌识别是数字图像处理常见课程设计题目,用 Matlab 做整个流程不难,主要分几步:预处理、车牌定位、字符分割、字符识别。本文把每步思路理清楚,代码结构清晰,照着做就能做出来。
整体流程
- 读取原图,转灰度
- 预处理:去噪、边缘增强
- 车牌定位:找到车牌所在区域
- 倾斜校正:把歪的车牌摆正
- 字符分割:把每个字符切出来
- 字符识别:识别每个字符是什么
- 输出结果
每一步都能用到 Matlab 自带函数,不用从零写算法。
第一步:读取图像预处理
img = imread('car.jpg');
gray = rgb2gray(img);
% 高斯去噪
gray = imgaussfilt(gray, 2);
% 边缘检测
bw = edge(gray, 'canny');
转灰度去掉颜色信息,高斯模糊去噪声,Canny 边缘检测得到轮廓,后面定位车牌用。
第二步:车牌定位
车牌是矩形,长宽比大概 4.5:1,根据这个特征找候选区域。
步骤:
- 找所有轮廓,
bwboundaries提取连通域 - 对每个连通域算外接矩形,算长宽比面积
- 过滤掉不符合长宽比,面积太小太大的
- 剩下最像车牌那个就是候选
代码框架:
[~, 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 做完整车牌识别课程设计没问题,代码量不大,每一步都有现成函数调用,调试也方便。

5604

被折叠的 条评论
为什么被折叠?



