识别文档图像中的特定表格

信息处理 图像处理 神经网络
2022-02-04 19:39:46

我有一些已回答测试的图像。我正在努力识别每个测试中多项选择题的答案。一个例子: 测试示例

我认为这个问题可以分为两个子问题:1.)从测试的其余部分中识别和分割多项选择答案。2.) 将答案分类并识别为 A、B、C、D、E 中的字母之一。

对于第二个子问题,有像Tesseract这样的库,我也可以训练一个神经网络来识别五个字母,这并不难。

但是,我不确定如何处理第一个子问题。识别多项选择答案的最重要部分是识别包含多项选择答案的区域(示例中的红框区域)。由于多项选择答案通常写在一个有两行和 number_of_questions + 1 列的表中。我的第一步是在图像中识别此表。

识别此类表的最佳方法是什么?我目前正在考虑训练神经网络来识别表格。我应该使用模板匹配还是其他方法?哪一个更好?

1个回答

最简单的方法是通过二维归一化互相关进行模板匹配

这基本上是在寻找一个模板:一个代表回复字母的小图像,在一个(通常更大的)图像内。此操作返回的结果看起来像一个图像,但它本质上具有模板与图像匹配的峰值。

这种转移到这个问题的方法意味着必须对每个可能的答案进行一个互相关,并对每个结果图像进行“峰值”检查。

当然,这假设字母在整个文档中以单一比例出现。否则,也必须在不同的尺度上应用互相关(通过适当的方法)。

这里有两个组件需要仔细管理:

  1. 图像的质量和比例:

    这可以通过指示用户将相机视野的左上角与纸张对齐来粗略控制。这将限制与图像的距离,但仍取决于手机的镜头。

  2. 模板的质量和规模:

    这取决于#1 和用户的手写。但平均而言,可以使用大致相同大小的字体(如下所述)。

这是一个基于Pythonmatplotlibscikit-image的示例:

from matplotlib import imshow, show
from skimage.io import imread
from skimage.feature import match_template

#Load the image
Q = imread("tst4.jpg")

#Load the template, here it is the letter A from the Sans font, approximately at the same size as the hand-written provided
A = imread("letter2.png")

U = match_template(Q, A, pad_input = True)

#Show the result
imshow(U);show()

(请注意,可通过此链接获得更详细的版本)

结果U如下所示:

在此处输入图像描述

对于一个Q看起来像这样的:

在此处输入图像描述

A看起来像这样

在此处输入图像描述

U图像中,请注意红色对应于高峰值(非常接近 1.0)。只需在 的像素值上设置一个阈值,U就会返回“A”符号的中心。

当然,该图像中的其他形态似乎也具有很高的相关性。这些是“误报”,即算法认为存在“A”但实际上没有的地方。

有两种方法可以减少这些(并提高系统的可靠性):

  1. 在较小的区域上应用模板匹配(如果左上角与纸张边缘大致对齐,现在可以这样做)

  2. 为分类操作添加更多的特征,而不仅仅是模板和图像之间的互相关峰值,以使其更加健壮。这可能是复杂性的下一个级别,如果需要,可以提供更多信息。

希望这可以帮助。