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

资讯详情

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

基于Matlab的车牌识别系统:从图像处理到字符输出的完整实现

基于Matlab的车牌识别系统:从图像处理到字符输出的完整实现 简介基于MATLAB的车牌识别系统完整项目面向高校课程设计及期末大作业场景可帮助学习者快速掌握图像处理与字符识别核心流程。该项目已通过导师指导并获得97分的高分评价涵盖车牌图像采集、灰度化、定位、字符分割以及模板匹配识别等完整技术链路。压缩包内共55个文件包括6个.m脚本源码、1个.fig图形界面文件以及48张测试图片和字符模板数据包体大小约530KB结构清晰且直接可用。源码中的定位、分割、取字等模块函数分工明确配合图形界面能够直观展示车牌识别全过程便于运行验证和二次学习。截至目前已有1709人学习参考特别适合正在完成MATLAB图像处理课程设计的学生使用也可作为毕业设计或电子竞赛项目的功能基础。 学期末总能看到一群人在问车牌识别怎么做。这个题目在图像处理课程设计里年年都是热门Matlab版车牌识别系统更是其中的常客。原因不难理解Matlab图像处理工具箱足够成熟矩阵运算天然适合做像素级操作整个流程从读入图片到输出字符串代码量不会超过三百行而且还能用图窗交互工具做一个像样的演示界面。对于自动化、通信、计算机相关专业的学生来说这是性价比非常高的课程设计选题。这套基于Matlab车牌识别系统源码全部数据的工程核心就做一件事输入一张包含车牌的图片识别出车牌上的字符并输出。中途要经过灰度化、边缘检测、车牌定位、字符分割、字符识别几个关键环节。本文会把这些环节逐个拆开讲包括每个环节的选型理由、代码实现和实际测试中容易遇到的坑给正在做课设的同学一条可以直接走通的路。1. 车牌识别到底在做什么一张图到一串字符的完整链路这个项目说到底是经典的图像处理流程链整套技术栈都围绕一个目标从自然场景图片中提取车牌区域然后从这个区域里读出一串字符。链条通常是这样走的读入图片做灰度化和图像增强。利用边缘或颜色特征锁定车牌候选区域。形态学处理填充连通域筛选出真正的车牌。对车牌区域做倾斜校正和二值化处理。通过投影法分割出单个字符。字符归一化后与模板库比对输出识别结果。每一环都依赖前一步的输出质量。源码工程里放的是正常光照、水平视角的车辆图片跑起来比较轻松如果自己换测试图尤其是逆光、倾斜、污损的车牌那每一环都会暴露问题。源码工程一般包含主程序、各功能函数、模板库和测试图片。拿到这套资源后第一件事不是急着跑而是理清楚每个脚本的作用。通用结构大概是main.m入口文件、PreProcess.m图像预处理、LocatePlate.m车牌定位、SegmentChars.m字符分割、RecognizeChar.m字符识别以及templates目录下存放的0-9数字、A-Z字母和汉字模板。搞清楚每个文件的输入输出后面调参时才不会迷路。这里多提一句网上热词里反复出现的“matlab安装”“matlab工具箱”车牌识别主要依赖Image Processing Toolbox安装时如果没勾选运行到imread、edge这些函数就会直接报错。检查工具箱是否完整的命令是ver在命令行敲一下就能看到已安装组件列表。之前遇到好几个同学代码拷过去了但跑不起来最后发现是安装时精简了组件这个问题排查起来最费时间。2. 车牌定位整个系统最容易翻车的地方定位决定了整个识别系统能不能走下去。定位错了后面所有步骤都是白费。常见的定位思路有纹理边缘法和颜色特征法两种这套代码主流程用的是边缘形态学筛选辅助颜色特征做校验。预处理阶段读取的彩色图像先转灰度。为了增强边缘可以用edge函数做Sobel或Canny边缘检测。课程设计难度下推荐Sobel计算量小参数好调。Canny对噪声更敏感参数不合适时边缘图会碎成一团。然后是形态学闭运算把边缘图里车牌字符形成的密集纹理连成一个整体。这里有一个典型参数se strel(rectangle, [15, 5]); plateRegion imclose(edgeImg, se);结构元素的长和宽直接影响连通域成形。宽太小车牌区域连不起来宽太大会把旁边的车灯、保险杠边缘也并进来。实测下来[15, 5]这个尺寸对正常距离拍摄的车辆图比较通用。连通域标记后按几何特征筛车牌候选区域。标准车牌宽高比约440mm比140mm接近3.14比1考虑到侧视角度的畸变ratio设定在2.5到4.5之间比较稳妥。面积也要设下限过滤掉那些因为噪声产生的零散小区域。筛选逻辑通常用regionprops提取BoundingBox和Area然后逐一遍历判断。筛选之后如果候选区域多于一个就需要用颜色特征做二次确认。虽然网上很多方案直接走蓝色像素比例判断但实际测试里单纯的颜色阈值容易受环境光影响。保险的做法是同时计算区域的蓝色像素占比比例达到一定值才保留。这个“一定值”在不同光照条件下数据差异挺大源码里一般给到0.15到0.25之间大家跑数据的时候可以自己调。这里有个细节特别值得注意很多教程直接教你“用HSV颜色空间提取蓝色”但课程设计常用图片是从网上找的色域标准不统一HSV的H分量阈值其实不大稳定。如果只是想交作业RGB阈值配合“蓝色通道明显大于红绿通道”的判断就够用了。想做得更严谨可以在YCbCr空间里用Cb分量肤色等干扰在YCbCr空间里更容易排除。定位环节我遇到的坑比较典型的有三个车头照片里车牌上方有散热格栅格栅纹理和车牌字符区域在边缘图上很容易连成一片导致定位框把整个格栅包进去。解决办法是增加颜色校验只保留蓝色占比高的连通域。车灯区域的反光会让边缘图大范围激活这时候形态学结构元素不能太大否则灯区和车牌区会融合成一个大连通域连筛选条件都救不回来。图片压缩后字符边缘模糊Sobel算子提取的边缘断断续续。解决方法是先做一个顶帽变换增强对比度再做边缘检测能明显改善断边问题。顶帽变换在Matlab里用imtophat实现结构元素选disk形状半径15左右亲测效果稳定。颜色校验的代码片段大致这样[r, c, ~] size(cropImg); blueRatio sum(sum(cropImg(:,:,3) 120 cropImg(:,:,3) - cropImg(:,:,2) 30 cropImg(:,:,3) - cropImg(:,:,1) 30)) / (r * c); if blueRatio 0.15 % 确认为车牌区域 end这个阈值组合不是什么标准答案但在我测试的多组图片上表现稳定可以作为起步值再微调。3. 字符分割被很多教程一句话带过的高频失分点字符分割在这类课设里最容易被忽视但又是答辩时老师最喜欢问的部分。分割做得好不好直接影响最后识别准确率。拿到车牌区域后先要对倾斜的车牌做纠正。很多测试图里车牌的上下边缘不是水平的直接做投影分割会出现字符错位。最常用的处理方式是Hough变换提取车牌上下边界直线计算倾斜角后用imrotate旋转矫正。这个过程不复杂但很多初学者会漏掉导致字符分割的投影曲线毛刺特别多。倾斜校正之后做二值化。全局阈值处理Otsu在车牌这类对比度明显的区域里表现够用代码通常是level graythresh(grayPlate); bw im2bw(grayPlate, level);但注意二值化之后需要去掉边框和铆钉。车牌的白色边框会干扰字符的上下左右投影必须做一次“去边框”处理。常用的手段是利用最大连通域或直接按行列像素投影值修剪把四周空白和边框像素剔除。分隔字符的核心方法是垂直投影。把二值图像按列求和投影值接近0的列就是字符间隙根据这些间隙就可以把字符切出来。普通蓝牌第一个字符是汉字后面是字母和数字交替排列长度为7个字符。做分割的时候最常见的错误是把汉字切分成左右两个部分。因为“京”“陕”“苏”这些汉字结构比较复杂中间会出现接近0的投影间隙直接按间隙切会把汉字劈开。处理办法是结合字符宽度约束。先计算连通域根据中文字的连通性或者先按投影曲线初切再粗略估算统一字符宽度把宽度明显异常的切割点合并。实战里更多直接用连通域分析加宽度过滤来处理效果比纯投影好。大致思路是对二值图调用bwlabel标记连通域统计每个连通域的宽度剔除太宽和太窄的剩下来的就是有效字符区域。尺寸归一化也在这个环节完成。分割出的字符大小不一直接拿去和模板比匹配度误差会很大。通常做法是把每个字符统一缩放到固定大小常见是40x20或42x24统一使用imresize完成。这个尺寸要和模板库保持一致否则不同缩放方式带来的形变会让匹配结果波动。我习惯用双线性插值即imresize默认参数简单而且对字符这类二值图像效果足够好。我在测试时踩过的坑主要有铆钉和二值化后的字母“1”粘连连通域分析会误判成一个大字符导致字符数量少于预期。解决思路是先做一次中值滤波或形态学开运算把小的突起去掉再分割。车牌倾斜角度比较大时imrotate旋转会引入黑色边框需要旋转后重新做一次区域裁剪不然投影曲线会被黑边严重干扰。字符之间的分隔点在投影上高度不高容易被过滤掉。正常情况下课程设计不要求识别分隔符但如果你直接把它当成普通字符去识别模板库里没有它就会输出一个奇怪的数字。分割时把它当作间隙处理即可不用额外关心。分割环节的验收标准很简单把每张测试图的分割结果用figure画出来人工看一眼字符是否完整、是否有粘连、是否有碎块。如果这一步肉眼看着都不干净识别结果肯定好不了不用急着调匹配算法。4. 字符识别与模板匹配精度够用但要注意中文模板字符识别这个环节成熟的工业系统会使用深度学习模型比如YOLO加LPRNet的组合。但课程设计使用模板匹配完全合理代码量可控、逻辑直观而且只要模板库覆盖够全识别正确率在标准测试集上也能达到90%以上。模板匹配的原理非常简单把待识别字符的像素矩阵和模板库中每个模板的像素矩阵计算相似度相似度的度量可以选择欧氏距离、归一化互相关或直接算像素差异平方和。工程里用得比较多的是归一化互相关它对光照和轻微形变有一定的鲁棒性。Matlab自带的corr2就能直接计算两个矩阵的相关系数实现起来很省事。计算时注意把待识别字符和模板都缩放到相同尺寸否则corr2会因为维度不一致直接报错。这一步逻辑通常如下for k 1:length(templateList) template templateList{k}; score corr2(testChar, template); if score bestScore bestScore score; result templateLabel{k}; end end模板库的构建是除了算法以外最“吃工作量”的部分。数字0到9加上字母A到Z是36个类每个类如果按多种字体、多种粗细各做几张模板总量很容易超过100张。再加上各省简称的汉字工作量立刻翻倍。课程设计一般不会要求识别全部省份汉字常用做法是挑几个最典型的省份简称做演示比如“京”“沪”“粤”“苏”“陕”“鲁”等够演示就行不必追求全量覆盖。源码里也确实是这么组织的重点省份的模板做得比较全。这里有个关键点值得提醒中文字符和英文字符在模板匹配时的表现差异很大。英文和数字是印刷体字形稳定模板匹配效果很好。汉字结构复杂笔画密集比如“冀”“赣”这类字在二值化之后笔画粘连严重匹配得分会明显偏低。真遇上这种情况与其反复调匹配算法不如在分割环节下功夫把二值化阈值选得合适一些让汉字的笔画尽量完整。我实测中甚至遇到过汉字模板匹配得分只有0.7而正确字符仍然排第一的情况原因是模板本身质量一般。所以模板图的绘制和生成一定要干净推荐直接用程序生成标准化字符图像而不是手工截取手工截取的模板带边框和噪声非常影响匹配结果。识别完之后把7个字符依次拼接输出到命令行或者显示在GUI上整个流程就通了。你会在测试中发现一个规律识别错误的字符大多数集中在数字“0”和字母“O”、数字“8”和字母“B”、字母“D”和“O”这三组里。因为二值化后这些字符的轮廓高度相似。如果有余力可以在匹配之后再加一个基于车牌规则的校验——比如第二位不可能是字母I和O第七位不可能是汉字。用这类规则做后处理能再提高一两个百分点的准确率。虽然规则不算复杂但在报告里写出来老师会认为你考虑了实际应用约束印象分会有明显不同。汉字的数量各省简称有几十个如果测试图里出现了模板库没有的汉字识别结果必然是错的。所以答辩之前务必确认测试集里所有出现过的汉字都已经在模板库里建好了。5. GUI整合与答辩准备能跑和能演示是两码事课程设计评分不光看算法效果还看演示和讲解。很多同学代码写得没问题但界面是黑乎乎的纯命令行窗口演示效果会大打折扣。用Matlab的App Designer做一个简单图形界面放上打开图片的按钮、图像显示区域和识别结果文本整体观感会好很多操作也直观。App Designer是R2016a之后推荐的GUI工具比老的GUIDE好用布局和回调函数的组织方式也更接近现代编程习惯。界面不需要复杂核心元素有四个打开图片按钮调用uigetfile选择本地图片。图像显示区域用imshow显示原图和车牌定位后的结果。识别结果显示框用文本控件输出车牌字符串。一个“开始识别”按钮把完整流程串起来。如果你觉得这个界面过于简单可以在界面上用两个axes一个显示原图一个显示车牌区域放大图和分割后的字符图。每点击一步就刷新一次显示等于把处理过程可视化。这个演示过程比任何口头描述都有说服力评分老师一眼就能看出你是否真正理解了整个流程。答辩时老师大概率会问这几个问题提前想好怎么回答为什么用模板匹配而不是深度学习参考答案课程设计的目标是理解传统图像处理流程模板匹配简单直观能完整展示预处理、定位、分割、识别每个环节的逻辑而且不需要额外训练环境。如果需要提升鲁棒性后续可以扩展为CNN方案。如果车牌旋转角度超过15度系统还能识别吗如实回答Hough变换在过大角度时精度会下降当前方案主要针对正常拍摄场景更大角度的倾斜需要引入透视变换处理这也是系统可以继续改进的方向。如何评价识别准确率明确说明在提供的数据集上识别准确率具体是多少自己先跑一遍统计清楚。还要说明在哪些条件下识别率会下降比如逆光、大面积遮挡或者模板库里没有的汉字省份。除了源码本身交付材料也要齐全。把源码、模板库、测试图片、实验报告都放在同一个文件夹里。报告里最好附上运行截图和分阶段效果图包括原图、灰度图、边缘图、形态学处理效果、车牌定位框选结果、字符分割结果、最终识别输出。这些截图放上去整个项目的完成度立刻上一个档次。报告的结构就按处理流程走每一环节放代码片段加效果图加简短说明不需要写得像论文那么正式但逻辑一定要连贯。我个人做这套系统的体会是宁可把定位和分割花80%的精力也别把时间全花在识别算法上。车牌识别链条里定位和分割是有明确“对错”的环节错了可以通过肉眼直接看出来而识别算法只要前两步做好了模板匹配天然能给出不错的结果。很多课设翻车翻就翻在定位框歪了、字符切碎了而不是匹配算法太弱。最后再分享一个实用的小技巧测试素材一定要多准备几组。除了源码自带的正常图片再从网上找几张逆光的、稍微倾斜的、车牌上带泥点的放在额外测试集里。跑一遍把失败的案例记录下来作为报告里的“系统局限性分析”。这一部分在评阅老师那里非常加分因为它说明你真的做了测试而不是只跑通了示例数据。拿到这套源码之后建议先跑通自带数据再逐段打断点理解每一行的作用最后自己换测试图片验证。这套流程走下来课程设计这一关基本就稳了。本文还有配套的精品资源点击获取
返回列表