引言
接上篇,这部分是图像预处理的后百分之五十的工作,也就是把上期代码识别出的车牌进行字符分割。 下面进入正题~
正文
在之前的教程中我们已经能够将识别出的车牌进行二值化处理了,本章节会介绍一种最简单的方法进行字符切割,当然有效的切割字符不是这个项目的目的,这个项目主要是针对pytorch的上手,下面我们开始介绍字符切割的步骤。
在对识别出的车牌进行滤波并二值化后,我们的分割思路便是从车牌的最上面到最下面遍历二值化后的黑色像素点个数,当这个数量超过一定的阈值时,我们把这列标记为无字符列。然后将所有的无字符列都用线条标识出来。
black_count = 0
char_spli = [0 for i in range(200)]
for i in range(200):
for j in range (4,45):
if img_final_bin[j,i] == 0:
black_count += 1
if black_count >= 40:
char_spli[i] = 1
#cv2.line(img_final_resize, (i,0), (i,49), (0, 255, 255), 2)
black_count = 0
##以上是绘制出所有字符间隔的蓝色块,从第4行至第45行,超过四十个点为蓝色即画线
再把每个字符之间的黄色矩形中间列作为字符的分割线标记出来即可,以下代码便是把各个字符进行分割的代码:
yellow_count = 0
start_position = 0
end_position = 0
split_line = [0 for h in range(10)]
x = 0
for k in range(1, 200):
if char_spli[k] == 1:
yellow_count += 1
if (char_spli[k] - char_spli[k - 1] == 1):
start_position = k
else:
if (char_spli[k] - char_spli[k - 1] == -1):
end_position = k - 1
if (yellow_count >= 4 and end_position > start_position):
'''cv2.line(img_final_resize, (start_position+(end_position-start_position)//2, 0),
(start_position+(end_position-start_position)//2, 49),
(0, 255, 255), 2)'''
split_line[x] = start_position+(end_position-start_position) #记录所有分割线横坐标
x += 1
yellow_count = 0
#print(split_line)
##以上是把绘制出的黄色块区域取中线并绘制,以此来分割各个字符
实现功能之后,我们来看一下运行的效果, 效果图如下:
到此,我们便利用CV简单地进行了字符分割,并达到了目的,当然要提高分割的适应性,或者准确度,可以采用更具体的方法,当然这不是我们这次项目的重点。
总结
本章内容结束后,我们就完成了利用opencv进行图像预处理的部分,从下一章节开始,我们将会进入这个项目的重点部分,也就是神经网络的部分。 大致的流程就是利用分割后的不同的字符图片组成训练集,并搭建神经网络,将训练集传入神经网络进行训练后,我们利用模型对图片中的车牌进行识别得出结果,这就是整个项目的流程。 在这个系列结束后我会把整个工程打包供大家下载。