J'utilise python-tesseract pour extraire des mots d'une image. Ceci est un wrapper python pour tesseract qui est un code OCR.
J'utilise le code suivant pour obtenir les mots:
import tesseract
api = tesseract.TessBaseAPI()
api.Init(".","eng",tesseract.OEM_DEFAULT)
api.SetVariable("tessedit_char_whitelist", "0123456789abcdefghijklmnopqrstuvwxyz")
api.SetPageSegMode(tesseract.PSM_AUTO)
mImgFile = "test.jpg"
mBuffer=open(mImgFile,"rb").read()
result = tesseract.ProcessPagesBuffer(mBuffer,len(mBuffer),api)
print "result(ProcessPagesBuffer)=",result
Cela ne renvoie que les mots et pas leur emplacement/taille/orientation (ou, en d'autres termes, un cadre de sélection les contenant) dans l'image. Je me demandais s'il y avait un moyen de l'obtenir aussi
La méthode tesseract.GetBoxText()
renvoie la position exacte de chaque caractère dans un tableau.
En outre, il existe une option de ligne de commande tesseract test.jpg result hocr
qui générera un fichier result.html
avec les coordonnées de chaque mot reconnu. Mais je ne suis pas sûr qu'il puisse être appelé via un script python.
En utilisant le code ci-dessous, vous pouvez obtenir le cadre de sélection correspondant à chaque caractère.
import csv
import cv2
from pytesseract import pytesseract as pt
pt.run_tesseract('bw.png', 'output', lang=None, boxes=True, config="hocr")
# To read the coordinates
boxes = []
with open('output.box', 'rb') as f:
reader = csv.reader(f, delimiter = ' ')
for row in reader:
if(len(row)==6):
boxes.append(row)
# Draw the bounding box
img = cv2.imread('bw.png')
h, w, _ = img.shape
for b in boxes:
img = cv2.rectangle(img,(int(b[1]),h-int(b[2])),(int(b[3]),h-int(b[4])),(255,0,0),2)
cv2.imshow('output',img)
Python tesseract peut le faire sans écrire dans un fichier, en utilisant la fonction image_to_boxes
:
import cv2
import pytesseract
filename = 'image.png'
# read the image and get the dimensions
img = cv2.imread(filename)
h, w, _ = img.shape # assumes color image
# run tesseract, returning the bounding boxes
boxes = pytesseract.image_to_boxes(img) # also include any config options you use
# draw the bounding boxes on the image
for b in boxes.splitlines():
b = b.split(' ')
img = cv2.rectangle(img, (int(b[1]), h - int(b[2])), (int(b[3]), h - int(b[4])), (0, 255, 0), 2)
# show annotated image and wait for keypress
cv2.imshow(filename, img)
cv2.waitKey(0)
Utilisez pytesseract.image_to_data()
import pytesseract
from pytesseract import Output
import cv2
img = cv2.imread('image.jpg')
d = pytesseract.image_to_data(img, output_type=Output.DICT)
n_boxes = len(d['level'])
for i in range(n_boxes):
(x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow('img', img)
cv2.waitKey(0)
Parmi les données renvoyées par pytesseract.image_to_data()
:
left
est la distance entre le coin supérieur gauche de la zone de délimitation et le bord gauche de l'image.top
est la distance entre le coin supérieur gauche du cadre de sélection, et le bord supérieur de l'image.width
et height
sont la largeur et la hauteur du cadre de sélection.conf
est la confiance du modèle pour la prédiction de Word dans ce cadre de sélection. Si conf
est -1, cela signifie que le cadre de sélection correspondant contient un bloc de texte et non un seul mot.Les boîtes englobantes retournées par pytesseract.image_to_boxes()
sont accompagnées de lettres; je crois donc que pytesseract.image_to_data()
est ce que vous recherchez.
Je commenterais sous lennon310 mais je n'ai pas assez de réputation pour commenter ...
Pour exécuter sa commande en ligne de commande tesseract test.jpg result hocr
dans un script python:
from subprocess import check_call
tesseractParams = ['tesseract', 'test.jpg', 'result', 'hocr']
check_call(tesseractParams)