【保姆级】基于matlab自动识别车辆号牌设计与实现
内容概要:
我们提供了一个基于MATLAB的自动车辆号牌识别系统资源,该系统能够从彩色和灰度图像中自动识别车辆号牌号码。该系统包括一个详细的README文档,指导用户如何实现算法,包括创建字符和数字模板、图像预处理、阈值确定、噪声清理、对象检测、字符识别和结果导出等步骤。此外,文档还提供了成功和不太成功的案例分析,以及对算法性能的讨论和改进建议。
适用人群:
该资源适合以下人群使用:
- 计算机视觉领域的研究人员和学生。
- 从事智能交通系统开发的专业工程师。
- 对车牌识别技术感兴趣的爱好者和开发者。
- 需要在其项目中集成车牌识别功能的企业和开发者。
使用场景及目标:
该资源可用于多种场景,包括但不限于:
- 停车场自动化管理系统,自动识别车辆进出,计算停车费用。
- 交通监控系统中,统计特定时间段内的车辆流量。
- 公共安全领域,用于监控和追踪特定车辆。
- 任何需要自动化车牌识别功能的定制解决方案。
该系统的目标是提供一个高效、可定制的车牌识别算法,能够在不同条件下准确识别车牌,并通过提供的性能分析帮助用户理解算法的局限性和潜在改进方向。
其他说明:
- 用户需要具备MATLAB软件的使用知识,以及图像处理工具箱。
- 该资源提供了一个算法框架,用户可能需要根据自己的具体需求进行调整和优化。
- 系统的性能可能受到图像质量、车牌的可见度和拍摄角度等因素的影响。
- 算法的改进建议包括创建多样化的模板、使用图像隔离技术以及增强噪声过滤,以适应不同的应用环境和提高识别准确率。
源码结构
├─create_templates.m
├─imgfildata.mat
├─LICENSE
├─number_plate_det.m
├─plate_segmentation.m
├─training_imgfildata.m
├─文档.md
├─test images
| ├─good
| | ├─image5.jpg
| | ├─images.jpg
| | ├─IMG.JPG
| | ├─IMG5.JPG
| | ├─israeli test2.jpg
| | ├─jersey58.jpg
| ├─fail
| | ├─20180402113123_NumberPlate_Swift.jpg
| | ├─a110_l7_b.jpg
| | ├─car.jpg
| | ├─IMG_20210201_113303-scaled-e1612179429759.jpg
| | ├─montenegro6.jpg
| | ├─Registrations-plate_01.jpg
| | ├─test.png
| | └test2.jpg
├─letters_numbers
正文开始
背景:
在当今世界,出于多种原因,我们需要识别各种车辆的号牌。例如,在停车场中自动识别车牌可能有助于多种方式。例如,不必在停车场入口处设置警卫,而是可以在出入口放置摄像头,以便摄像头扫描车辆号码,从而自动计算应支付的停车时间。
需要识别车牌的其他情况:
- 道路上的车辆数量(以调节负载)
- 监控公务员等
挑战:
如上所述,我们对识别车辆号牌感兴趣。在世界的不同地区,车牌有不同的标准:车牌的大小、字符的大小和字体类型、字符的类型(字母和数字,只有字母/只有数字),如下例所示:
任务:
- 实现一个算法,该算法可以从彩色和灰度图像中识别出车辆号牌号码。
- 在至少7张图像上展示算法的成功性能。
- 在至少7张图像上展示算法的部分工作/失败性能。
- 解释所获得的结果并得出结论。
解决方案方法:
初步要求以实现算法:
- 一台安装了MATLAB软件的计算机(PC/Mac)。
- 图像处理工具箱。
- 一台摄像头(用于捕获车牌)
步骤 1: 创建字符和数字模板
- 首先,找到同一类型的车牌(建议2个或更多),例如:
2.从每个车牌中分别提取每个字母/字符。
3.将提取的图像保存到专用文件夹中,确保尺寸统一,图像格式为.BMP。
4.执行以下处理:
-
原始 - bmp
-
Im2gray
-
Imbinarize(二值化,使用~前)
- Imbinarize(二值化,使用后)
保存模板(“temp”):
到目前为止,我们已经做到了这一步:
步骤 2: 用户选择图像
步骤 3: 处理
-
步骤 3.1
-
首先,将图像尺寸更改为300x500,然后将图像转换为灰度,如下所示:
- before:(之前)
- after:(之后)
-
-
步骤 3.2
- 现在,让我们使用‘graythresh’函数找到阈值水平,阈值水平在[0,1]之间。之后,让我们使用我们刚刚找到的阈值水平将图像转换为黑白,然后使用‘~’取反。
-
before:(之前)
-
after:
-
步骤 3.3
-
before (image a):(之前,图像a)
-
if statement (image b):(如果语句,图像b)
-
image a minus image b:(图像a减去图像b)
-
-
步骤 3.4
-
首先,我清除了图像中的所有噪声。之后,我使用了‘bwlabel’函数,该函数返回两个参数:
- L(标签矩阵)- 在其中每个白色区域由具有独特特征索引的独立单元表示的矩阵。意思是,标记为0的像素是背景。标记为1的像素组成一个对象;标记为2的像素组成第二个对象;依此类推。
- Ne - 表示连接对象(数字/字符)的数量。
-
然后,我使用了‘regionprops’函数,该函数返回每个边界框的‘boundingboxes’向量,配置如下:每个边界框的[left top horizontal vertical]。
-
最后,我使用‘rectangle’函数(绿色)在我发现的位置绘制了边界框。
-
步骤 3.5
- Final_output=[] 是最终保存结果的向量。
- 我们将在循环中从1迭代到上一步计算出的连接对象的数量(Ne)。
- 只获取包含在边界框内的每个像素,并将其实大小更改为我们在算法开始时创建的模板大小。
- 然后我们将模板的数量保存在变量 - ‘totalLetters’中。
- 注意:我们创建的变量‘x’是一个向量,它将存储检测到的对象与我们的预制模板之间的相关性水平。
步骤 4:
-
在循环中,我们将检查我们所有的预制模板,并在每次迭代中查找当前边界框与模板之间的相关性。
-
我决定,字符/数字的检测将从至少0.45的相关性开始。
-
检测到的字符将是与某个预制模板具有最高相关性水平的字符。
-
我们将检测到的字符存储在变量‘Final_output’中。
-
例如,如果我想检测数字‘0’:
- 字符将被识别为‘0’,因为0.96 > 0.88
步骤 5 & 6: 保存结果并导出到.txt
-
原始图像:
-
检测到的车牌:
-
一些成功的结果
-
一些不太成功的结果
讨论和结论
-
算法何时表现良好?
- 当车牌在整个图像中分布均匀时。
- 当预制模板与图像中的模板相似时。
- 当车牌被直接拍摄,没有偏斜或倾斜时。
-
算法何时表现不佳?
- 当图像的捕获带有偏斜,导致与模板失配,由于失真。
- 当车牌在整张图像中只占一小部分。
- 当车牌字符与预制模板的字体不同。
-
这个算法如何改进?
-
创建包含多种字体的大型预制模板。
-
在车牌在整张图像中只占一小部分的情况下,可以使用图像隔离算法,然后再执行识别算法 - 如下所示:
-
最后,进行更严格的噪声过滤。
-