web-dev-qa-db-fra.com

OpenCV MSER détecte les zones de texte - Python

J'ai une image de facture et je veux y détecter le texte. Je prévois donc d'utiliser 2 étapes: la première consiste à identifier les zones de texte, puis à utiliser l'OCR pour reconnaître le texte.

J'utilise OpenCV 3.0 dans python pour cela. Je suis capable d'identifier le texte (y compris certaines zones non textuelles) mais je veux en outre identifier les zones de texte de l'image (excluant également les non zones de texte).

Mon image d'entrée est: Original et la sortie est: Processed et j'utilise le code ci-dessous pour cela:

img = cv2.imread('/home/mis/Text_Recognition/bill.jpg')
mser = cv2.MSER_create()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #Converting to GrayScale
gray_img = img.copy()

regions = mser.detectRegions(gray, None)
hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in regions]
cv2.polylines(gray_img, hulls, 1, (0, 0, 255), 2)
cv2.imwrite('/home/mis/Text_Recognition/amit.jpg', gray_img) #Saving

Maintenant, je veux identifier les zones de texte et supprimer/ne pas identifier les zones non textuelles sur la facture. Je suis nouveau sur OpenCV et je suis débutant en Python. Je peux trouver des exemples dans exemple MATAB et exemple C++ , mais si je les convertis en python, cela me prendra beaucoup de temps.

Existe-t-il un exemple avec python en utilisant OpenCV, ou quelqu'un peut-il m'aider avec cela?

21
Amit Madan

Ci-dessous le code

# Import packages 
import cv2
import numpy as np

#Create MSER object
mser = cv2.MSER_create()

#Your image path i-e receipt path
img = cv2.imread('/home/rafiullah/PycharmProjects/python-ocr-master/receipts/73.jpg')

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

vis = img.copy()

#detect regions in gray scale image
regions, _ = mser.detectRegions(gray)

hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in regions]

cv2.polylines(vis, hulls, 1, (0, 255, 0))

cv2.imshow('img', vis)

cv2.waitKey(0)

mask = np.zeros((img.shape[0], img.shape[1], 1), dtype=np.uint8)

for contour in hulls:

    cv2.drawContours(mask, [contour], -1, (255, 255, 255), -1)

#this is used to find only text regions, remaining are ignored
text_only = cv2.bitwise_and(img, img, mask=mask)

cv2.imshow("text only", text_only)

cv2.waitKey(0)
15
RAFI AFRIDI

Ceci est un ancien article, mais j'aimerais ajouter que si vous essayez d'extraire tous les textes d'une image, voici le code pour obtenir ce texte dans un tableau.

import cv2
import numpy as np
import re
import pytesseract
from pytesseract import image_to_string
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
from PIL import Image

image_obj = Image.open("screenshot.png")

rgb = cv2.imread('screenshot.png')
small = cv2.cvtColor(rgb, cv2.COLOR_BGR2GRAY)

#threshold the image
_, bw = cv2.threshold(small, 0.0, 255.0, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)

# get horizontal mask of large size since text are horizontal components
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 1))
connected = cv2.morphologyEx(bw, cv2.MORPH_CLOSE, kernel)

# find all the contours
contours, hierarchy,=cv2.findContours(connected.copy(),cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
#Segment the text lines
counter=0
array_of_texts=[]
for idx in range(len(contours)):
    x, y, w, h = cv2.boundingRect(contours[idx])
    cropped_image = image_obj.crop((x-10, y, x+w+10, y+h ))
    str_store = re.sub(r'([^\s\w]|_)+', '', image_to_string(cropped_image))
    array_of_texts.append(str_store)
    counter+=1

print(array_of_texts)
0
shreyash sharma