尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于MATLAB的车牌识别系统:数字图像处理课程设计完整实现

基于MATLAB的车牌识别系统:数字图像处理课程设计完整实现 简介这是一份基于MATLAB的车牌识别设计报告面向数字图像处理课程设计、智能交通应用和字符识别入门学习人群。报告系统梳理了车牌识别的研究背景、原理概述与系统程序设计可帮助读者理解从车牌图像输入到字符结果输出的完整链路。资源包为1个PDF文档整体约1.35MB已有4879人学习浏览。文档结构清晰按图像预处理、字符切割、字符识别三大模块展开详细覆盖倾斜校正、灰度处理、均值滤波、去干扰、最小值滤波、腐蚀膨胀、字符范围确定、切割与归一化以及基于最近邻法的字符识别和界面设计同时包含摘要、关键词和完整目录适合对照MATLAB代码复现实验也可作为课程设计报告撰写的结构范例。 数字图像处理课程设计题目每年翻来覆去就那么几个但出现频率最高、也最能检验综合能力的我个人首推“基于MATLAB的车牌识别”。这个题目要求非常直接给一张包含车牌的车辆照片程序自动定位车牌区域并把车牌上的汉字、字母、数字逐个识别成字符串。它之所以经典是因为把灰度变换、边缘检测、形态学处理、连通域分析、字符分割、模板匹配这些数字图像处理主干知识点全部串在了一起做完这个课设基本就等于把整门课程的核心脉络重新走了一遍。这篇文章我会从整体设计方案讲起再拆解定位、分割、识别三个核心模块的算法逻辑给出可直接参考的MATLAB关键代码最后把调试中容易掉坑的地方和实测经验整理出来。准备交课设、或者想找一个能跑通参考系统的读者按这条主线走能省下不少探索时间。1. 课程设计整体思路与方案选型1.1 题目到底在考什么需求边界与技术路线很多同学拿到题目就急着打开MATLAB开始写代码结果写了三天定位、识别全都飘。我建议先花半天把需求拆干净。课程设计的要求通常只有一句话输入一张包含车牌的车辆图像输出车牌位置框和字符识别结果。但实际评分一般看三件事定位框是否准确、识别字符串是否正确、答辩时能不能把原理讲清楚。所以“能跑”只是及格线原理要通、思路要顺分数才会上去。技术路线上有两条常见选择一条是传统图像处理路线基于边缘检测、形态学、连通域分析加模板匹配另一条是深度学习路线用目标检测网络框出车牌再用字符识别网络识别。课设阶段我强烈建议以传统图像处理为主。原因很现实传统方法每一步都对应着课程里的知识点灰度化对应灰度变换、Canny对应边缘检测、区域筛选对应形态学与连通域分析答辩时老师问起来你能说得头头是道。而深度学习虽然效果更好但需要数据集、显卡、网络训练对课程设计来说周期太长也容易和“数字图像处理”这门课的知识点脱节。传统路线跑通后再在报告里提一句“可扩展到卷积神经网络”反而是加分项。1.2 数字图像处理知识点映射每一步都能对上课本做这个课设不只是完成任务更是一次把理论落地的机会。参考冈萨雷斯《数字图像处理》的章节结构整个车牌识别系统几乎就是教材目录的缩影。图像读取和灰度化对应第二章“灰度变换与空间滤波”直方图均衡化对应“直方图处理”边缘检测对应“图像分割”里的梯度算子形态学闭运算对应“形态学图像处理”连通域标记和区域属性提取对应“表示与描述”模板匹配对应“基于相关性匹配”的内容。我在设计报告里专门做了一张知识映射表把每个模块和教材章节对应起来老师看了会觉得你对课程有整体把握不只是一段段拼代码。具体对应关系大致是这样流程模块使用的主要操作对应课程知识点图像预处理rgb2gray、imadjust、imbinarize灰度变换、直方图均衡化、图像二值化车牌定位edge、imclose、bwconncomp、regionprops边缘检测、形态学闭运算、连通域标记字符分割垂直投影、连通域分析投影法、区域分割字符识别imresize、corr2特征提取、相关性匹配这样把任务映射到知识点之后整个系统的设计逻辑就非常清晰了每一步都是在用课本上学过的工具解决一个具体问题。接下来就按这个框架把每个核心模块的算法细节拆开讲。2. 车牌识别核心算法定位、分割、识别的完整拆解2.1 车牌定位边缘检测形态学连通域筛选车牌定位是整个系统里最关键的环节因为后面分割和识别的输入都取决于定位框准不准。我采用的方法是“边缘检测 形态学闭运算 连通域筛选”三步走。第一步先把彩色图转成灰度图再做一次对比度增强推荐用imadjust它能自动拉伸灰度级分布让边缘更清晰。第二步用 Canny 边缘检测。和 Sobel 相比Canny 有双阈值和滞后处理抗噪能力更好得到的边缘连续度更高。第三步是关键用水平方向的矩形结构元素对边缘图做闭运算。这个操作背后有很直观的理由——车牌的字符是横向排成一行的字符间隙在水平方向上比较小用一个水平方向长、垂直方向短的矩形结构元素比如 17×3做闭运算时能把相邻字符边缘连成一个整体而背景里那些散乱的边缘不会连成这么大一块。这样一来车牌区域就会变成一个稠密的连通区域。闭运算之后用bwconncomp提取连通域再用regionprops拿到每个区域的面积和包围盒。筛选条件通常有两个宽高比和面积占比。普通蓝底车牌的宽高比在 3 左右所以把宽高比卡在 2 到 4.5 之间面积按图像总面积的 1% 到 8% 来筛过小的是噪声过大的是干扰区域。如果图片背景复杂或者车牌颜色严重失真边缘法可能选错区域这时候可以再叠加一个颜色判据先把图像转到 HSV 空间利用蓝色色调范围提取蓝色区域再和边缘法得到的候选区域求交集定位准确率会明显提升。2.2 字符分割垂直投影与连通域结合定位到车牌区域之后要做的第一件事是去掉车牌边框和铆钉。车牌的金属边框在二值化后会和字符连在一起如果不处理垂直投影会出现干扰波峰。我的办法是先用形态学开运算把细小的铆钉点去掉再用水平投影找出字符主体所在的行带把上下边框裁掉。字符分割最经典的方法是垂直投影法。把二值化后的车牌图像按列统计前景像素数量字符所在列会有明显的波峰字符之间的空隙则是波谷或零值。通过diff函数找到投影值从 0 变正、再变负的位置就能得到每个字符的左右边界。但投影法有个问题如果字符笔画粘连或者有噪声导致字符内部出现缺口投影会出现误切。所以更稳妥的做法是投影法和连通域分析结合。用bwlabel标记二值图像中的连通域再用regionprops提取每个连通域的包围盒把包围盒按横坐标排序就能得到按顺序排列的字符序列。对于像“京”“鲁”“A”这类笔画不一定完全连通的字符可以先做一次闭运算把同一字符的断裂笔画补上再做连通域分析。分割后每个字符的大小不一致模板匹配前必须统一尺寸。我习惯用imresize把所有字符归一化到 20×40 像素注意保持字符纵横比否则后面匹配时误差会很大。字符的位置也要摆正可先把字符的白色像素质心移到图像中心再做尺寸归一化。2.3 字符识别模板匹配的关键细节识别环节最朴素、也最适合课设的就是模板匹配。流程是准备一套标准字符模板包括汉字省份简称、24 个大写字母实际车牌不用 I 和 O、10 个数字把分割出来的字符和每个模板分别做相关性计算相关性最大的模板对应的字符就是识别结果。MATLAB 里计算两个图像相似度最省事的函数是corr2它计算的是两幅图像的二维相关系数取值在 -1 到 1 之间越接近 1 表示越相似。用之前必须保证字符图像和模板图像尺寸一致且都是 double 类型否则corr2的结果没有参考意义。这里有一个很多新手会忽略的问题汉字字符用模板匹配效果偏差。原因在于汉字笔画多、结构复杂同一省份简称在不同字体下差异大而且照片里的车牌可能存在透视变形模板很难覆盖所有情况。我的解决思路是给每个模板准备多个变体比如同一汉字收集不同拍摄角度下的样本识别时和所有变体匹配取全局最高分。更进阶的做法是用格子特征把字符图像分成 8×8 的网格统计每个网格里白色像素占比组成一个 64 维特征向量再用欧氏距离或相关系数比较。这样做对微小形变更鲁棒而且计算量也不大。3. MATLAB代码实操从主函数到字符识别的完整流程3.1 环境准备与函数版本提示做这个课设只需要 MATLAB 和 Image Processing Toolbox。工具箱安装完成之后可以用ver(images)检查一下版本确保imbinarize、bwconncomp、regionprops这些函数可用。有一点要注意老版本 MATLAB 里二值化用的是im2bw新版本推荐使用imbinarize两者在参数语义上有差别直接抄老代码在新版本里可能报警告甚至报错。还有一个小坑。MATLAB 对中文路径的支持不稳定我在课设阶段曾经把图片放在一个带中文名的文件夹里结果imread一直读不出来。建议整个工程目录全部用英文包括文件名也尽量避免空格和特殊符号。另外如果是为了应付答辩演示不要再做那种一行输出最终结果、看不到中间过程的脚本。最好把预处理、定位、分割、识别写成几个独立函数主脚本里用注释标清楚步骤并用figure加subplot把中间结果图展示出来。老师看到灰度图、边缘图、闭运算结果、候选框、字符分割图会觉得整个过程是有思考的。3.2 车牌定位核心代码与参数含义以下这段代码是整个定位模块的核心参考实现。它读取图像、转灰度、增强、Canny 边缘检测、闭运算、连通域筛选最后画出定位框。% 车牌定位主流程 img imread(car.jpg); gray rgb2gray(img); enhanced imadjust(gray); % 对比度增强让边缘更明显 edgeMap edge(enhanced, canny); % Canny边缘检测 se strel(rectangle, [17, 3]); % 水平方向长的矩形结构元素 closed imclose(edgeMap, se); % 闭运算连接字符边缘 cc bwconncomp(closed); % 连通域标记 stats regionprops(cc, Area, BoundingBox); % 区域属性 [~, idx] sort([stats.Area], descend); % 按面积从大到小排序 imgArea size(img, 1) * size(img, 2); plateBox []; for k idx w stats(k).BoundingBox(3); h stats(k).BoundingBox(4); ratio w / h; areaRatio stats(k).Area / imgArea; if ratio 2 ratio 4.5 areaRatio 0.01 areaRatio 0.08 plateBox stats(k).BoundingBox; break; % 找到第一个满足条件的区域即可 end end if ~isempty(plateBox) figure; imshow(img); hold on; rectangle(Position, plateBox, EdgeColor, r, LineWidth, 2); end这段代码里最值得调整的参数就是结构元素的尺寸[17, 3]。图片分辨率不同字符边缘之间的距离也不同如果定位出来发现车牌区域中间断裂就把 17 调大如果多个区域连成一片就把 17 调小。我自己的经验是对于 600×400 左右的车辆图像13 到 20 的水平长度表现都不错具体可以在调试时用变量替换硬编码方便快速试验。3.3 字符分割与模板匹配代码解析定位到车牌后先把车牌裁剪出来再做变换、二值化和字符分割。下面这段是参考实现% 裁剪车牌区域并转换到灰度 plateImg imcrop(img, plateBox); plateGray rgb2gray(plateImg); plateBw ~imbinarize(plateGray); % 车牌字符需要保证白色前景反色处理 % 去除上下边框水平投影筛选字符行带 rowProj sum(plateBw, 2); rowMask rowProj max(rowProj) * 0.2; % 阈值过滤 rows find(rowMask); plateBw plateBw(min(rows):max(rows), :); % 去除左右边框并获取字符候选连通域 colProj sum(plateBw, 1); colMask colProj 0; cols find(colMask); plateBw plateBw(:, min(cols):max(cols)); % 连通域分析得到每个字符 lb bwlabel(plateBw); chars regionprops(lb, Image, BoundingBox); chars chars([chars.BoundingBox]; % 按横坐标排序 [~, order] sort([chars.BoundingBox](1)); chars chars(order); % 归一化后与模板匹配 recResult []; for i 1:length(chars) charImg imresize(chars(i).Image, [40 20]); charImg double(charImg); scores zeros(size(templates, 1), 1); for j 1:size(templates, 1) scores(j) corr2(charImg, templates{j}); % 与每个模板做相关 end [~, bestIdx] max(scores); recResult [recResult, templateChars(bestIdx)]; end disp([识别结果, recResult]);这段代码里的templates和templateChars是预先加载的模板图像数组和对应的字符标签。模板的制作方式很简单用和主程序相同的方法手工从标准车牌图片里裁出每个字符统一缩放到 20×40 保存成灰度图像识别时再转 double。值得提醒的是车牌字符中汉字“京”和“津”在某些分辨率下特别容易混淆模板越多冗余越好。如果还希望进一步提升识别率可以把corr2的结果做个加权结合字符的宽高比特征和笔画密度特征一起判断。4. 课程设计中的常见问题从定位失败到识别翻车4.1 车牌定位不准优先查结构元素和二值化我在调试中遇到最多的现象是定位框选到了车灯、车标、或者车身侧面的大片反光区域。这类问题的根源通常有两个。第一个是边缘图的噪声太多导致闭运算之后大片背景区域连成一整块比车牌区域还要大。解决办法是在边缘检测之前做一次中值滤波medfilt2或者把 Canny 的高阈值调高一点减少弱边缘。第二个是结构元素尺寸不合理。结构元素太大会把很多不相干的边缘连起来太小又无法把字符完全连成一个区域。你可以把closed中间的图像用imshow显示出来直接用肉眼看字符区域有没有形成完整的高亮块这是最直观的调试方式。如果边缘法始终不稳定我建议引入颜色信息做兜底。蓝色车牌的 HSV 色相范围一般在 100 到 124 之间饱和度也有一定范围用hsv2rgb转换后做阈值提取蓝色区域再和边缘法候选区取交集。这一招在车牌颜色没有严重偏色的情况下非常有效。4.2 字符分割粘连或断裂先还原连通域再投影字符分割阶段最容易出的问题就是两个相邻字符粘连成一个区域或者同一个字符的笔画断裂成多个块。粘连的常见原因有两个车牌边框没有去除干净以及模板匹配前二值化阈值选得太低导致笔画变粗。先检查边框如果有残留就用形态学开运算去掉。如果还是粘连可以改用垂直投影法去切分先看粘连区域的投影曲线如果中间出现明显的波谷就说明其实是两个字符可以用波谷位置切开。笔画断裂的情况正好相反往往是阈值得太高或者原图分辨率太低。解决办法是在连通域分析之前先对二值图像做一次闭运算结构元素用小尺寸的垂直矩形比如 3×5把同一字符内的断点连接起来。也可以反过来用投影法断裂字符的垂直投影不会出现明显的零值区间但边缘距离较大可以根据字符的平均宽度来辅助切分判断某个区域是否需要合并。4.3 模板匹配识别率上不去的三个原因第一个原因最简单也最容易被忽略字符没有归一化到和模板相同的尺寸。有些同学直接拿原尺寸的字符和模板比较corr2结果自然没有任何意义。统一尺寸是必须的而且用imresize时要选双线性或双三次插值不要用最近邻。第二个原因是字符没有居中。车牌照片里字符位置会有几个像素的偏移同一字符在不同照片里质心位置不同匹配分数会明显下降。我的办法是在归一化前用regionprops提取质心坐标然后做一次平移确保字符中心对齐后再缩放。第三个原因是把中文字符和数字字母用同一套模板匹配。汉字笔画密集两个不同汉字在高分辨率下相关度也可能很高特别是“津”和“律”、“吉”和“古”这种结构接近的。中文和数字字母建议分开建模板库先用字符的宽高比或者连通域数量判断它属于中文还是数字字母再只在对应的模板库里匹配。4.4 MATLAB环境相关的坑有些坑跟算法无关但照样会卡住人。比如远程桌面环境下 MATLAB 启动异常或者许可证文件绑定机器名导致激活失败这是环境里比较常见的问题。新安装 MATLAB 后建议先运行ver确认各个工具箱都正常加载再跑课设代码。另外新旧版本函数的兼容性也要注意imclose的结构元素参数在新版本中推荐用strel创建的形态结构体对象直接用纯数组在某些函数里会被提示语法变化。我的习惯是代码开头加一句clear all; close all; clc;不过这只在脚本执行里方便正式工程里不要在不必要的场合清空工作区。5. 实测效果与后续扩展方向5.1 实验室里的真实效果与参数经验我自己测试时是拿手机拍了大约 40 张停车场照片分辨率在 800×600 上下光线良好、车牌与镜头基本平行的照片定位成功率达到 90% 以上一旦出现逆光、倾斜超过 15 度、或者车牌被车身阴影覆盖定位成功率会明显下降。字符识别里数字和字母的准确率能到 95% 左右汉字则在 85% 上下浮动主要问题就出在角度和分辨率上。如果你的课设答辩需要给出量化指标建议准备一批测试集把定位成功率、单字识别率、整牌识别率分别统计出来这样报告更有说服力。参数经验可以总结成一句话宁可让候选区域多一点也不要让真正的车牌被过滤掉。我早期做筛选时为了提高准确率把宽高比卡得很死结果几张略微透视变形的车牌被直接跳过之后再把宽高比放宽到 1.8 到 5.0并用多个条件分层次筛选情况立刻好很多。后续加颜色判据做兜底后整体的鲁棒性提升非常明显。5.2 从课设走向工程摄像头实时识别与深度学习改进如果时间和精力富余这个课设可以继续向两个方向扩展。一个方向是摄像头实时识别。我之前尝试过用 OV7670 摄像头模块采集视频流再在 MATLAB 里逐帧处理思路和静态图像完全一样但要注意实时性的瓶颈。传统算法的边缘检测和形态学操作在单帧 640×480 图像上耗时很小反而是bwconncomp和regionprops在大面积连通域上稍微吃性能。处理时可以降低处理帧率每隔几帧做一次定位定位成功后的小范围内跟踪并做字符识别这样能明显减轻计算压力。另一个方向是深度学习。MATLAB 的 Deep Learning Toolbox 支持手写字符识别的卷积神经网络训练可以把分割好的字符作为训练集用 CNN 替代模板匹配对倾斜、模糊、变形的鲁棒性会好不少。这也是目前智能交通里车牌识别系统的主流思路。做课设的意义不只是把代码跑通更是建立一种思路面对一个看似复杂的图像任务如何把它拆成预处理、定位、分割、识别四个环节然后逐个击破。等你以后接触更复杂的项目这套拆解问题的框架依然能复用。本文还有配套的精品资源点击获取
返回列表