5
votes

Extraction d'une valeur associée à un texte particulier d'une image

J'ai une image et je souhaite extraire de l'image les détails de la paire clé / valeur.

À titre d'exemple, je souhaite extraire la valeur de "MASTER-AIRWAYBILL NO:"

Image

J'ai écrit pour extraire le texte entier de l'image en utilisant python opencv et OCR, mais je n'ai aucune idée de comment extraire uniquement la valeur de "MASTER -AIRWAYBILL NO: "à partir du texte de résultat entier de l'image.

Veuillez trouver le code:

import cv2
import numpy as np
import pytesseract
from PIL import Image
print ("Hello")
src_path = "C:\\Users\Venkatraman.R\Desktop\\alpha_bill.jpg"
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files (x86)\Tesseract-OCR\tesseract.exe"


print (src_path)


# Read image with opencv
img = cv2.imread(src_path)

# Convert to gray
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Apply dilation and erosion to remove some noise
kernel = np.ones((1, 1), np.uint8)
img = cv2.dilate(img, kernel, iterations=1)
img = cv2.erode(img, kernel, iterations=1)

# Write image after removed noise
cv2.imwrite(src_path + "removed_noise.png", img)

#  Apply threshold to get image with only black and white
#img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 31, 2)

# Write the image after apply opencv to do some ...
cv2.imwrite(src_path + "thres.png", img)

# Recognize text with tesseract for python
result = pytesseract.image_to_string(Image.open(src_path + "thres.png"))


# Remove template file
#os.remove(temp)


print ('--- Start recognize text from image ---')
print (result)

La sortie devrait donc ressembler à: p >

PROJET DE LOI MAÎTRE-AIRWAY NO: 157-46637194


0 commentaires

3 Réponses :


2
votes

Vous pouvez utiliser pytesseract image_to_string () et un regex pour extraire le texte souhaité, c'est-à-dire:

MASTER-AIRWAYBILL NO: 157—46637194

Sortie:

from PIL import Image
import pytesseract, re
f = "ocr.jpg"
t = pytesseract.image_to_string(Image.open(f))
m = re.findall(r"MASTER-AIRWAYBILL NO: [\d—-]+", t)
if m:
    print(m[0])


6 commentaires

La sortie s'imprime vide


Comme d'habitude, j'ai testé le code de la réponse (python 3.6) et cela fonctionne comme prévu. Le fichier image que j'ai utilisé est le même que dans votre question: i.stack.imgur.com /RKebi.jpg . Voulez-vous commenter le vote défavorable?


Même si j'utilise le même, j'ai vérifié en imprimant le t il est en train d'imprimer mais il n'imprime pas la valeur de m


J'ai utilisé la dernière version de pytesseract pour py3.6 . Si vous ne l'utilisez pas, veuillez le mettre à jour. Je ne vois aucune autre raison pour laquelle vos résultats sont différents des miens.


J'utilise la version 3.7.1 de python


Et si je veux la valeur pour le destinataire à partir de l'image?



0
votes

J'utilise python 2.7 et je veux aussi trouver le nom du fournisseur à partir de l'image comment trouver?

m = re.findall (r "MASTER-AIRWAYBILL NO: [\ d —-] +", t) pour la ligne ci-dessus son erreur d'affichage

et si j'utilise m = re.findall (r'Vendor Name: [\ d -] + ', t) alors aussi son erreur d'affichage


1 commentaires

Bienvenue dans SO, si vous rencontrez un problème, postez une nouvelle question, cela ne répond pas à OP. Une fois que vous avez suffisamment de réputation, vous pouvez ajouter un commentaire à OP.



0
votes

Vous pouvez essayer ceci après avoir installé tesseract.

from PIL import Image
import pytesseract, re
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
t = pytesseract.image_to_string(Image.open("path"))
m = re.findall(r"Invoice No. [\d—-]+", t)
if m:
    print(m[0])


0 commentaires