如何在此图像中找到特定的表格字段

问题描述:

在巴西,医院中的每个新生儿都有一张标准表格(由手工填写)。这种形式被称为“DNV”(在葡萄牙语之后的“Born Alive Declaration”)。还有一种叫做“DO”的形式(葡萄牙语之后是“去世宣言”)。在我所在的州,医院向我所在的机构发送近百万份这样的表格,在那里我们计算一个名为“生命统计”的数据库。我正在调查是否可以自动化工作。由于商业化的ICR解决方案需要花费大量资金,因此无人负责认为它可以在内部完成,因此这是一个草根项目。如何在此图像中找到特定的表格字段

形式的顶部是这样的: enter image description here

我使用了我的手到从几家医院发送100K的PDF文件,并能够把它们分为两种类型之一(DNV或DO)天真的算法:首先我找到包含文档类型的黑色矩形(使用cv2.findContours和一些启发式)并应用OCR(pytesseract.image_to_string)。我发现了20k“死亡宣言”(DO)和80k“活生生宣言”。

使用类似的算法,我能够OCR在黑色矩形右边的数字,并链接55k形式的图像与专业打字员根据这些文件填充数据库中的相应记录。

现在我想找到日期字段(红色),以试了一下机器学习的识别数字 - 该领域概述如下: enter image description here

开始我尝试了“模板匹配”以此为模板的算法:enter image description here

这很有效,但前提是模板和表格图像的尺寸和角度相同。方法对比例非常敏感。我尝试了使用SURF的特征匹配算法,但是我很难让它起作用(感觉像是矫枉过正)。

因为它是很容易找到在左边的黑色矩形,我想一些选项,以找到数字:

  • 正常化的规模和角度基于黑色矩形,并试图cv2.matchTemplate

  • 试图找到轮廓,使用cv2.approxPolyDP简化它并猜测数字的位置。

我的问题是:关于如何解决问题的任何建议?如果输入的分辨率/角度没有标准化,我可以使用其他什么算法来定位这个表单域?

[更新#1]

鉴于(X,Y,W,H)作为位置和在左侧的黑色矩形的大小,我可以缩小以合理置信度搜索。enter image description here

尝试随机样本,这个公式给我:

img.crop((x+w, y+h/3, x+h*3.05, y+2*h/3)) 

enter image description here enter image description here enter image description here

[更新#2]

我刚刚得知erodedilate,现在他们我的新朋友。

horizontal = edges.copy() 
vertical = edges.copy() 

kv = np.ones((25, 1), np.uint8) 
kh = np.ones((1, 30), np.uint8) 

horizontal = cv2.dilate(cv2.erode(horizontal, kh, iterations=2), kh, iterations=2) 
vertical = cv2.dilate(cv2.erode(vertical, kv, iterations=2), kv, iterations=2) 

grid = horizontal | vertical 

plt.imshow(edges, 'gray') 

enter image description here

plt.imshow(grid, 'gray') 

enter image description here

BTW,我没有一个关于计算机视觉线索。让我们回到谷歌...

尝试找到领域的角落,计算角度/规模,而不仅仅是将图像转换成规范化的图像。