OpenCV:隔离OCR

时间:2017-07-28 03:34:18

标签: python opencv image-processing ocr

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

  • 通过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)

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

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

图像太吵了。

Noisy

删除太多(字符脱节)。

Blotchy

合理(所有字符隔离且一致)。

Okay

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

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

如何改善清理功能?

1 个答案:

答案 0 :(得分:1)

您要做的事情非常具有挑战性,您展示的样本仍然很容易。

首先,重要的是要获得主要角色区域的良好划界。

对于垂直分隔,请尝试查找充当分隔符的水平白线。对于较难的情况,例如"太嘈杂",您可以沿水平线计算统计数据,例如白色和黑色运行的分布 - 计数,平均长度,长度的偏差 - 以及查找之间的区别参数跨越真实字符和额外功能的线条(顺便说一句,这将隐式检测白线)。

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

对于垂直划界,事情并非如此简单,因为你会看到字符被分割以便垂直线可以穿过它们的情况,以及不同字符被污垢或其他杂乱连接的情况。 (在一些可怕的情况下,角色可以在扩展区域上触摸。)

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

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