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
    +关注

    关注

    179

    文章

    2946

    浏览量

    229433
  • GUI
    GUI
    +关注

    关注

    3

    文章

    631

    浏览量

    39271

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

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

收藏 人收藏

    评论

    相关推荐

    神经网络的基本原理及Python编程实现

    神经网络作为深度学习算法的基本构建模块,模拟了人脑的行为,通过互相连接的节点(也称为“神经元”)实现对输入数据的处理、模式识别和结果预测等功能。本文将深入探讨神经网络的基本原理,并结合Python编程实现进行说明。
    的头像 发表于 07-03 16:11 186次阅读

    卷积神经网络的基本原理和应用范围

    卷积神经网络(Convolutional Neural Network,简称CNN)是一种深度学习模型,广泛应用于图像识别、语音识别、自然语言处理等领域。本文将详细介绍卷积神经网络的基本原理
    的头像 发表于 07-02 15:30 510次阅读

    卷积神经网络的基本原理、结构及训练过程

    卷积神经网络(Convolutional Neural Network,简称CNN)是一种深度学习算法,广泛应用于图像识别、视频分析、自然语言处理等领域。本文将详细介绍卷积神经网络的基本原理、结构
    的头像 发表于 07-02 14:21 960次阅读

    反向传播神经网络建模的基本原理

    等方面取得了显著的成果。本文将详细介绍BP神经网络的基本原理,包括网络结构、激活函数、损失函数、梯度下降算法、反向传播算法等。 神经网络概述 神经网络是一种模仿人脑神经元结构的计算模型,由大量的神经元(或称为节点)组成。每个神经
    的头像 发表于 07-02 14:05 176次阅读

    AI车牌监测识别摄像机

    AI车牌监测识别摄像机是一种基于人工智能技术的高级监控设备,用于识别和记录车辆的车牌信息。该摄像机利用深度学习算法和图像
    的头像 发表于 04-02 09:55 302次阅读
    AI<b class='flag-5'>车牌</b>监测<b class='flag-5'>识别</b>摄像机

    项目分享|基于ELF 1开发板的车牌识别系统

    该项目选用ElfBoardELF1开发板作为核心硬件平台,利用USB接口连接的摄像头捕捉并识别车牌信息。一旦车牌成功识别,系统会触发绿灯指示,并将
    的头像 发表于 03-12 09:22 338次阅读
    项目分享|基于ELF 1开发板的<b class='flag-5'>车牌</b><b class='flag-5'>识别</b>系统

    无功补偿装置的基本原理及作用

    无功补偿装置的基本原理及作用
    的头像 发表于 11-27 10:46 504次阅读
    无功补偿装置的<b class='flag-5'>基本原理</b>及作用

    开关电源的基本原理与设计

    电子发烧友网站提供《开关电源的基本原理与设计.rar》资料免费下载
    发表于 11-17 09:53 3次下载
    开关电源的<b class='flag-5'>基本原理</b>与设计

    开关电源的基本原理

    电子发烧友网站提供《开关电源的基本原理.doc》资料免费下载
    发表于 11-15 11:01 1次下载
    开关电源的<b class='flag-5'>基本原理</b>

    OFDM技术基本原理介绍

    电子发烧友网站提供《OFDM技术基本原理介绍.pdf》资料免费下载
    发表于 11-10 14:50 0次下载
    OFDM技术<b class='flag-5'>基本原理</b>介绍

    无功补偿的意义及基本原理

    无功补偿的意义及基本原理
    的头像 发表于 11-08 09:08 441次阅读
    无功补偿的意义及<b class='flag-5'>基本原理</b>

    讲解MATLAB/Simulink HDL使用入门

    我们将使用实例讲解MATLAB / Simulink HDL 使用入门。
    的头像 发表于 11-06 09:12 1046次阅读
    <b class='flag-5'>讲解</b><b class='flag-5'>MATLAB</b>/Simulink HDL使用入门

    了解矢量网络分析的基本原理

    了解矢量网络分析的基本原理
    发表于 11-02 15:11 1次下载

    开关电源基本原理与设计介绍

    开关电源基本原理与设计介绍(PPT)
    发表于 09-28 06:30

    【KV260视觉入门套件试用体验】六、VITis AI车牌检测&amp;车牌识别

    ?filename=xilinx-kv260-dpu-v2022.2-v3.0.0.img.gz 镜像下载地址 1.2、SD卡系统烧录 balenaEtcher软件 二、车牌检测和车牌识别介绍
    发表于 09-26 16:28