2017-08-15 3 views
2

J'essaie d'extraire des données à partir d'un formulaire scanné. La forme a un format standard semblable à celui indiqué dans l'image ci-dessous:Python, détection de texte OCR

enter image description here

J'ai essayé d'utiliser pytesseract (Tesseract OCR) pour détecter le texte de l'image et il a fait un travail décent à trouver le texte et convertir l'image en texte. Cependant, il me donne essentiellement tout le texte détecté sans conserver le format des données.

Je voudrais être en mesure de faire quelque chose comme ci-dessous:

Trouver un élément particulier de texte, puis trouver les données associées ci-dessous ou à côté. Similaire à cette question en utilisant OpenCV Detect text region in image using Opencv

enter image description here

Est-il possible que je peux essentiellement faire ce qui suit:

  1. Ou trouver toutes les zones de texte sur le formulaire, effectuer l'OCR sur chaque boîte et de voir lequel est le plus proche du texte "witnesess:", puis trouve les sections immédiatement en dessous et effectue une OCR séparée sur celles-ci.
  2. Ou si le formulaire est standard et que je connais l'emplacement approximatif de la section de texte "témoin", puis-je spécifier son emplacement général dans opencv puis simplement extraire le texte ci-dessous et y effectuer une OCR.

EDIT: J'ai essayé le code ci-dessous pour tenter de détecter des régions spécifiques du texte. Cependant, il n'est pas spécifiquement identifier le texte seulement toutes les régions.

import cv2 

img = cv2.imread('t2.jpg') 
mser = cv2.MSER_create() 

img = cv2.resize(img, (img.shape[1]*2, img.shape[0]*2)) 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
vis = img.copy() 

regions = mser.detectRegions(gray) 
hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in regions[0]] 
cv2.polylines(vis, hulls, 1, (0,255,0)) 

cv2.imshow('img', vis) 

Voici le résultat:

enter image description here

+0

Tesseract peut vous donner des boîtes de délimitation, utilisez-vous un emballage? –

+0

Étant donné que vous semblez avoir le formulaire dans un format bien défini, vous pouvez définir manuellement certaines zones de délimitation, recadrer l'image et exécuter tesseract sur ces images recadrées individuellement. – ZdaR

Répondre

0

Je pense que vous avez déjà la réponse dans votre propre poste. Je l'ai fait récemment quelque chose de similaire et voici comment je l'ai fait:

//id_image was loaded with cv2.imread 
temp_image = id_image[start_y:end_y,start_x:end_x] 
img = Image.fromarray(temp_image) 
text = pytesseract.image_to_string(img, config="-psm 7") 

Donc, fondamentalement, si votre format est prédéfini, il vous suffit de connaître l'emplacement des champs que vous voulez que le texte (que vous avez déjà savoir), le recadrer, puis appliquer l'extraction ocr (tesseract).

Dans ce cas, vous avez besoin de import pytesseract, PIL, cv2, numpy.