书接上文:
本篇文章主要介绍如何对采集到的图像处理,进行车牌号的识别。
本车牌识别系统包括以下:图像采集→二值化灰度处理→识别车牌区域→字符分割→字符识别。
有图有真相
图片比任何语言都有说服力,话不多说直接上图。
图像采集已在上一篇文章讲过,有需要的可以取去看一下。
二值二值,字面意思就是转变成两个数值,就是将整个图像的每个像素都转变成0(黑)或255(白)这两个值,非黑即白,这样处理起来就很方便了。那么问题又来了,0~255之间应该如何转换?是随便转的吗?
当然不是,简单的办法就是取一个合适的阈值,比如说127吧,小于127的转为0,大于127的转为1,因此找合适阈值就变得尤为重要,可以取其中值,也可以取各个像素的平均值。
如何在一张图片中精准的定位车牌所在的位置,这个就很有意思了!!!
上边界和下边界:在上一步二值化处理时,已经将整张图片转换成0(黑色)或者255(白色),车牌是蓝底白字,二值化后蓝色的低会变成黑色,上面的字依旧是白色,一行一行的看, 这一行中灰度值会多次发生跳变,也就是会有很多从0变成255,我们恰恰利用这一点,也就是统计跳变点的个数,当跳变点个数超过一定的阈值时,就认为该行是边界。
空说太无力了,还是举个例子:
绿线代表一行,沿着这一行看,当到达白字时,其灰度数值会发生跳变从 0(黑色)跳变成255(白色),记为一个跳变点,这一行的跳变点还有很多,我们就根据跳变点的个数来判断上下边界。
左右边界:介于我们上下边界已经找好,所以我们可以在这两边界之间的区域找左右边界,从而缩小工作量,我们依旧可以按跳变点的算法来做,也可以用另一种方法,RGB转变成HSV,根据其色调、饱和度、明度来判断。
也就是这样。
区域也定好,我们想要识别字母,首先得先提取出来啊,一一识别,因此就需要字符分割了。如何分割呢。
先上个图便于大家理解。
如图,红线代表着我们上方确定好的边界,我们可以看到两个字母之间二值化处理后全是黑色,唉~我们就可以根据这一特性看,竖着看如果某一列全为黑色也就是0,并且旁边也全都是黑色,就可以判断为空隙,这样就能截取到了各个字母,用蓝线表示字母的边界。
经过前面的努力,我们已经提取到了各个字符,下面就进行识别呗。
为了增加识别的准确度呢,我们将提取到的字符进行放大,先横向放大然后纵向放大,以提高准确度。下图:
怎么识别呢,我们通过取模软件,取到多个多个字模,比如说,粤、苏、辽、A~F、1~9,将其存放在数组中,然后让我们提取到的字符的数组去和他们一一比较。
比如说我们现在提取到“苏”,让它的数组去比较,肯定会找到一个标准数组和提取数组一样,但是呢,就像世界上没有两片相同的叶子一样,他们或多或少会有出处,因此我们设定当他们的相似度超过一定的阈值时,就认为二者相同。
最下方就是我们识别到的车牌号:
当然啦,用f103系列的单片机去做机器视觉,多少有点为难它了,毕竟它不是专门做这个的。所以有时会出现一些个别字符识别错误,尤其是“E”与“F”,这是正常现象。
大家如果想省事的话也可直接下载全部工程资料。
完整工程链接:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-24450682672.4.6c772c42AqQnna&id=677048652126
欢迎大家指正交流,有空可以一起讨论代码啊。
制作不易,感谢大家支持,感谢!!!!!!
--------------一个正在努力的人
本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕,E-mail:xinmeigg88@163.com
本文链接:http://www.glev.cn/tnews/2239.html