0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于MATLAB的车牌识别基本原理及算法讲解

新机器视觉 来源:古月居 作者:古月居 2022-11-29 10:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一:GUI界面预览

723631e6-6f77-11ed-8abf-dac502259ad0.png

二:选择图片

725c0d26-6f77-11ed-8abf-dac502259ad0.png

使用uigetfile函数打开一个模态对话框,其中列出了当前文件夹中的文件。

在这里选择或输入文件的名称。选择文件点击打开时,uigetfile将返回文件名。

如果点击取消或窗口关闭按钮 (X),uigetfile 将返回 0。

对应的GUI界面如下:

726fe2ec-6f77-11ed-8abf-dac502259ad0.png

三:预处理

(1)灰度化

7281f702-6f77-11ed-8abf-dac502259ad0.png

使用Rgb2gray函数将 RGB 图像或颜色图转换为灰度图,图像预处理的第一步是图像灰度化处理。该步骤使图像占用空间减少。

灰度化处理结束后输出灰度化图像与灰度直方图:

7292557a-6f77-11ed-8abf-dac502259ad0.png

对应的GUI界面如下:

72a6e5ee-6f77-11ed-8abf-dac502259ad0.png

(2)边缘检测

72bf4774-6f77-11ed-8abf-dac502259ad0.png

使用edge函数进行边缘检测,在使用edge函数时可以指定要检测的边缘的方向。Sobel 和 Prewitt 方法可以检测垂直方向和/或水平方向的边缘。

Roberts 方法可以检测与水平方向成 45 度角和/或 135 度角的边缘。

经过分析和实践,使用Sobel方法效果较好,该函数的第三个参数为二值化阈值,把比该值大的置为1

为了在GUI中方便调试,我们把边缘检测的阈值设定为一个变量edit2_aa,该变量的值可以通过GUI中的文本框进行设定,如下所示:

72d08fac-6f77-11ed-8abf-dac502259ad0.png

对应的GUI界面如下:

72e128a8-6f77-11ed-8abf-dac502259ad0.png

四:车牌定位

(1)图像腐蚀

使用imerode() 函数进行图像腐蚀,来去除上一步边缘检测后遗留的噪声点, J = imerode(I,SE) 腐蚀灰度图像、二值图像或压缩二值图像 I,返回腐蚀图像 J。

其中SE 是结构元素对象或结构元素对象的数组,由 strel 或 offsetstrel 函数返回。本列中由strel函数返回结构元素SE。

为方便在GUI中进行调试,矩形结构元素的行数由GUI中可编辑文本框输入,默认为2,列数固定为1

对应的GUI界面如下:

72ed4624-6f77-11ed-8abf-dac502259ad0.png

可以发现经过图像腐蚀后,去除了除车牌外的干扰点

(2)平滑处理

72fe23a4-6f77-11ed-8abf-dac502259ad0.png

使用 imclose函数,即闭运算:用结构元素对图像先膨胀,再腐蚀。对图像进行平滑处理,闭运算可以用来融合窄的缺口和细长的弯口,去掉小洞,填补轮廓上的缝隙

本部分的结构元素采用一个大小为 [n n] 的矩形结构,其中矩形结构的行数及列数由GUI的可编辑文本框进行设定

对应的GUI界面如下:

731394be-6f77-11ed-8abf-dac502259ad0.png

可以发现经过平滑处理后,覆盖的区域跟车牌区域吻合度更好了,便于车牌的定位和切割

(3)移除对象

732666b6-6f77-11ed-8abf-dac502259ad0.png

使用bwareaopen 函数可以用于从二值图像中删除小对象。该函数使用格式为 BW2 = bwareaopen(BW,P) 从二值图像 BW 中删除少于 P 个像素的所有连通分量(对象)并生成另一个二值图像 BW2。此运算称为面积开运算。

为GUI方便调试,我将bwareaopen函数的第二个参数,通过GUI可编辑文本框输入,并进行调试

对应的GUI界面如下:

733a4a0a-6f77-11ed-8abf-dac502259ad0.png

由于前一步的平滑处理后并没有小区域,所以对此步而言,效果并不明显。

(4)定位剪切

73481d60-6f77-11ed-8abf-dac502259ad0.png

735ff8b8-6f77-11ed-8abf-dac502259ad0.png

7388a4ca-6f77-11ed-8abf-dac502259ad0.png

对应的GUI界面如下:

73a093f0-6f77-11ed-8abf-dac502259ad0.png

可以发现通过前面的边缘处理、图像腐蚀、平滑处理、移除对象等操作,图像裁剪效果较好。

五:车牌识别

(1) 灰度处理

73acbf54-6f77-11ed-8abf-dac502259ad0.png

对原图像进行车牌定位,并把车牌裁剪出来后,要重新进行灰度处理,便于后续的操作。

对应的GUI界面如下:

73bccf2a-6f77-11ed-8abf-dac502259ad0.png

(2)直方图均衡化

73d2ff66-6f77-11ed-8abf-dac502259ad0.png

使用 histeq 函数进行直方图均衡化来增强对比度 其函数使用格式为J = histeq(I,n) 其中I为变换灰度图像,J为输出灰度图像,它具有 n 个 bin 的直方图大致平坦。为方便调试,我们将n的值通过GUI的可编辑文本框进行输入

73f705f0-6f77-11ed-8abf-dac502259ad0.png

对应的GUI界面如下:

7407b292-6f77-11ed-8abf-dac502259ad0.png

(3) 二值化图像

741a6a90-6f77-11ed-8abf-dac502259ad0.png

使用 imbinarize函数进行二值化 ,通过阈值化将二维灰度图像或三维体二值化 ,该函数通过将所有高于全局阈值的值替换为 1 ,并将所有其他值设置为 0,从二维或三维灰度图像 I 创建二值图像。

在默认情况下,imbinarize 使用 Otsu 方法,该方法选择特定阈值来最小化阈值化的黑白像素的类内方差

imbinarize(I,T) 使用阈值 T 从图像 I 创建二值图像。T 可以是指定为标量亮度值的全局图像阈值,也可以是指定为亮度值矩阵的局部自适应阈值 ,为方便调试,我们将T的值通过GUI的可编辑文本框进行输入。

对应的GUI界面如下:

7439b198-6f77-11ed-8abf-dac502259ad0.png

(4) 移除对象

7447b66c-6f77-11ed-8abf-dac502259ad0.png

使用bwareaopen 函数可以用于从二值图像中删除小对象。该函数使用格式为 BW2 = bwareaopen(BW,P) 从二值图像 BW 中删除少于 P 个像素的所有连通分量(对象)并生成另一个二值图像 BW2。此运算称为面积开运算。

为GUI方便调试,我将bwareaopen函数的第二个参数,通过GUI可编辑文本框输入,并进行调试

进行此步骤的目的是去除裁剪后车牌的白边和噪声点、干扰点等对后续字符切割造成干扰的信息

对应的GUI界面如下:

745bf78a-6f77-11ed-8abf-dac502259ad0.png

通过对比,可以明显的观察到,经过车牌识别移除对象操作,很好的去除了B和8之间的圆点,这个圆点如果不去除,对后续的裁剪将会造成很大的干扰。

除此之外,位于车牌轮廓的白线及其他噪声点也被消除掉了,经过此步后,车牌内容只剩下要识别的七个字符,对后续的裁剪打下来良好的基础。

(5) 中值滤波

746e6f0a-6f77-11ed-8abf-dac502259ad0.png

使用 medfilt2 函数进行二维中位数滤波, 其格式为 J = medfilt2(I,[m n]) 执行中位数滤波时,其中每个输出像素包含输入图像中对应像素周围的 m×n 邻域中的中位数值。

在此处添加该步骤并不是为了滤除孤立的噪声点,仅仅是为了将图像字符的边界进行平滑处理,属于对图像的优化操作,若前面的步骤进行的较好,则本步骤的作用并不明显。

因此,在操作时可以根据需要灵活选择是否跳过该步骤。

对应的GUI界面如下:

74861eb6-6f77-11ed-8abf-dac502259ad0.png

通过对比,可以明显的观察到,经过车牌识别移除对象操作,很好的去除了B和8之间的圆点,这个圆点如果不去除,对后续的裁剪将会造成很大的干扰。

除此之外,位于车牌轮廓的白线及其他噪声点也被消除掉了,经过此步后,车牌内容只剩下要识别的七个字符,对后续的裁剪打下来良好的基础。

(6) 图像切割(本部分程序较长,就不放了,见工程文件435-528行,及my_imsplit函数)

该步骤进行的操作及思路为:首先读取经过中值滤波后的图像数据,调用我们写的my_imsplit函数,对图像进行初步裁剪。

在该函数中,依次进行了:获取图像的大小、获取字符的顶部位置、获取字符的底部位置、获取字符的左边界、获取字符的右边界、得到宽和高、裁剪等步骤

其中在通过size函数得到图像的尺寸信息后,从第一行开始按行向下搜索,找到第一个行像素和非零的行作为图片的顶部位置,然后从左后一行,向上搜索,找到第一个行像素和非零的行作为图片的底部位置,同理和获得左边界和右边界

为了方便后续识别,我们在找出的上下边界的基础上,向上和向下各拓展了10个像素(若叠加后不超出边界)

之后的到裁剪后的宽度和高度,调用MATLAB的imcrop函数,对图像进行裁剪,该函数用于返回图像的。

一个裁剪区域,该函数的第一个参数为需要裁减的图像,第二个参数为一个包含四个元素的行向量,其中第一个和第二个元素为裁剪的左上角的坐标点,第三第四个元素为裁剪后的宽度和高度

回到主函数文件中,在裁剪完成后进行的操作是第一个字符的切割,首先通过找到第一个像素和非零的列,来作为第一个字符的左边界,在此基础上继续向右搜索。

找到第一个像素和为零的列,作为右边界,接下来通过找到的该字符的宽度与车牌整体宽度的比值来判断是否裁剪异常,若异常则选取左右边界内像素和最小的列作为右边界,并将其置零。并进行多项异常检测与纠正。

每裁剪出一个字符,就将车牌中其对应位置的像素均清零,方便后续搜寻

同理可以得到后面的六个字符,将裁剪后的字符的大小统一制定为[40 20],进行保存,并绘制出图像

其切割效果如下:

749cf078-6f77-11ed-8abf-dac502259ad0.png

可以发现切割效果较好

(7)模板匹配

74ab9114-6f77-11ed-8abf-dac502259ad0.png

74c581fa-6f77-11ed-8abf-dac502259ad0.png

74e45396-6f77-11ed-8abf-dac502259ad0.png

我们将要识别的字符放置到一个字符串中,该字符串的第1到第10的元素存放数字0到9,第11到34的元素存放字母A~Z(除I和O),第35个存放汉字鲁。

对于每个字符,我们首先读取之前裁剪出的车牌字符,并调整图片的大小,进行二值化处理,对于第一个字符设定其搜索范围为35,第二个字符搜索范围为11到34,其余的字符搜索范围为1到34。

接着读取字符库的图片模板跟车牌中裁剪出的字符进行匹配,此处的匹配我们用了两种方法,基础方法是对比两张图片的每一个像素点,统计其不相等的像素个数,并将相似度最高的模板作为识别结果,并将识别的结果通过msgbox函数进行展示。

识别结果为:

74fae84a-6f77-11ed-8abf-dac502259ad0.png

六:结果转换

(1) 车牌模板匹配

750b2b88-6f77-11ed-8abf-dac502259ad0.png

IDFind函数的作用是,输入一个字符串,也就是识别出的车牌,将其与模板库里的车牌进行匹配,寻找相似度最高的一个作为匹配结果。

其中IDLib用来存放需要匹配的车牌号与其对应的隐含信息等,该函数返回量依次为,匹配的车牌号、设定的其他隐含信息

(2) 生成二维码

751e6982-6f77-11ed-8abf-dac502259ad0.png

该部分用于识别的车牌匹配出的数字信息转换成二维码进行显示,包含了要求的灰度二维码以及拓展提高的QR二维码

其中QRcode函数用来生成QR二维码,其代码如下:

752f63b8-6f77-11ed-8abf-dac502259ad0.png

其中graycode函数用来生成灰度二维码,其代码如下:

75437c72-6f77-11ed-8abf-dac502259ad0.png

灰度二维码的转换过程为:将匹配的数字信息传入该函数,对每一个学号进行提取,并按比例放缩到0 ~ 255像素之间,也就是转换成灰度值进行显示,将0 ~ 255划分成10部分依次对应数字0~10。

对应的GUI界面如下:

756c9742-6f77-11ed-8abf-dac502259ad0.png

七:使用神经网络进行车牌识别

(1) 网络训练

将已有的切割出的N个车牌字符作为输入量,其对应的正确的识别字符在licode中的索引值作为输出值进行网络训练,首先我们需要挨个读入字符照片(40x20),然后将其通过sum(:2)转换为列向量。

这样最终得到的40xN打的矩阵作为训练网络的输入值,其中N为训练的字符个数,调节好神经网络的参数后,对网络进行数据进行归一化处理,并调用网络进行网络训练。

将训练好的网络通过save命令进行保存,同时两个归一化参数也需要保存,供后续识别使用。

(2) 调用训练好的网络进行车牌识别

757d067c-6f77-11ed-8abf-dac502259ad0.png

其中BP_NET()函数用来调用训练好的网路进行识别,其代码见工程文件BP_NET.m,在BP_NET()函数中,首先要读取训练好的网络及归一化变量,对读入的每个切割出的字符要进行处理。

将其转换为40x1的列向量,每次车牌识别需要识别六个字符(鲁字不识别),最终得到的40x6的数组作为输入量进行网络预测,调用网络进行预测,将预测的车牌号作为返回量进行输出。

(3) 算法切换的实现

759c322c-6f77-11ed-8abf-dac502259ad0.png

其中BP_NET()函数用来调用训练好的网路进行识别,其代码见工程文件BP_NET.m,在BP_NET()函数中,首先要读取训练好的网络及归一化变量,对读入的每个切割出的字符要进行处理。

将其转换为40x1的列向量,每次车牌识别需要识别六个字符(鲁字不识别),最终得到的40x6的数组作为输入量进行网络预测,调用网络进行预测,将预测的车牌号作为返回量进行输出。

通过GUI界面的一个按钮组进行算法的选择与切换,如下所示:

75af2602-6f77-11ed-8abf-dac502259ad0.png

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • matlab
    +关注

    关注

    189

    文章

    3028

    浏览量

    239173
  • GUI
    GUI
    +关注

    关注

    3

    文章

    699

    浏览量

    43852

原文标题:基于MATLAB的车牌识别基本原理及算法讲解

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    瑞芯微(EASY EAI)RV1126B 车牌识别

    1.车牌识别检测简介EAI-LPR是一个高性能中文车牌识别框架,识别速度快。准确率高,在出入口场景下,准确率可达98%;支持多种
    的头像 发表于 04-03 09:54 659次阅读
    瑞芯微(EASY EAI)RV1126B <b class='flag-5'>车牌</b><b class='flag-5'>识别</b>

    时钟芯片的基本原理及行业应用

    随着数智化社会的不断发展,时钟芯片作为数字电路中控制时间的核心部件,已经成为智能设备不可分割的一部分。本文将对时钟芯片的基本原理及行业应用进行详细的分析,帮助大家更好地了解这一领域的发展趋势。一
    的头像 发表于 03-17 15:53 6159次阅读
    时钟芯片的<b class='flag-5'>基本原理</b>及行业应用

    自适应滤波算法介绍之维纳滤波器的基本原理和应用示例

    前面我们介绍了匹配滤波器,本文将介绍维纳滤波器。首先我们回顾了维纳滤波的主人公Norbert Wiener,然后描述了维纳滤波的基本原理和推导,最后给出一个简单的维纳滤波应用。
    的头像 发表于 01-07 15:22 3048次阅读
    自适应滤波<b class='flag-5'>算法</b>介绍之维纳滤波器的<b class='flag-5'>基本原理</b>和应用示例

    【上海晶珩睿莓 1 开发板试用体验】车牌识别

    【上海晶珩睿莓 1 开发板试用体验】车牌识别 本文介绍了上海晶珩睿莓 1 单板计算机结合 LPRNet 算法和 Ultralytics 库实现物车牌
    发表于 01-02 20:53

    基于级联分类器的人脸检测基本原理

    本次分享的内容是基于级联分类器的人脸检测基本原理 1) 人脸检测概述 关于人脸检测算法,目前主流方法分为两类,一类是基于知识,主要方法包括模板匹配,人脸特征,形状和边缘,纹理特征,颜色特征
    发表于 10-30 06:14

    简述冲击电压发生器的基本原理

    冲击电压发生器的基本原理是 “电容并联充电、串联放电”,核心流程分三步: 先通过整流电路,将工频交流电转换为直流电,给多组电容器并联充电,储存足够电能并达到设定电压; 当充电完成后,触发高压开关使
    发表于 10-17 14:10

    迅为RK3568开发板模型推理测试实战LPRNet 车牌识别

    迅为RK3568开发板模型推理测试实战LPRNet 车牌识别
    的头像 发表于 08-25 14:55 1540次阅读
    迅为RK3568开发板模型推理测试实战LPRNet <b class='flag-5'>车牌</b><b class='flag-5'>识别</b>

    单相调压器和三相调压器的基本原理与主要结构

    调压器在电力系统中扮演着至关重要的角色,无论是单相调压器还是三相调压器,它们都在各自的应用场景中发挥着调节电压、稳定电力、保护设备的作用,了解这两种调压器的基本原理与主要结构,对于电力系统的设计和运维具有重要意义。本文将和大家一起探讨单相调压器和三相调压器的基本原理与主要
    的头像 发表于 08-05 15:27 1444次阅读

    北京迅为itop-3588八核开发板瑞芯微NPU例程测试LPRNet车牌识别

    北京迅为itop-3588八核开发板瑞芯微NPU例程测试LPRNet车牌识别
    的头像 发表于 07-23 14:14 1375次阅读
    北京迅为itop-3588八核开发板瑞芯微NPU例程测试LPRNet<b class='flag-5'>车牌</b><b class='flag-5'>识别</b>

    【BPI-CanMV-K230D-Zero开发板体验】+车牌识别处理与应用方法

    目前在许多的公共场所,如商场、学校、小区等都已采用车牌的自动识别管理,那如何自己也来实现这样的管理呢? 其实,较好的选择就是选取K230D-Zero开发板,因为它本身就具体了这样的基础,提供相应
    发表于 07-17 14:22

    火车车号识别系统的基本原理是什么?

    火车车号识别系统基于先进的计算机视觉和深度学习技术,实现了对铁路车辆信息的自动化采集与识别。该系统主要由数据采集、图像处理、特征提取和智能识别四大模块组成,能够高效准确地识别各类火车车
    的头像 发表于 07-07 10:55 1099次阅读

    铁路车号识别系统的基本原理与应用

    铁路车号识别系统是铁路运输智能化管理的关键技术之一,它通过自动化手段实现对货运列车的高效精准识别,为矿区及铁路运输管理提供了重要的技术支撑。以下从系统原理、核心组件及技术优势三个方面展开说明。 一
    的头像 发表于 07-07 10:30 1321次阅读
    铁路车号<b class='flag-5'>识别</b>系统的<b class='flag-5'>基本原理</b>与应用

    有偿求助!esp32cam摄像头车牌识别代码执行时,上位机闪退

    esp32cam摄像头车牌识别在操作执行识别车牌打开摄像头,上机位直接闪退,摄像头在例程检测是有图片的,有偿找一个能帮我修改整体代码的
    发表于 06-03 16:18

    了解信号完整性的基本原理

    ,设计人员必须注意电路板布局并使用适当的导线和连接器,从而最大限度地减少反射、噪声和串扰。此外,还必须了解传输线、阻抗、回波损耗和共振等基本原理。 本文将介绍讨论信号完整性时使用的一些术语,以及设计人员需要考虑的问题,然后介绍 [Amphenol] 优异的电缆和
    的头像 发表于 05-25 11:54 1582次阅读
    了解信号完整性的<b class='flag-5'>基本原理</b>

    车牌识别新花样:树莓派打造智能车牌监控系统!

    树莓派是创客们打造家庭安防系统的热门之选,这得益于其具备运用人工智能(AI)的能力。AI系统能识别潜在威胁,在此情境下,还能识别过往车辆的牌照信息。创客YashIndane就开发了一款这样的车牌
    的头像 发表于 04-26 09:03 742次阅读
    <b class='flag-5'>车牌</b><b class='flag-5'>识别</b>新花样:树莓派打造智能<b class='flag-5'>车牌</b>监控系统!