2017-07-03 89 views
1

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

回答

0

嘗試找到領域的角落,計算角度/規模,而不僅僅是將圖像轉換成規範化的圖像。

相關問題