目录
(1)实验背景
随着科技的发展,自动车牌识别系统(Automatic License Plate Recognition, ALPR)在交通监控、停车场管理、高速收费等领域得到了广泛应用。车牌字符分割是ALPR系统中的关键步骤之一,其质量直接影响到后续的车牌字符识别的准确性。
车牌字符分割的目标是将车牌图像中的每个字符准确地分割出来,为后续的字符识别提供准确的输入。然而,由于车牌的颜色、字体、大小、照明条件等因素的影响,车牌字符分割是一项具有挑战性的任务。传统的车牌字符分割方法主要基于图像处理技术,如二值化、边缘检测、连通域分析等。然而,这些方法对图像质量、照明条件等因素敏感,容易受到噪声和光照变化的影响,分割效果不尽如人意。
近年来,随着深度学习技术的发展,基于深度学习的车牌字符分割方法逐渐受到关注。这些方法能够自动学习图像中的复杂模式,对噪声和光照变化具有较强的鲁棒性,分割效果显著优于传统方法。
(2)实验简介
本文介绍了一种基于像素阈值的车牌字符分割技术,该技术通过计算每列的黑白像素总和,然后根据设定的阈值对图像进行分割,从而实现车牌字符的准确分割。该技术简单高效,不需要大量的计算资源和内存,适合在资源有限的设备上部署。
(3)实验素材
(4)实验步骤
1、导入实验所需库。
import cv2
2、读取一张名为Car5.jpg的图片(即上述实验素材),将其转换为灰度图像,并在屏幕上显示原始图像和灰度图像。
# 读取图像,并把图像转换为灰度图像并显示
img_ = cv2.imread('Car5.jpg')
cv2.imshow('gray', img_)# 读取图片
img_gray = cv2.cvtColor(img_, cv2.COLOR_BGR2GRAY) # 转换了灰度化
cv2.imshow('gray1', img_gray) # 显示图片
cv2.waitKey(0)
程序输出效果如下:
3、将灰度图像二值化,设定阈值是100。
# 将灰度图像二值化,设定阈值是100
ret, img_thre = cv2.threshold(img_gray, 100, 255, cv2.THRESH_BINARY_INV)
4、遍历二值化后的图像的每一列,计算并记录每一列的黑色和白色像素总和,并同时找出最大的黑色和白色像素总和,这些信息将为后续的图像分割提供重要依据。
white = [] # 记录每一列的白色像素总和
black = [] # 记录每一列的黑色像素总和
height = img_thre.shape[0]
width = img_thre.shape[1]
white_max = 0
black_max = 0
# 计算每一列的黑白色像素总和
for i in range(width):
s = 0 # 这一列白色总数
t = 0 # 这一列黑色总数
for j in range(height):
if img_thre[j][i] == 255:
s += 1
if img_thre[j][i] == 0:
t += 1
white_max = max(white_max, s)
black_max = max(black_max, t)
white.append(s)
black.append(t)
5、判断图像是否为黑底白字。变量arg
被设置为False
,表示默认图像为白底黑字。接着,如果最大的黑色像素总和black_max
大于最大的白色像素总和white_max
,则将arg
设置为True
,表示图像为黑底白字。
arg = False # False表示白底黑字;True表示黑底白字
if black_max > white_max:
arg = True
6、定义了函数find_end
,其功能是根据输入的字符开始位置和图像的黑白像素分布,计算并返回字符在图像中的结束位置。
# 分割图像
def find_end(start_):
end_ = start_ + 1
for m in range(start_ + 1, width - 1):
if (black[m] if arg else white[m]) > (0.89 * black_max if arg else 0.89 * white_max): # 0.95这个参数请多调整,对应下面的0.05(针对像素分布调节)
end_ = m
break
return end_
7、遍历二值化图像的每一列,根据像素的黑白分布找到每个字符的开始和结束位置,然后将每个字符从图像中分割出来,并调整其大小为15x30像素。
n = 1
start = 1
end = 2
word = []
while n < width - 2:
n += 1
if (white[n] if arg else black[n]) > (0.11 * white_max if arg else 0.11 * black_max):
# 上面这些判断用来辨别是白底黑字还是黑底白字
# 0.05这个参数请多调整,对应上面的0.95
start = n
end = find_end(start)
n = end
if end - start > 5:
cj = img_[1:height, start:end]
cj = cv2.resize(cj, (15, 30))
word.append(cj)
8、将分割出的每个字符保存为单独的图像文件,同时如需关闭图像窗口,可通过键盘输入来控制图像窗口的关闭,按下'q'键或'Esc'键即关闭所有图像窗口。
k=0
for i,j in enumerate(word):
picname = './image/%d.jpg' % k
k+=1
cv2.imwrite(picname,word[i])
k = cv2.waitKey(20) & 0xFF
if k & 0xFF == ord('q') or k == 27:
cv2.destroyAllWindows()
9、程序字符分割效果如下: