基于matlab开发的车牌检测与字符分割项目附源码

news2024/11/20 18:43:51

文章目录

    • 1 任务概述
      • 项目完整matlab源码
    • 2 基本流程
      • 2.1 车牌定位
        • 2.1.1 图像预处理
        • 2.1.2 边缘检测
        • 2.1.3 形态学操作
        • 2.1.4 重操作判断
        • 2.1.5 区域选择
        • 2.1.6 倾斜校正
        • 2.1.7 精确选择
      • 2.2 字符分割
      • 2.3 字符识别
    • 3 结果分析
      • 3.1 车牌定位
      • 3.2 字符分割
      • 3.3 字符识别
    • 4 总结
    • 5 参考资料

1 任务概述

  1. 车牌定位:输入车辆图片后,输出mask图以及定位到的车牌图片;
  2. 字符分割:根据获得的车牌图片进行字符分割,输出分割后单个字符;
  3. 字符识别:在给定模板下对分割出的字符进行识别。

项目完整matlab源码

下载:https://download.csdn.net/download/DeepLearning_/87384829

2 基本流程

2.1 车牌定位

在这里插入图片描述

Fig 1. 车牌定位流程

2.1.1 图像预处理

图像预处理在preprocess.m中,对于输入图像三个通道分别进行中值滤波,避免图像中的突刺噪声,再进行灰度化。如果先进行灰度化再进行中值滤波,噪声可能会因灰度化时平均操作被保留。

2.1.2 边缘检测

边缘检测在edge_detect.m中,对灰度图像使用不同的梯度算子进行边缘检测,对比不同梯度算子的检测结果。

由于图像中存在许多细节,Roberts、log和Canny算子容易检测出许多无关边缘,不利于后续的区域选择,因此我们选择Sobel算子和Prewitt算子,为了进一步减少被检测的边缘,我们特别选择了垂直方向的检测。

在这里插入图片描述

Fig 2. 边缘检测

2.1.3 形态学操作

形态学操作在morphology.m中,输入边缘检测的结果,经过以下四个步骤:

  1. 闭运算:先膨胀后腐蚀,用于填补车牌内部的空洞,利于后续检测;
  2. 消除小对象:消除和车牌无关的小对象,减少后续的筛选区域;
  3. 开运算:先腐蚀后膨胀,用于消除车牌边缘多余检测产生的突刺;
  4. 膨胀:扩大筛选区域,避免车牌部分缺失。

经过形态学操作后,车牌所在的矩形框可以被检测出来。

在这里插入图片描述

Fig 3. 形态学操作

2.1.4 重操作判断

重操作判断在judge.m中,由于部分检测图像所处环境较暗,若不进行直方图均衡化等图像增强操作则难以检测候选区域;部分图像所处环境正常,若全部图像都进行直方图均衡化,则会突出一些无关区域,形成多余的候选区域,不利于后续的区域筛选。

因此在这步判断,不进行均衡化的图像在形态学操作后是否有候选区域,若无则重新进行预处理,此时预处理操作进行了直方图均衡化。这里以挑战图像的04.jpg为例,若预处理时不进行均衡化,则经过形态学操作后无法形成候选区域,因此需要加入均衡化。

在这里插入图片描述

Fig 4. 重操作判断

2.1.5 区域选择

区域选择在area_select.m中,对经过形态学操作的候选区域用矩形框出,并用三个规则进行判断:

  1. 区域面积:用于剔除面积过小或过大的联通区域,满足条件的区域获得得分1;
  2. 车牌颜色:在初始时需要输入车牌的背景颜色,将候选区域所对应的原图转换到HSV空间,黄色所对应的色调H在60°附近,蓝色所对应的色调H在240°附近,计算每个候选区域中满足颜色条件的像素个数和区域大小的比值,将所有候选区中的最大颜色占比归一化为1.5作为得分;
  3. 区域比例:比较矩阵长宽比和标准车牌比3.38的大小,满足一定区域获得得分1。

取三个筛选条件的得分总和最大的候选区域作为车牌区域。

在这里插入图片描述

Fig 5. 区域选择

三个候选区域分布得分如下:

得分区域面积车牌颜色区域比例总分
区域111.513.5
区域210.969701.9697
区域311.234513.2456

最终选出区域1作为车牌区域。

2.1.6 倾斜校正

倾斜校正在correction.m中,对车牌区域灰度化和形态学操作后利用霍夫变换进行直线检测,从而得到图中点所集中的角度值,即车牌边框的倾斜角度,从而实现对原图进行修正。

以倾斜较为严重的05.jpg为例说明校正效果。

在这里插入图片描述

Fig 6. 倾斜校正

2.1.7 精确选择

精确选择在accurate_select.m中。利用色彩信息对车牌区域进行细化,将图像从RGB空间转换到HSV空间,统计每一行每一列满足色调H条件的像素比例,设置阈值,最终用于精确分割车牌边缘。以精确选择效果明显的07.jpg说明。

在这里插入图片描述

Fig 7. 精确选择

2.2 字符分割

字符分割在segmentation.m中,将车牌图像二值化后进行灰度投影,设定阈值分割图像。细节上,由于不同背景颜色的车牌灰度化后背景色不一致,因此需要选择占比较大的部分作为背景,即置0。

字符分割的效果很大程度受到之前处理水平的限制,例如倾斜校正就是为了字符分割而采用的。在尝试中发现,对车牌区域进行局部直方图均衡化利于字符分割的进行。

在这里插入图片描述

Fig 8. 字符分割

2.3 字符识别

字符识别在recognition.m中。将分割字符和输入的模板进行二值化,并将分割字符的大小reshape成输入的模板大小,选择IoU和直接做内积两种方式,识别效果都欠佳。

在这里插入图片描述

Fig 9. 字符识别

3 结果分析

3.1 车牌定位

车牌定位结果总体较好,算法使用同一套参数能将车牌定位出,一致性较好,但是仍然存在一些问题:

  1. 如10.jpg所示,部分车牌没有截取完整;
  2. 如挑战03.jpg所示,由于拍摄角度问题,虽然定位出了车牌,但是车牌上的字符被压缩。

在这里插入图片描述

Fig 10. 车牌定位结果

3.2 字符分割

字符分割结果如下图所示,分割字符用灰色区域隔开。

在这里插入图片描述

Fig 11 字符分割结果
由于字符分割时没有考虑字宽等先验因素,因此分割结果存在很多干扰字符,主要存在以下问题:
  1. 如04.jpg和06.jpg,将汉字部首识别成一个新字符;
  2. 如08.jpg所示,将噪声识别成新字符;
  3. 如10.jpg所示,字符044没有分开;
  4. 如挑战02.jpg和挑战03.jpg所示,由于照片模糊不能正确提取出字符;若此时采用局部自适应二值化方法分割可以让这两张图片正确分割,但是会给其他图片加入噪声。

针对以上问题,考虑在灰度投影前加入车牌局部区域均衡化模块,得到的字符分割结果如下:

在这里插入图片描述

Fig 12 直方图均衡化后字符分割结果

对比未进过直方图均衡化的分割结果,直方图均衡化后有如下提升:

  1. 04.jpg的“辽”的分割有了极大的改善;
  2. 挑战题02、03能够被二值化找到数字,但03的字符未能成功分割出。

但是08.jpg的后几位数字在均衡化后未能分割出。

3.3 字符识别

字符识别效果整体不佳,主要原因是直接将分割字符和模板进行比较,没有考虑两者形状大小方面的差异。事实上我已经进行了一些尝试,例如用形态学操作使得分割得到的字符的粗细和模板一致,但效果依然不佳。

在这里插入图片描述

Fig 13 字符识别结果

尝试优化识别结果。将待识别图片resize与模板图片高度一致,使待识别图片在水平方向逐像素滚动匹配,和模板图像做异或,取值最小的平移像素值,得到的字符识别效果如下,但是效果依然不佳。

在这里插入图片描述

Fig 14 水平滚动字符识别结果

4 总结

  1. 车牌定位和字符分割基本任务的结果较好,在输入中加入了车牌底色的先验知识,提高了定位和分割的准确性;
  2. 算法使用同一套参数基本可以完成车牌定位和分割,算法的一致性较好;
  3. 但是由于对分割出的字符进行细化处理,因此字符识别效果较差,下一步将从此方向出发进行优化。

5 参考资料

  1. 基于matlab的蓝色车牌识别(绪论)

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

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

相关文章

安装vim的最新版本

1、通过源码安装 对于Linux系统,可以通过源码编译来安装最新版本,我在wsl ubuntu下的操作如下: 获取vim的源码: git clone https://github.com/vim/vim.git刚开始我帆了墙,结果下载不动,关了帆墙软件可正常…

【入门AUTOSAR网络管理测试】AUTOSAR网络管理规范需求解读

文章目录前言一、名词解释二、NM报文1.NM报文格式2.NM报文数据场内容三、NM状态机1.NM状态转换图2.状态前言 AUTOSAR Automotive Open System Architecture,汽车开放系统架构,由全球汽车制造商、部件供应商及其他电子、半导体和软件系统公司联合建立&am…

Qt扫盲-QPlainTextEdit理论总结

QPlainTextEdit理论总结一、概述二、用途一:纯文本展示1. 用法2. 只读快捷键三、用途二:纯文本编辑器1. 用法2. 快捷键绑定四、与 QTextEdit 的不同一、概述 QPlainTextEdit是一个只支持纯文本的高级查看器/编辑器。 它经过优化,可以处理大型…

Mac系统下matplotlib中SimHei中文字体缺失报错的解决办法

问题描述import matplotlib.pyplot as plt plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus]False使用matplotlib画图时,因为缺少字体,、图像上label上的中文显示时空白小方块。因为matplotlib默认没有中文。解决方法&#xff…

多维时序 | MATLAB实现VMD-SSA-KELM和VMD-KELM变分模态分解结合麻雀算法优化核极限学习机多输入单输出时间序列预测

多维时序 | MATLAB实现VMD-SSA-KELM和VMD-KELM变分模态分解结合麻雀算法优化核极限学习机多输入单输出时间序列预测 目录多维时序 | MATLAB实现VMD-SSA-KELM和VMD-KELM变分模态分解结合麻雀算法优化核极限学习机多输入单输出时间序列预测预测效果基本介绍程序设计学习小结参考资…

城堡、游乐园、地下城!!!500+ 超棒 FBX 模型素材,全部都免费!

近期 Cocos 社区有好几位热心的开发者,整理了一些 CC0 协议 的游戏资源。如果你对 CC0 协议还不太了解,我找到一个中文版的协议说明,看下图:有几点比较重要:作者放弃著作权,已将作品贡献至公共领域可以复制…

【ROS】—— 机器人系统仿真 —RDF、Gazebo与Rviz综合应用(十六)

文章目录前言1. 机器人运动控制以及里程计信息显示1.1 ros_control 简介1.2 运动控制实现流程(Gazebo)1.2.1 为 joint 添加传动装置以及控制器1.2.2 xacro文件集成1.2.3 启动 gazebo并控制机器人运动2. 雷达信息仿真以及显示2.1 新建 Xacro 文件,配置雷达传感器信息…

C++STL之vector的模拟实现

由于vector和string的接口使用方法类似,这里便不再详细讲解vector各种接口的使用了,可以参考之前所发布的string的使用,或者从官方文档中获取详细的使用方法. 目录 vector介绍 构造函数(有参,无参,迭代器…

【14】Docker network | bridge | host | none | container

目录 1、Docker 运行的基本流程为: 2、Docker0 3、Docker默认的三种网络模式 4、Docker的网络命令 5、网络模式 6、实例: 7、bridge模式 8、host模式 9、none模式 10、container模式 11、自定义网络 1、Docker 运行的基本流程为: 1.用户是使用 Docker Clie…

UDS诊断系列介绍10-28服务

本文框架1. 系列介绍1.1 28服务概述2. 28服务请求与应答2.1 28服务请求2.2 28服务正响应2.3 否定应答3. Autosar系列文章快速链接1. 系列介绍 UDS(Unified Diagnostic Services)协议,即统一的诊断服务,是面向整车所有ECU的一种诊…

session利用的小思路

session利用的小思路 前言 做题的时候经常考到session利用,常见的基本就两种,session文件包含和session反序列化,之前没有详细总结过,就写写吧。 session文件包含 php.ini session的相关配置 session.upload_progress.enabl…

15、ThingsBoard-自定义阿里云SMS规则节点

1、概述 一个物联网平台承载着很多设备的连接,当设备出现异常的时候,能够快速的通知到运维管理员是非常重要的,thingsboard提供了自定义配置邮箱,但是它对支持发送短信的不是很友好,都是国外的sms服务商,我反正是不用那个,在国内常见就是阿里、腾讯、华为、七牛常用的s…

CORBA,Common Object Request Broker Architecture 简介

CORBA,Common Object Request Broker Architecture 简介 1. 简介 CORBA(Common ObjectRequest Broker Architecture,公共对象请求代理体系结构)是由OMG组织(OMG组织是一个国际性的非盈利组织,其职责是为应…

【17】Docker | CAdvisor_InfluxDB_Granfana | 成功安装

目录 1、查看目前docker容器的状态 2、三大组件 【1】、CAdvisor 【2】、InfluxDB 【3】、Granfana 3、用docker-compose安装三个组件 4、三大组件的登录 【1】浏览cAdvisor收集服务,http://ip:8080 【2】浏览influxdb存储服务,http://ip:8083 …

python日志处理模块讲解-loguru

说明: 本篇文章主要讲的是python日志模块loguru详解,感兴趣的同学赶快来看一看吧。 背景: 在部署一些定时运行或者长期运行的任务时,为了留存一些导致程序出现异常或错误的信息,通常会采用日志的方式来进行记录这些…

运放指标-压摆率SR

1. 压摆率SR 处理交流信号时,压摆率是运放器件重要的指标。其表示运放输出电压的转换速率。在高频信号时,若压摆率不够,则运放输出的信号会变形,导致不满足要求。其实际就是运放输出信号的分辨率,只有分辨率足…

机器学习中的数学基础(四):概率论

机器学习中的数学基础(四):概率论4 概率论4.1 一些概念4.2 二维随机变量4.2.1 离散型4.2.2 连续型4.3 边缘分布4.3.1 离散型边缘分布4.3.2 连续型边缘概率密度4.4 期望4.4.1 一维期望4.4.2 二维期望4.5 马尔可夫不等式4.6 切比雪夫不等式在看…

Vue2.0开发之——组件数据共享-Eventbus(39)

一 概述 兄弟组件之间数据共享的方案—EventBusEventBus的使用步骤EventBus的使用示例 二 兄弟组件之间数据共享的方案—EventBus 在 vue2.x 中,兄弟组件之间数据共享的方案是EventBus。 三 EventBus的使用步骤 创建 eventBus.js 模块,并向外共享一…

个人项目部署在云服务器上以及购买云服务器后如何操作

一. 购买云服务器后简单的操作1.镜像: 镜像可以认为是云服务器的操作系统,选择什么镜像云服务器就安装对应的操作系统。云服务器操作系统主要分为两大类,即Linux和Windows. 本次说明在linux操作系统下进行项目的部署, 那么在选择镜像的时可以选择Linux镜…

linux系统中利用QT实现串口通信的方法

大家好,今天主要和大家分享一下,如何使用QT中的串口通信方法。 目录 第一:资源简介 第二:应用实例的具体实现 第三:程序运行效果 第一:资源简介 在开发板的资源中出厂系统中,默认已经配置了两…