首发于https://juejin.cn/post/6924213303124164621,转载注明出处
GitHub
https://github.com/KinghooWei/LicensePlateRecognition
开门见山啦,记得star一下呀
最终效果图
![]() |
![]() |
![]() |
![]() |
汽车图片来源于网络
设计思路
项目的编程环境为python3.7.7,编译器使用pycharm2019.3.4 x64,设计一个车牌识别系统,有GUI界面。选择一张有车牌的图片后,完成车牌定位、倾斜校正、字符分割,最后通过k-NN算法对车牌的字母和数字进行识别,将识别结果在GUI界面中显示出来。
车牌定位
车牌定位就是在图片中识别出哪个位置有车牌,是字符分割和字母数字识别的前提,是车牌识别系统的关键和难点。具体算法如下:
-
对原始图像进行高斯模糊,减少噪点。
-
提取图像边缘。首先将彩色图像转为灰度图gray,利用大核对灰度图进行开操作得到图像open,相当于对灰度图进行涂抹操作,将灰度图gray和开操作后的图像open按1:-1的比例融合得到图像add,以上操作可以将大面积灰度值相似的地方置黑,可以减少车灯、背景、地面、挡风玻璃等细节。接着使用canny算法对融合图像add提取边缘,得到图像canny。
![]() gray |
![]() open |
![]() add |
![]() canny |
提取图像边缘 |
- 使用横向长条作为核对边缘图像进行一次闭操作,得到图像close,相当于对边缘横向涂抹,因为一般视角车牌是宽大于高的矩形。再对图像close进行一次开操作,得到图像open2,消除较细的线条和不大的竖向线条,从而将车牌位置的连通区域独立出来。
![]() 闭操作close |
![]() 开操作open2 |
对边缘进行闭操作和开操作 |
-
查找连通区域,通过最小外接矩形的宽高比2~5.5筛选合适的连通区域。
-
将最小外接矩形图像旋转矫正,上下左右向外扩展一点范围,避免连通区域没能覆盖车牌造成影响。
-
将连通区域原图转为HSV图像,确定图像的主要颜色,若不为蓝、黄、绿,则排除。按照3种颜色对车牌进行精细定位,缩小范围。
-
再次通过图像宽高比2.2~5.3筛选合适的位置,至此车牌定位结束。

车牌定位
字符分割
字符分割连接车牌定位和字符识别两个步骤,起到承上启下的作用,准确的字符分割是准确识别字符的前提,具体算法如下:
-
先将RGB图像转为灰度图,再转为二值图像,由于黄牌和绿牌的字符是黑色的,因此要将黄牌和绿牌的二值图像做反转处理。
-
车牌的上边缘或下边缘有2颗铆钉,考虑到车牌字符一般为7位,理论上遍历每行像素,若黑白跳变次数大于14次,可以判断该行像素有字符的像素,予以保留,若小于等于14次,可以判断行像素没有字符的像素,将这一整行像素置黑,即可消除铆钉。考虑到车牌倾斜的可能性,项目中将这一阈值设定为8。
-
将二值图像的像素值向x轴投射,白色像素越多,投射出的值越高,投射值低于设定阈值时,可以视为字符间隔。由于省市编号与其它编号距离较大,所以字符最大间隔可以视为省市编号与其它编号之间的间隔,再往数前一个间隔,可以得到车牌号的第一个字符。大间隔右边由于字符较多,所以通过连通区域面积最大的5个进行查早,再通过x坐标排序,从而得到其余字符,至此字符分割完成。

字符分割
特征描述
把每个字符的二值图像调整为32*64像素的二值图像,逐行读取像素值,从而得到2048维向量,此向量作为字符的特征。
k-NN分类算法
在模式识别领域中,k-NN算法是一种用于分类和回归的非参数统计方法。在k-NN分类算法中,输入包含k个最接近的特征空间的训练样本,输出是一个分类族群。一个对象的分类是由其邻近样本占多数的类别确定的,k为正整数,通常为奇数。k个最邻近样本中最多的分类类别决定了赋予该对象的类别,若 k =