下载:https://download.csdn.net/download/DeepLearning_/87384829
图像预处理在preprocess.m中,对于输入图像三个通道分别进行中值滤波,避免图像中的突刺噪声,再进行灰度化。如果先进行灰度化再进行中值滤波,噪声可能会因灰度化时平均操作被保留。
边缘检测在edge_detect.m中,对灰度图像使用不同的梯度算子进行边缘检测,对比不同梯度算子的检测结果。
由于图像中存在许多细节,Roberts、log和Canny算子容易检测出许多无关边缘,不利于后续的区域选择,因此我们选择Sobel算子和Prewitt算子,为了进一步减少被检测的边缘,我们特别选择了垂直方向的检测。
形态学操作在morphology.m中,输入边缘检测的结果,经过以下四个步骤:
经过形态学操作后,车牌所在的矩形框可以被检测出来。
重操作判断在judge.m中,由于部分检测图像所处环境较暗,若不进行直方图均衡化等图像增强操作则难以检测候选区域;部分图像所处环境正常,若全部图像都进行直方图均衡化,则会突出一些无关区域,形成多余的候选区域,不利于后续的区域筛选。
因此在这步判断,不进行均衡化的图像在形态学操作后是否有候选区域,若无则重新进行预处理,此时预处理操作进行了直方图均衡化。这里以挑战图像的04.jpg为例,若预处理时不进行均衡化,则经过形态学操作后无法形成候选区域,因此需要加入均衡化。
区域选择在area_select.m中,对经过形态学操作的候选区域用矩形框出,并用三个规则进行判断:
取三个筛选条件的得分总和最大的候选区域作为车牌区域。
三个候选区域分布得分如下:
得分 | 区域面积 | 车牌颜色 | 区域比例 | 总分 |
---|---|---|---|---|
区域1 | 1 | 1.5 | 1 | 3.5 |
区域2 | 1 | 0.9697 | 0 | 1.9697 |
区域3 | 1 | 1.2345 | 1 | 3.2456 |
最终选出区域1作为车牌区域。
倾斜校正在correction.m中,对车牌区域灰度化和形态学操作后利用霍夫变换进行直线检测,从而得到图中点所集中的角度值,即车牌边框的倾斜角度,从而实现对原图进行修正。
以倾斜较为严重的05.jpg为例说明校正效果。
精确选择在accurate_select.m中。利用色彩信息对车牌区域进行细化,将图像从RGB空间转换到HSV空间,统计每一行每一列满足色调H条件的像素比例,设置阈值,最终用于精确分割车牌边缘。以精确选择效果明显的07.jpg说明。
字符分割在segmentation.m中,将车牌图像二值化后进行灰度投影,设定阈值分割图像。细节上,由于不同背景颜色的车牌灰度化后背景色不一致,因此需要选择占比较大的部分作为背景,即置0。
字符分割的效果很大程度受到之前处理水平的限制,例如倾斜校正就是为了字符分割而采用的。在尝试中发现,对车牌区域进行局部直方图均衡化利于字符分割的进行。
字符识别在recognition.m中。将分割字符和输入的模板进行二值化,并将分割字符的大小reshape成输入的模板大小,选择IoU和直接做内积两种方式,识别效果都欠佳。
车牌定位结果总体较好,算法使用同一套参数能将车牌定位出,一致性较好,但是仍然存在一些问题:
字符分割结果如下图所示,分割字符用灰色区域隔开。
针对以上问题,考虑在灰度投影前加入车牌局部区域均衡化模块,得到的字符分割结果如下:
对比未进过直方图均衡化的分割结果,直方图均衡化后有如下提升:
但是08.jpg的后几位数字在均衡化后未能分割出。
字符识别效果整体不佳,主要原因是直接将分割字符和模板进行比较,没有考虑两者形状大小方面的差异。事实上我已经进行了一些尝试,例如用形态学操作使得分割得到的字符的粗细和模板一致,但效果依然不佳。
尝试优化识别结果。将待识别图片resize与模板图片高度一致,使待识别图片在水平方向逐像素滚动匹配,和模板图像做异或,取值最小的平移像素值,得到的字符识别效果如下,但是效果依然不佳。