在巴西,醫院中的每個新生兒都有一張標準表格(由手工填寫)。這種形式被稱爲「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,我沒有一個關於計算機視覺線索。讓我們回到谷歌...