ブラジルでは、病院のすべての新生児に標準的なフォームが手書きで入力されています。この形式は「DNV」と呼ばれます(ポルトガル語の「生きた宣言」の後)。ポルトガル語の "Decease Declaration"の後に "DO"という形式もあります。私の状態では、病院は、これらのフォームの数百万に近いものを私が働く代理店に送ります。そこでは、「重要な統計」というデータベースを計算します。私は仕事を自動化することが可能かどうか調査中です。商用のICRソリューションは多額の費用がかかりますので、誰も内部で行うことはできないと考えているので、草の根のプロジェクトです。この画像で特定のフォームフィールドを見つける方法
私が使用していくつかの病院から送られた100K PDFファイルに私の手を持って、2種類のいずれかにそれらを分類することができた(DNVまたはDO)単純なアルゴリズム:最初に、ドキュメントの種類(cv2.findContours
と少しのヒューリスティックを使用)を含む黒い矩形を探し、OCR(pytesseract.image_to_string
)を適用します。私は20kの "死の宣言"(DO)と80k "生きた生き残り宣言"を見つけました。
類似のアルゴリズムを使用して、黒い四角形の右側の数字をOCRすることができ、これらのドキュメントに基づいて専門のタイピストによって記入されたデータベース内の対応するレコードと画像をリンクすることができました。
今、私は数字を認識するための機械学習のビットを試みるために(赤で)日付フィールドを見つけたい - フィールドは、以下の強調表示されています:
まず私は、「テンプレートマッチング」を試してみましたこれをテンプレートとして使用するアルゴリズム:
テンプレートとフォームイメージのスケールと角度が同じ場合にのみ、これはうまくいきます。 cv2.matchTemplate
メソッドは実際にスケールに敏感です。私は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')
ところで私は、コンピュータビジョンについての手掛かりを持っていません。 Googleに戻ってみましょう...