使用带框的字段输入从表单中提取字符

时间:2019-05-22 09:22:34

标签: python opencv image-processing ocr form-processing

我正在尝试从带有框的表单的所有字段中提取字符,例如此处显示的框:

示例打印表格

Sample printed form

我当前的方法如下:

  1. 根据某种标准格式从表单中裁剪字段。
  2. 对图像进行预处理并在视场周围找到轮廓。
  3. 根据该字段中的框数,裁剪每个小框并在这些裁剪的字符图像上运行字符识别。

这些框在图像中可能会稍微倾斜。我使用对齐算法,但是它仍然不能总是拉直盒子的边缘。在这张图中可以看到:

对齐日期作物

Aligned date crop

在此类图像上,当我使用直线裁切字符时(上述算法的第3步),还包括了框的边缘,这会使字符识别模块感到困惑。例如,数字“ 3”和“盒子边缘”有时表示为31。

我只想使用经过预先训练的模型,因此,我正在寻找一种更好的方法来从装箱的字段中正确提取字符。

我非常感谢SO社区提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

由于通常情况下,框的边缘比框内的文本要薄,所以我们可以利用这些信息。 通过应用水平形态学封闭核(“膨胀”->“侵蚀”),我们可以使垂直细线变为白色,这将有助于OCR。处理后可能会留下一些垃圾,但这不会影响OCR的准确性。内核的大小取决于边界线的宽度。显然,您可以根据自己的情况进行调整。

这是示例代码:

import cv2
import numpy as np
im = cv2.imread('sample_image.png')
im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)

k1 = (4,1)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, k1)
im = cv2.morphologyEx(im, cv2.MORPH_CLOSE, kernel, iterations=1)

_,im = cv2.threshold(im, thresh=200, maxval=255, type=cv2.THRESH_BINARY)
cv2.imwrite('sample_output.png',im)

这是图像:

  1. sample_image.png enter image description here

  2. sample_output.png enter image description here