OpenCV:为 OCR 隔离车牌字符

Posted

技术标签:

【中文标题】OpenCV:为 OCR 隔离车牌字符【英文标题】:OpenCV: Isolating licence plate characters for OCR 【发布时间】:2018-01-03 23:43:41 【问题描述】:

我正在尝试自动读取车牌。 我已经训练了一个 OpenCV Haar Cascade 分类器来隔离源图像中的车牌以取得合理的成功。这是一个示例(注意黑色边界矩形)。 在此之后,我尝试清理以下任一的车牌:

隔离单个字符以通过 SVM 进行分类。 向 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)

我的目标是将字符隔离为黑色,将背景隔离为白色,同时消除任何噪音。

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

图像太嘈杂。

删除太多(字符脱节)。

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

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

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

如何改进我的清理功能?

【问题讨论】:

你所说的“太吵”其实是“多余的字符或图形太多”,这是美式车牌的共同特征。 【参考方案1】:

您正在尝试做的事情非常具有挑战性,并且您展示的示例仍然很容易。

首先,重要的是要对主要角色区域进行良好的划分。

对于垂直定界,请尝试找到用作分隔符的水平白线。对于较困难的情况,例如“噪音太大”,您可以计算沿水平线的统计数据,例如白色和黑色运行的分布 - 计数、平均长度、长度偏差 - 并找到跨真实字符的行之间的区分参数和额外的功能(顺便说一下,这将隐式检测白线)。

这样做,您将获得由相同类型的行组成的矩形,这些矩形可能会不小心被碎片化。尝试合并似乎属于真实字符的矩形。下一步的处理将仅限于这个矩形。

对于垂直定界,事情并不那么容易,因为您会看到字符被分割以便垂直线可以穿过它们的情况,以及不同字符被污垢或其他杂物连接的情况。 (在某些可怕的情况下,字符可能会接触到一个扩展区域。)

通过与上述类似的技术,找到候选垂直线。现在,除了形成几个假设并枚举这些分隔符的可能组合外,您别无选择,受字符具有最小间距(在它们的轴之间)这一事实的限制。

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

【讨论】:

以上是关于OpenCV:为 OCR 隔离车牌字符的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV实现车牌识别,OCR分割,ANN神经网络

在 OpenCV C++ 中为 OCR 规范化车牌

Python项目演练:使用深度学习自动识别车牌号附源代码

OpenCV+Python实现将车牌数字分割为单个的字符图片

OCR 的最小字符大小

Python opencv 简单的车牌识别 —— 简单学习