OpenCV:用于OCR的车牌字符分离

2024-04-16 04:01:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试自动读取车牌。 我训练了一个OpenCV-Haar级联分类器来分离源图像中的车牌,从而获得了合理的成功。下面是一个示例(注意黑色边框)。 Haar cascade classifier 在此之后,我尝试清理以下两种情况的车牌:

  • 利用支持向量机分离单个字符进行分类。在
  • 向Tesseract OCR提供干净的车牌,并提供有效字符的白名单。在

为了清理盘子,我执行以下变换:

# Assuming 'plate' is a sub-image featuring the isolated license plate
height, width = plate.shape
# Enlarge the license plate
cleaned = cv2.resize(plate, (width*3,height*3))
# Perform an adaptive threshold
cleaned = cv2.adaptiveThreshold(cleaned ,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11,7)
# Remove any residual noise with an elliptical transform
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
cleaned = cv2.morphologyEx(cleaned, cv2.MORPH_CLOSE, kernel)

我的目标是在去除任何噪音的同时,将角色隔离为黑色,将背景隔离为白色。在

使用这种方法,我发现我通常会得到三个结果之一:

图像太嘈杂。在

Noisy

删除太多(字符脱节)。在

Blotchy

合理(所有字符独立且一致)。在

Okay

I've included the original images and cropped plates in this album.

我意识到由于车牌的不一致性,我可能需要一个更动态的清理方法,但我不确定从哪里开始。我尝试过使用阈值和形态学函数的参数,但这通常只会导致对一个图像的过度调整。在

如何改进我的清理功能?在


Tags: the图像anlicense字符widthcv2kernel
1条回答
网友
1楼 · 发布于 2024-04-16 04:01:39

你要做的是很有挑战性的,你展示的样品仍然是简单的。在

首先,重要的是要获得一个良好的划分主要人物的区域。在

对于垂直分隔,请尝试找到充当分隔符的水平白线。对于更困难的情况,如“太嘈杂”,您可以计算沿水平线的统计信息,例如白线和黑线的分布情况—计数、平均长度、长度偏差—并在真字符和额外特征之间找到区分参数(顺便说一下,这将隐式检测白线)。在

这样,您将获得由相同类型的行组成的矩形,这些行可能会意外地被分割。尝试合并似乎属于真字符的矩形。下一步的处理将限于此矩形。在

对于垂直分隔,事情就不那么容易了,因为你会看到这样的情况:字符被分开,以便垂直线可以穿过它们;不同的字符被灰尘或其他杂乱的东西连接在一起。(在某些可怕的情况下,角色可能会接触到一个扩展区域。)

通过类似于上面的技术,找到候选垂直线。现在,除了形成几个假设,并列举这些分隔符的可能组合之外,您别无选择,因为字符的间距(轴之间)最小。在

在你形成这些假设之后,你可以通过执行字符识别和计算总分来决定最佳组合。(在这个阶段,我不认为在不知道字符可能的形状的情况下进行分割是不可能的,这就是为什么识别会起作用。)

相关问题 更多 >