首页 > 解决方案 > 从带框字段输入的表单中提取字符

问题描述

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

样本打印表格

样本打印表格

我目前的做法如下:

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

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

对齐日期裁剪

对齐日期裁剪.

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

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

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

标签: pythonopencvimage-processingocrform-processing

解决方案


由于框边缘通常比其中的文本更薄(如您的情况),我们可以利用此信息。通过应用水平形态闭合核(Dilation -> Erosion),我们可以将细垂直线设为白色,这将有助于 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. 样本图像.png 在此处输入图像描述

  2. 样本输出.png 在此处输入图像描述


推荐阅读