matlab车牌识别系统的开发步骤

首先介绍一下我在开发过程中用到的技术。

(1)利用车牌颜色的对车牌进行定位。首先我们要设定蓝色的数值范围,在图片中不同的蓝色有不同的数值,只有设定了范围才可以对原图中的蓝色车牌进行定位。

(2)擦除多余的蓝色更加进准的定位车牌的位置。该方法主要目的是排除在以蓝色定位时由于有其他的蓝色部分会干扰车牌的地位,未能擦除多余的颜色可能导致车牌位置不准确。

(3)车牌分割算法。要划分定位车牌,然后将字符分成划分的车牌。在准备随后的车牌识别时,主要用于算法的车牌的定位被平均划分。

(4)模版匹配算法。版匹配算法主要是利用已经分割和的字符模版与从原图中分割出的字符图片进行二维数组的相减取绝对值最小的那个值就是我们要找的模版,然后取模版中文件的名字提取字符。

(5)卷积神经网络识别算法。算法的主题思想是利用分割好大量字符文件进行训练生成相应的神经网络。然后利用神经网对原图中的字符文件进行卷积操作,找到对用的特征,根据特征找到对应的标签即对应的字符,然后提取标签完成本次的识别。

我在这里主要是利用了车牌的颜色对车牌进行定位。

    在本系统中主要是是对私家的小型汽车的特点进行有效的识别。车牌的定位操作主要是依据车牌的颜色进行有效的定位。但是,由于蓝色空间中两点之间可能不是线性的,因此在设置蓝色区域时可能无法找到牌照。这也是对车牌定位失败的原因。还有就是在员图片中可能会出现蓝色背景这样车牌的识别率也会下降,不能有效分割出车牌区域。在系统中编写了自适应调节方案。主要是对定位区域选定时多次筛选。根据汽车牌照的长宽比和蓝色,对分割区域进行多次比较。从而找到车牌区域。

(1)对于车牌倾斜角度校正

由于在拍摄时会出现车牌倾斜的情况,本次设计总还设计了调整图片中定位区域的倾斜角度问题。这里,rando算法是Matlab中用于计算倾斜角度。这样就可以将原图中的定位区域调整到在水平方向一致的图片。这有利于车牌的划分和以后对图像的识别。

(2)字符分割算法

该方法利用先前计算的牌照位置区域的分色图像,然后X方向和Y方向投影灰度分割图像的白色部分。计算X方向垂直峰值,并使用该算法计算汽车车牌字符高宽比。一般来说不正确的阈值,会使字符切割不准确,对于这种情况,我们可以通过车牌格式来表征,然后执行剪切字符宽度的统计分析数据为引导分割以处理出错分割的字符。针对这种问题对分割出来的字体的宽度应该与整个车牌的宽度对比,错误操作字符进行合并。对于智能识别系统,应该最小化系统以过分依赖阈值。

(3)字体识别方法

这里使用了当今比较成熟的识别算法,首先是利用已经分割好的字符图片,然后利用模版匹配的算法,首先与模版库中的模版进行相减得到一个数值,这时开始对比数值最小的那个模版,然后提取模版文件的文件名字,文件名字就是我们要的对应识别字符。在系统中使用了卷积神经网络,这里识别前期的准备耗时长但是识别是非常方便的,它是利用训练好的神经网络进行识别,这里就只做简单的介绍,下文会有详情介绍。

语音读取车牌:语音读车牌就是利用已经识别号的车牌字符,对字符进行语音报出车牌信息的方法,这里利用了已经录好的语音,在该算法中寻找所需的音频文件,然后一个一个的报出对应的语音。

这里详细讲解一下车牌的分割实现:

在车牌识别过程中,字符分割需要定位前面的牌照并准备车牌字符识别。它在前牌照定位的前提下划分车牌字符,然后使用拆分结果识别车牌字符。

汽车牌照字符的分割通常使用投影方法。字符在投影方向上的投影必须接近字符之间或字符之间的间隙。并且这个位置应该符合汽车车牌的字符格式,大小限制条件。使用垂直投影法对自然环境中汽车图像中车牌字符的分割效果很好。

详细算法如下:

(1)为了确定分割后图像中字符的高度:先经过自下而上对图像进行的扫描,发现首个黑素像素,这是系统就会记下行号,重复上面的步骤。可以标记字符的近似高度范围,直到找到两个行号。

(2)为了确定每个车牌字符在左边位置和右终止位置:第一步中获得的高度范围内进行扫描,遇到第一个黑色像素时,方向是从左到右逐列。此时,它被认为是车牌字符分割的左起始位,然后继续向左扫描直到列中没有黑色像素。这时就可以认为是这个字符的最右边位置,紧接着准备开始进行下一个字符的分割。依据上述方法重复扫描,这时在扫描六次就可以找到,七个字符分割位置然后就可以进行分割。

(3)现在知道每个字符的宽度范围,然后按照上面的方法,自下而上和自上而下分别扫描,得到每个字符的确切高度范围。

接下来开始确定车牌字符左右边界,通过垂直扫描过程,因为数字和字母具有连通性,在分割数字和字母相对来说容易。然后,再次开始垂直扫描处理,并计算黑色像素的数量,因为在两个字符之间没有黑色像素,因此它可以用作字符分割的边界。

车牌字符分割通常使用垂直投影。此时,还需要去除周围的空白,因为字符在垂直方向上的投影必须接近空间之间或字符内空间之间的局部最小值。而且这个位置必须符合车牌的字符格式,尺寸限制和其他一些条件。垂直投影法在自然条件下对汽车图像中的字符分割具有良好的效果。

然后讲解一下我的车牌识别思想,我识别方法我这里利用了模版匹配方法和卷积神经网路。

汽车牌照字符匹配识别的是要对比模版库中的制作好的字符模版,再将已车牌字符的分割和进行了字符的归一化处理然后进行单个字符相相减,最后利用循环减法值从模板字符中减去识别字符的特征值比较找到取绝对值最小的那个模版即为匹配得最相似的字符。车牌识别字符识别步骤如下图所示:

 

 

建立模板字库表

读取分割出来的字符

第一个字符与模板中的汉字模板进行匹配

第二个字符与模板中的字母模板进行匹配

待识别字符与模板字符相减,值越小相似度越大,找到最小的一个即为匹配的最好的

识别完成,输出此模板对应值

后5个字符与模板中的字母与数字模板进行匹配

 

识别汽车的字符匹配是识别汽车卡的重要部分。因此首先要建立起精准的模板库,目的是将切割的牌照字符与库的内容进行比较。然后来通过读取切割的字符,与模版图片进行比较。

模版匹配采用将目标图像与模板图像做差,得到第三幅图像,最后得到第三幅二进制图像中像素为1的数量,找到最小值是我们需要的结果,并比较最高数字。

下面是卷积神经网络

车牌字符图像预处理,包括图像预处理、车牌灰化、车牌定位、车牌分割和分割图像标准化。

以下是CNN的识别方法介绍,该程序中使用的神经网络的结构如下图的结构网所示。

 

结构体net

https://images0.cnblogs.com/blog/736761/201508/142051518795328.png

包含5层

https://images0.cnblogs.com/blog/736761/201508/142051524426457.png

每层的结构

https://images0.cnblogs.com/blog/736761/201508/142051549571256.png

https://images0.cnblogs.com/blog/736761/201508/142051556925397.png

图4-4结构网

     这五层的结构如下:

https://images0.cnblogs.com/blog2015/736761/201508/142108145676112.png

图 4-5五层结构图

每层的结构分别如下:

https://images0.cnblogs.com/blog2015/736761/201508/142106455514206.png

图 4-6 每层的结构

在下文中,分别引入每层的输入,输出和传播分解,以仅考虑某一批单词的样本。第一层到第五层的数据传递如图4-7所示。

https://images0.cnblogs.com/blog2015/736761/201508/142105563648401.png

图 4-7卷积操作

    利用循环,分别计算第二层每个map的输出。

(1)初始化一个三维矩阵z,z的大小为24*24*50,即第二层中每个map的尺寸z存放的是第二层中每个map的输入。

(2)计算第2层第j个map的输入,即第1层的所有输出(i=1,…,inputmaps)对第2层第j个输入的贡献的累积z贡献。利用第二层的第 j个 map的卷积核 net. layers{2}. k{ i}{j}分别在第1层中卷积第i个地图并将得到的所有卷积结果相加,第2层的inputmaps=1net.layers{l}.k{i}{j}含义如下:

net.layers{l}.k是一个元胞,有两层;net.layers{l}.k{i}:l-1层的第i个映射到第一层的所有映射的卷积核;net.layers{l}.k{i}{j}:net.layers{l}.k{i}{j}:是第l层的第l-1层到第j层的第i个映射的卷积核。

从第三层的第一个映射到第四层的映射的所有映射的卷积核如图4-8所示。

https://images0.cnblogs.com/blog/736761/201508/142052000042679.png

图 4-8 卷积核

第三层的第一个映射到第四层的第一个映射的卷积核如图4-9所示。

https://images0.cnblogs.com/blog/736761/201508/142052006148794.png

图 4-9 卷积核数据

(3)计算第2层的第j个map的输出,第二层的第j个map的输出为net.layers{2}.a{j}=sigm(z+net.layers{l}.b{j})

(4)第一层地图上的卷积运算图例如图4-10所示。

https://images0.cnblogs.com/blog2015/736761/201508/142107338792142.png

图 4-10卷积运算图例

(5)第2层到第3层(l=3)的降采样操作,如图4-11所示。

https://images0.cnblogs.com/blog2015/736761/201508/142113059576425.png

图 4-11降采样操作

在第二层的第j个映射上执行卷积运算,并且通过z获得的卷积核(尺寸是比例*比例)按照如下步骤获得:

   (1)下采样z以获得第三层的第j个映射的输出。

(2)使用循环,分别计算第四层的每个地图的输出net.layers{4}.a{j} (j=1,..,12)。上图所示的下采样过程的例子如下图所示。

 

https://images0.cnblogs.com/blog2015/736761/201508/142113355983602.png

图 4-12采样过程

接下来,将讨论在讨论第j个循环时循环体内的逐步分析。

(1)初始化一个三维矩阵z,z的大小为24*24*50,即第二层中每个map的尺寸,z存放的是第四层中每个map的输入。

(2)计算第4层的第j个map的输入,即第3层的所有输出(i=1,…,inputmaps)对第4层第j个输入的贡献累积。

计算方法是:利用第4层的第j个 map的卷积核 net. layers{4}. k{ i}{j}卷积第3层中的第i个地图(i = 1,…, net.layers{1}.outputmaps),并将得到的所有卷积结果相加,第4层的inputmaps=12

(3)计算第4层的第j个map的输出,第4层的第j个map的输出为net.layers{4}.a{j}=sigm(z+net.layers{4}.b{j})

(4)计算第三层地图上的卷积运算图例。获取第五层的第j个输出映射的大小,该映射是三维的,并且获得的三维大小向量存储在sa中,将第五层的第j个输出映射的矩阵转换为sa(1)* sa(2),sa

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值