如何在此图像中找到特定的表格字段
在巴西,医院中的每个新生儿都有一张标准表格(由手工填写)。这种形式被称为“DNV”(在葡萄牙语之后的“Born Alive Declaration”)。还有一种叫做“DO”的形式(葡萄牙语之后是“去世宣言”)。在我所在的州,医院向我所在的机构发送近百万份这样的表格,在那里我们计算一个名为“生命统计”的数据库。我正在调查是否可以自动化工作。由于商业化的ICR解决方案需要花费大量资金,因此无人负责认为它可以在内部完成,因此这是一个草根项目。如何在此图像中找到特定的表格字段
我使用了我的手到从几家医院发送100K的PDF文件,并能够把它们分为两种类型之一(DNV或DO)天真的算法:首先我找到包含文档类型的黑色矩形(使用cv2.findContours
和一些启发式)并应用OCR(pytesseract.image_to_string
)。我发现了20k“死亡宣言”(DO)和80k“活生生宣言”。
使用类似的算法,我能够OCR在黑色矩形右边的数字,并链接55k形式的图像与专业打字员根据这些文件填充数据库中的相应记录。
现在我想找到日期字段(红色),以试了一下机器学习的识别数字 - 该领域概述如下:
这很有效,但前提是模板和表格图像的尺寸和角度相同。方法对比例非常敏感。我尝试了使用SURF的特征匹配算法,但是我很难让它起作用(感觉像是矫枉过正)。
因为它是很容易找到在左边的黑色矩形,我想一些选项,以找到数字:
正常化的规模和角度基于黑色矩形,并试图
cv2.matchTemplate
。试图找到轮廓,使用
cv2.approxPolyDP
简化它并猜测数字的位置。
我的问题是:关于如何解决问题的任何建议?如果输入的分辨率/角度没有标准化,我可以使用其他什么算法来定位这个表单域?
[更新#1]
鉴于(X,Y,W,H)作为位置和在左侧的黑色矩形的大小,我可以缩小以合理置信度搜索。
尝试随机样本,这个公式给我:
img.crop((x+w, y+h/3, x+h*3.05, y+2*h/3))
[更新#2]
我刚刚得知erode
和dilate
,现在他们我的新朋友。
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')
plt.imshow(grid, 'gray')
BTW,我没有一个关于计算机视觉线索。让我们回到谷歌...
尝试找到领域的角落,计算角度/规模,而不仅仅是将图像转换成规范化的图像。