学过了数字图像处理,就进行一个综合性强的小项目来巩固一下知识吧。前阵子编写调试了一套基于MATLAB的车牌识别的项目的代码。今天又重新改进了一下代码,识别的效果好一点了,也精简了一些代码。这里没有使用神经网络等,只是用了最基础的数字图像处理算法,最后通过模板匹配,得到结果。
源码下载链接:
下载链接(注意:有两套,第二套是后来改进的,都能运行的)
运行结果:
这里读取了车牌图片目录中的第一幅图片,并显示出来了原图像;随后计算出车牌的区域,进行图像切割,单独把车牌提取出来;最后,从图像中切割出每个字符,并与事先准备好的模板进行匹配,找到与其误差最小的模板就认为是对应的字符。
这里是另外一个识别车牌号的结果。
程序思路:
第一步:从原图像中切割出车牌,去除无用信息
1、读取原图像。
2、将原始彩色图像转换成灰度图像,并显示直方图(如果分布十分不均匀,使用直方图均衡化处理)。
3、使用roberts算子进行边缘检测(MATLAB中调用edge函数)。
4、图像腐蚀(去除不需要的边缘信息,尽可能只保留车牌上字符的轮廓)。
5、图像膨胀(平滑图像轮廓,图中没能完全滤出车牌之外的所有边缘信息,剩下了一部分,其实就是车牌上的那个奥迪标志,后面还要想办法把它给去掉)。
6、从图像中移除小块对象(调用bwareaopen()函数,从图像中删除所有少于2200像素8邻接的区域,最后只剩下车牌区域了)。
7、根据最后图像中“白色”的那部分界定车牌所处的区域,并重新在原图像中进行切割,得到车牌的图像。
第二步:从前面得到的车牌图像中切割出每个字符
1、先将车牌图像转换为灰度图像并绘制直方图。
2、为增强对比度,对灰度图像再做直方图均衡化。
3、将图像二值化。
4、中值滤波,滤除一些无用信息。
5、调用编写的my_imsplit.m和getword.m脚本,计算每个字符的位置,并逐一进行切割,得到只储存单一字符的图像。
6、与准备好的字符模板比对,计算出与其误差最小的某个字符模板,识别为对应的字符。
最后的识别结果: