【总结】学习车牌识别matlab源码

完成本科毕业设计后,由于手头暂时没有项目可做,于是在微信公众平台“计算机视觉战队”上获取了一份“matlab车牌识别”的基本实现代码来阅读,效果很一般,但基本思路在那,对我这样用于学习的小白而言已经足够。感谢这个平台分享的资源,需要获取源码的博友请移步该平台。

计算机视觉用于车牌识别的研究已经有很多年的进展,像现如今用CNN来做的也有之。这次总结的代码是基于传统的图像处理方法来实现的车牌识别,下面总结的内容均基于该源代码。

本次阅读源代码,学习到的内容有:1、传统车牌识别的基本思路   2、matlab基本函数的使用

源代码车牌识别的思路,这里分为三大步骤:

1、图像预处理

1a、首先将原图像转换为灰度图像。多数论文谈到灰度化后做灰度拉伸(对比度增强)处理,在该代码中没有做灰度拉伸。

1b、canny边缘检测。canny的高低阈值需设置好,边缘检测后图像中的边缘信息被保留,获得的图像为二值图像。

1c、对1b中获得的二值图像作腐蚀。模板为3x1的矩形。滤除了大部分稀疏边缘,对于车牌这样存在密集边缘的,腐蚀操作则保留了部分边缘。

1d、对1c中的边缘图像作闭操作。模板为40x40的矩形。密集边缘的区域被融合成为了一块连通域。

1e、去除小型的连通域。

剩下的像素点为1(255)的区域则是车牌的掩模区域,上述操作步骤后,get到了车牌的粗定位,下面需要精定位。

2、车牌定位

2a、按行遍历车牌像素点为1的区域,得到像素点最多的那一行 ,那一行也必定为车牌中的较为中间的一行,记为MAX_Y。

2b、确定精定位车牌区域的高度区间。从MAX_Y那一行分别上下回溯遍历每一行像素点为1的个数,设定停止阈值,阈值是车牌区域每一行可能包含的最小像素点为1的个数。这里把得到的最上一行记为PY1,最下一行记为PY2。

2c、确定精定位车牌区域的宽度区间。在[PY1,PY2]这两行间,从左至右遍历每一列像素点为1的个数,同2b一样,设定停止阈值,得到宽度区间。最左记为PX1,最右记为PX2。【源代码中将最终的PX1,PX2,PY1在2b、2c基础上稍作了微调】

2d、车牌矫正。

*首先矫正水平方向。利用radon变换,获得车牌水平倾斜角度,然后根据该角度做图像旋转,得到水平是正的图像。

*再矫正垂直方向。矫正水平方向后的图像极有可能车牌字体是倾斜的,那么再直接旋转肯定是不行的。这里需要用到仿射变换中的剪切变换矩阵,在计算得到剪切变换得到的角度后,再构造旋转矩阵做旋转变换。

3、车牌字符分割

3a、矫正后的车牌区域图像做图像滤波。用均值滤波和腐蚀、膨胀操作对车牌区域做简单滤波处理。

3b、去掉车牌边框。通过统计车牌区域每一行像素点为1的个数,设定阈值来去掉不满足条件的行数,留下车牌主区域。

3c、字符分割。在列方向上统计每列的像素点为1的个数,显然,对于像素点为1的个数,字符区域与用于分隔每个字符的黑色区域所包含的个数有很大差异,同时考虑每个字符的宽度不会太大,那么,通过这两个特征,可以将每个字符分隔出来。

4、车牌字符识别

4a、源代码作者事先训练好了bp神经网络用来识别字母和数字。提醒自己一下,训练集要事先归一化到某个尺寸size,然后按每行或者每列组成一个列向量,构成一个训练样本。后期对于要识别的图像,也要归一化到上述提到的同样的size。

4b、将3中分隔出来的车牌字符图像放入bp神经网络中进行识别,得到最终的识别结果。源代码无法识别车牌中的汉字,例如“京”。

这份代码有很多不足的地方,例如仿射变换的角度计算不对、存在太多经验值使得算法普适性不强、无法识别汉字等等。以后有时间,要对这份代码做优化。


你可能感兴趣的:(数字图像处理)