基于MATLAB车牌识别系统设计

news2024/9/20 16:37:28

基于MATLAB车牌识别系统设计

一、设计方案

  智能交通系统已成为现代社会道路交通发展趋势。在智能交通系统中,车牌自动识别系统是一个非常重要的发展方向。对于车牌识别系统的要满足当车辆通过摄像头采集车辆图片,将其图片进行图像预处理、车牌定位、字符分割、字符识别、输出识别的车牌结果的基本要求。如下图1 车牌识别的应用所示。
车牌识别的应用

图1 车牌识别的应用

  车牌识别是一项利用车辆的动态视频或静态图像进行车牌号码、车牌颜色自动识别的模式识别技术。其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理设备等,其软件核心包括车牌定位算法、车牌字符分割算法和字符识别算法等。一个完整的车牌识别系统应包括车辆检测、图像采集、车牌识别等几部分。当车辆检测部分检测到车辆到达时触发图像采集单元,采集当前的视频图像。车牌识别单元对图像进行处理,定位出车牌位置,再将车牌中的字符分割出来进行识别,然后组成车牌号码输出。车牌识别系统设计方案如下图2所示。
车牌识别系统设计方案

图2 车牌识别系统设计方案

  车牌识别系统各个步骤的作用:

  • 图像预处理:在整个车牌识别系统中,由于采集进来的图像为彩色图像,再加上实际采集环境的影响以及采集硬件等原因,图像质量并不高,其背景和噪声会影响字符的正确分割。和识别,所以在进行车牌分割和识别处理之前,需要先对车牌图像进行图像预处理操作。
  • 车牌定位:首先对车牌的二值图片进行形态学滤波,使车牌区域形成一个连通区域,然后根据车牌的先验知识对所得到的连通区域进行筛选,获取车牌区域的具体位置,完成从图片中提取车牌的任务。
  • 字符分割:首先对车牌进行水平投影,去除水平边框;再对车牌进行垂直投影。通过对车牌进行投影分析可知,与最大值峰中心对应的为车牌中第二个字符和第三个字符的间隔,与第二大峰中心距离对应的即为车牌字符的宽度,并以此为依据对车牌进行分割。
  • 字符识别:本文采用模板匹配方法来对车牌进行识别。识别过程中,首先建立标准字库,再将分割所得到的字符进行归一化,将归一化处理后的字符与标准字库里的字符逐一比较,最后把误差最小的字符作为结果显示出来。

二、设计原理

  该系统主要包括图像输入、图像预处理、车牌定位、字符分割、字符识别五大核心部分。系统的图像预处理模块是将图像经过图像灰度化、图像增强、边缘提取、二值化等操作,转换成便于车牌定位的二值化图像;利用车牌的边缘、形状等特征,再结合Roberts 算子边缘检测、数字图像、形态学等技术对车牌进行定位;字符的分割采用的方法是将二值化后的车牌部分进行寻找连续有文字的块,若长度大于设定的阈值则切割,从而完成字符的分割;字符识别运用模板匹配算法完成。下面我们对基于MATLAB的车牌识别系统各部分设计进行详细的介绍。

1、图像输入

  要实现车牌识别,首先要从计算机中读取含有要识别车牌的图片,为了使用户更方便地从文件系统中直接选取图片,这里使用了uigetfile()函数。uigetfile()函数的调用格式为:[filename,filepath]=uigetfile(),执行此函数可得到供用户选择图片文件的对话框,用户选择要识别的图片并点击“打开”按钮后,会返回此图片的文件名和路径名,分别保存到filename和pathname两个变量中(为了避免用户在对话框中选择非图片文件出现异常,在调用uigetfile()函数时将函数参数设置成了“.png;.jpg”,所以文件选择对话框中只会出现图片文件),然后通过imread()函数将图像数据读出,赋值给变量I,从而实现图像数据的读入。

2、图像预处理

  • 图像灰度化

  输入的彩色图像包含大量颜色信息,会占用较多的存储空间,且处理时也会降低系统的执行速度,因此对图像进行识别等处理时.常将彩色图像转换为灰度图像,以加快处理速度。这里使用了rgb2gray()函数,该函数接收一个彩色图像变量作为参数,返回该图像转换为灰度图后的图像数据。

  • 图像边缘检测

  在车牌定位与字符的识别前我们需先对图片做边缘检测处理,提升图像像素,让图像更容易接下来的后续操作。在进行完边缘检测处理之后,能在相当程度上压低噪声影响、切割出车牌区域、留下完整车牌字符,使其方便接下来的定位与识别。在将彩色图转换为灰度图后,便可用edge()函数识别该图像的边界,edge()函数通过使用一阶导数和二阶导数检测亮度的不连续来确定图像的边界,它可以使用Sobel、Prewitt、Roberts、Canny、Log等多种算子,这里使用Roberts算子进行边缘检测。经预处理的图像如下图3所示。
原图经灰度化、边缘检测处理

图3 原图经灰度化、边缘检测处理

3、车牌定位

  • 图像腐蚀

  由于边缘检测后的图像中无关结构太多,这里需对图像进行腐蚀处理,实现腐蚀处理的函数为imerode(),它接收一个图像数据和一个结构子,图像中背景与结构子完全重合的像素点输出值为1,不完全重合的和完全不重合的像素点输出值为0,最后返回使用该结构子腐蚀过后的图像数据,以此实现削减无关结构的目的。

  • 图像平滑

  腐蚀后的图像结构大多呈分散状分布,不连贯。为了方便之后确认车牌位置,这里需对该图像进行平滑处理,在此我们使用闭操作使车牌平滑,并减小噪音,闭操作可以理解为先膨胀后腐蚀。这里调用imclose()函数实现。

  • 移除对象

  然而通过平滑处理之后,周围像素平均值的平滑处理会导致图像部位内灰度值产生巨大的变化,会使得图像内物体边缘等变得不清晰。我们通常会根据具体方案设置一个适当的阈值在中心像素点以为其周围来减少平滑处理带来的负面影响。只有当当像素点大于我们设置的阈值时,该点才会被替换,当小于阈值时,该点将不会被改变。为了使接下来车牌位置的确定更精确,这里使用了bwareaopen()函数从图象中移除小对象。经过腐蚀、平滑和移除对象处理如下图4所示。
腐蚀、平滑和移除对象处理

图4 腐蚀、平滑和移除对象处理
  • 图像切割

  这里确定车牌位置的思路为:通过前面图像处理,我们要通过代码求出白色区域,即车牌位置。首先求出车牌左右位置,先使用size()函数得到该图像矩阵的行数y和列数x,通过两个for语句嵌套遍历图片所有像素点,第一个for实现从左往右扫描,第二个for实现从上往下扫描,并通过if语句判断像素点是否等于1,如果等于1将列坐标的位置赋值给数组;遍历所有像素点后,返回数组最小值与最大值,即为车牌左右边界。同理,我们可以用相同的方法确定出车牌的上下边界。然后将原图按照上述方法确定的坐标进行裁剪,即可得到仅有车牌的图像。

4、字符分割

  • 车牌二值化

  车牌二值化处理是决定字符分割好坏非常重要的一个步骤,所谓二值化实际上就是把原图中的每个像素点的分别设置为0或255两个值,简单来说就是把整副原图转换成黑白图像。这个二值化主要是在灰度的基础上实际也就是取一个比较合适的值,将字符准确地从车牌中分割出来。过程大致就是选取一个合适的值,若当图中的哪点的灰度值大于这个值时就将该点设为最大255,反之如果图像中的某点的灰度值小于这个值的时候就将该点值设为最小0。因此,只有选取好一个合适的阈值,才能使二值化之后的图像能较好地区分出字符和车牌背景。根据实验经验得知图像最大灰度值减去图像最大灰度值与最小灰度值之差的三分之一可获得令人满意的阈值,二值化的效果较好。选取合适的阈值就能使二值化图像准确的表达图像的车牌区域与其他区域,所以二值化阈值的选取就成为了图像二值化的关键所在。

  • 车牌均值滤波,膨胀和腐蚀处理

  在车牌转换为二值图像后,为了使图像中干扰元素减少,我们对其进行均值滤波,通过fspecial()函数构造均值滤波器,然后使用filter2()函数进行滤波,以减小图中噪音。由于不同原始图像的差异,处理到这里后,字符可能会不连续,也可能会连在一起,这时我们需要再次对滤波后的图像进行腐蚀或者膨胀处理,这里使用判断结构以图中白色部分的面积为判断依据决定使用腐蚀或者膨胀。经过处理的车牌如下图5所示。
二值化、均值滤波、膨胀和腐蚀处理后的车牌

图5 二值化、均值滤波、膨胀和腐蚀处理后的车牌
  • 字符分割

  字符分割可以说在整个系统里起着承前启后的作用,之前所做的所有操作都是为了能够较好地分割出车牌,而字符分割的成功与否也将决定着整个系统的最终结果的好坏。在分离字符之前,我们还要切去车牌边缘的黑色部分,从图像顶部向底部逐行扫描,对扫描到的行求和,若某行全部像素点求和为0,则切去这一行,直到扫描到某一行求和后值不为零,以这一行为上边界。同理,再用相同的方法从其他三个方向扫描,切割出下边界,左边界和右边界,最后得到切去边缘黑色部分的图像。将切割过后,就可以对图片中的字符进行分离了,先对图像从左到右逐列扫描,并将每列中像素点的值进行求和,若和不为零,则向右继续扫描下一列,直到某一列求和后值为零,图像最左侧到这一列之间即为第一个字符,将其切出,然后将该区域内所有像素点赋值为0,重复以上操作直至分离出所有字符。

  • 字符归一化

  分割出字符后为了更方便于接下来的模板匹配,还需要对其进行大小归一化处理。大小归一化就是将尺寸大小不一样的字符变换成尺寸相同的字符。目前常用的主要有两个,一是缩小或放大待识别字符的外框使其变成一特定的大小;另一种则是通过分析字符在两个方向上的像素点做字符归一化,这两种方法都有不足之处,第一种对字符边缘会有较大的干扰,另一种可能让本身外形相似的字符更难以辨别。
由于一些因素影响,经切割出来的字符大小基本都会有些区别,所以在匹配前我们必须对已切割出来的字符做特定的处理。使其与前期做的字符模板的图像大小能够一样,在做过这个处理后,字符就没有较大的出入,这就能更好的解决前面所说因素的影响,这样就更容易与模板库中的字符进行匹配识别。以下图6为经过字符分割、归一化处理后的车牌。
车牌经字符分割、归一化处理后

图6 车牌经字符分割、归一化处理后

5、字符识别

  该系统使用的模板匹配的识别方法,它先依次提取需要识别的字符的二值图像上下左右四个点的像素点,想沿着图像中心方向提取周围像素点,计算出每个像素点与标准模板对应该坐标的像素点的相识度,其中相似度最高的标准字符图就作为需要的字符的对应字。也可以计算出原始图像一些特征像素点之间的距离,再计算出标准模板对应特征点的距离,再判断他们距离的差异。取最小差异的标准模板为结果。但是,由于原始字符在可能会由于拍摄的时候角度原因和图像经过处理后,图像像素点距离发生改变。所以,在对标准模板的设计时应根据实际拍摄角度等多做一些相对于的模板,让比较结果更为精确。
  此处采用相减的方法来求得字符与模板中哪一个字符最相似,然后找到相似度最大的输出。汽车牌照的字符一般有七个,大部分车牌第一位是汉字,通常代表车辆所属省份,或是军种、警别等有特定含义的字符简称;紧接其后的为字母与数字。车牌字符识别与一般文字识别在于它的字符数有限,汉字共约30多个,大写英文字母26个,数字10个。所以建立字符模板库也极为方便。为了实验方便,结合本次设计所选汽车牌照的特点,只建立了7个汉字26个字母与10个数字的模板。其他模板设计的方法与此相同。
  首先取字符模板,接着依次取待识别字符与模板进行匹配,将其与模板字符的像素点进行判断,如果对应像素点相等的点数越多,那么就越匹配,即为识别出来的结果。具体操作流程如下图7所示。
车牌识别流程

图7 车牌识别流程

三、结果展示

  车牌识别系统完整界面效果展示:
系统展示

代码:https://gitee.com/lovelots/vehicle-license-plate-recognition-system

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1366262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于FPGA仿真复位信号和实际板子复位信号的吐血大坑

最近在研究mipi dphy IP下载到板子上进行验证的初步流程问题 IP的example案例里面,系统复位全是高电平复位,低电平工作 想当然的打通IP流程,写工程的时候也使用了高电平复位,低电平复位 结果调试了N轮,init_done信号一…

通用web自动扩缩容_智能运维引擎CudgX

一、概述 CudgX是星汉未来自主研发的面向云原生时代的智能运维引擎,支持根据 MetricQPS 分段耗时指标进行自动扩缩容。 通过各类服务的多维度、大规模的日志数据采集以及机器学习训练分析,对服务进行数字化、指标化度量,并基于部署的…

基础算法【解题思路】:单链表的倒数第k个节点

定义指针p1,让p1走k步: 定义指针p2,在p1走了k步的时候,p2也跟着走。 p1走到最后的时候走了n-k步,停留在最后的null结点。 P2从头结点开始,也跟着走到了n-k步,而n-k恰好是倒数第k个节点。 例…

TypeScript 从入门到进阶之基础篇(六) 类型(断言 、推论、别名)| 联合类型 | 交叉类型

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇TypeScript 从入门到进阶…

css - 渐变样式实现(渐变边框 + 渐变背景)

.select {border-bottom: 2px solid; /* 下边框 */border-image: linear-gradient(90deg,rgba(250, 173, 20, 0) 0%,rgba(250, 173, 20, 1) 51.46%,rgba(125, 87, 10, 0) 100%)1; /* 边框渐变 */background-image: radial-gradient(circle at 49% 238%, #faad14, transparent 7…

2023APMCM亚太数学建模C题 - 中国新能源汽车的发展趋势(2)

五.问题二模型建立和求解 5.1 问题二模型建立和求解 针对题目二,题目要求收集中国新能源电动汽车行业发展数据,建立数学模型描述,并预测未来十年的发展。由于在第一文中,我们已经收集了一定的新能源行业发展数据&…

马尔可夫算法及其实例(预测类模型)

马尔科夫预测模型是一种基于马尔科夫过程的预测方法。马尔科夫过程是一类具有马尔科夫性质的随机过程,即未来的状态只依赖于当前状态,而与过去状态无关。这种过程通常用状态空间和状态转移概率矩阵来描述。 在马尔科夫预测模型中,系统被建模为…

提升工作效率:IDEA配置优化总结指南

idea 配置优化总结 配置优化优化性能优化JVM参数使用 jconsole 监控 full gc 频率关闭代码检查设置编译进程和Maven的堆值取消自动构建 修改快捷键System Settings个性化设置设置主题修改字体Color SchemeCode Style 包类设置设置maven自动导包显示pom依赖关系图,解…

【docker笔记】Docker网络

Docker网络 容器间的互联和通信以及端口映射 容器IP变动时候可以通过服务名直接网络通信而不受到影响 常用命令 查看网络 docker network ls创建网络 docker network create XXX网络名字查看网络源数据 docker network inspect XXX网络名字删除网络 docker network rm…

可视化监控EasyCVR视频分析/云存储平台iframe地址播放异常该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

Pytorch框架学习笔记

官网- PyTorch Tensor 构造随机初始化矩阵 xtorch.rand(5,3) 构造全0矩阵,数据类型为long xtorch.zeros(5,3,dtypetorch.long) 获取维度信息 x.size() tensor加法 torch.add(x,y) xy y…

如何用Chat分析本地化运维服务有哪些?

问CHAT:本地化运维服务有哪些? CHAT回复:本地化运维服务主要包括以下几大部分: 1. 系统监控和管理:密切关注系统的性能,实时发现并解决可能出现的问题,以确保服务的稳定和可用性。 2. 数据备份…

python 各级目录文件读取

目录结构 import pytestdef test_01():# 同级文件with open(1.txt, r, encodingutf-8) as file:content file.read()print(content)def test_02():# 同级目录的下的文件with open(rupfile/2.txt, r, encodingutf-8) as file:content file.read()print(content)def test_03():…

Python编程+copilot+代码补全+提高效率

Python编程copilot代码补全提高效率 copilot是由Github和OpenAI合作开发的一款AI编程工具,它可以根据自然语言或部分代码,自动给出合适的代码补全建议。copilot支持多种编程语言,包括Python,也可以在Pycharm等主流IDE中使用。本资…

Java学习苦旅(二十六)——反射,枚举和lamda表达式

本篇博客将讲解反射,枚举和lamda表达式。 文章目录 反射定义用途反射基本信息反射相关的类Class类Class类中相关的方法 反射示例反射的优缺点优点缺点 枚举背景及定义常用方法枚举优缺点优点缺点 Lambda表达式背景语法函数式接口定义基本使用 变量捕获Lambda在集合…

基于docker环境搭建Mysql主从

文章目录 Mysql主从搭建1.1 Master搭建1.2 Slave搭建1.3 主从复制 1.4 验证 Mysql主从搭建 ​ mysql主从复制的原理将主数据库的增删改查等操作记录到二进制日志文件中,从库接收主库日志文件,根据最后一次更新的 起始位置,同步复制到从数据…

简单的excel填充

简单的excel填充 先导入相关依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.16</version></dependency><dependency><groupId>org.apache.poi</groupId><…

UE5 使用代码开发UE设置,以及创建基于类的蓝图

此文章用于记录当前学习的重要的点。 基础设置 首先设置项目的偏好向&#xff0c;方便后续开发。 打开编辑器偏好设置 设置使用的代码编辑器 关闭实时代码编写功能。 关闭自动编译新添C类&#xff0c;我们直接在代码编辑器内编译 修改版权声明 修改打开资产时&#xff0…

【AI视野·今日Robot 机器人论文速览 第七十一期】Fri, 5 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Fri, 5 Jan 2024 Totally 11 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Machine Learning in Robotic Ultrasound Imaging: Challenges and Perspectives Authors Yuan Bi, Zhongliang Jiang, Felix D…

第2章 JavaScript基本语法

学习目标 了解什么是变量&#xff0c;能够说出变量的概念 掌握变量的命名规则&#xff0c;能够为变量命名 掌握变量的声明与赋值&#xff0c;能够声明变量并为其赋值 熟悉数据类型的分类&#xff0c;能够说出JavaScript中有哪些数据类型 掌握常用的基本数据类型&#xff0c…