Nous avons vu la semaine dernière comment utiliser tesseract dans un invité de commande. Nous avons également vu que de petites modifications pouvaient diminuer les performances de la reconnaissance de caractères. Il nous est alors venu à l’idée de réaliser un traitement de l’image afin d’améliorer le résultat. Nous allons donc utiliser OpenCV pour effectuer les prétraitements avant d’utiliser la reconnaissance de caractères.

reconnaissance de caractères sans seuil
Sans prétraitements ….

Il sera nécessaire pour cela d’utiliser pytesseract, une librairie qui permet d’appeler Tesseract depuis Python. Une des problématiques rencontrée dans l’utilisation de cette librairie avec OpenCV est que pyTesseract accepte comme entrée une image au format PIL (Picture Imaging Library) et non une image Numpy. Il sera donc nécessaire de convertir notre image afin de pouvoir l’exploiter avec OpenCV.

Installation de pytesseract

L’installation de pytesseract se fait sans problème grâce à la commande:

pip3 install pytesseract

Pendant l’installation, Pillow sera installé. Il s’agit d’un fork de PIL, car cette librairie n’est plus maintenue depuis 2009 et surtout non disponible avec Python3.

Reconnaissance de caractères avec OpenCV

Nous pouvons donc passer au programme !
Nous commençons par importer les librairies nécessaires: cv2, PIL et pytesseract

import cv2
from PIL import Image
import pytesseract

image = cv2.imread('bienvenue.bmp')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
utiliser tesseract avec OpenCV: image barrée

L’étape qui suit est logiquement le chargement de l’image (ligne 5), puis de convertir l’image en niveau de gris (ligne 6).

Afin d’enlever le trait, nous réalisons un seuillage binaire afin d’enlever toute partie dont la valeur des pixels est supérieure à zéro (ligne 7)

_, gray = cv2.threshold(gray, 10, 255,cv2.THRESH_BINARY)

Pour l’instant rien de nouveau.

Il est maintenant nécessaire de passer notre image qui est de type ‘numpy.ndarray’ en une image lisible par pytesseract, c’est-à-dire une image de type ‘PIL.Image’. Pour ce faire, nous appelons la fonction ‘fromarray’ de PIL (ligne 9). Cette fonction permet d’importer une image depuis une matrice. Ça tombe bien c’est ce que nous voulons!

Notre image au bon format, nous pouvons appeler Tesseract (ligne 10).

img = Image.fromarray(gray)
txt = pytesseract.image_to_string(img)
print(txt)

Comme son nom l’indique, cette fonction convertie une image vers une chaine de caractères. Il nous reste plus qu’à afficher les caractères extraits (ligne 11).

reconnaissance de caractères

Mission accomplie !

Nous avons vu aujourd’hui comment utiliser tesseract en python avec l’utilisation de pytesseract. Cette librairie nous a permis de pouvoir utiliser OpenCV afin de réaliser des prétraitements permettant d’améliorer la reconnaissance de caractères.


2 commentaires

ManonMG · 29 avril 2019 à 9 h 45 min

Bonjour, merci pour cet article qui m’aide pour mon projet pour le Bac de SI. Je dois détecter des caractères sur une image.
Cependant quand j’essaie votre programme, cela ne marche pas et j’obtiens le message d’erreur suivant :
Traceback (most recent call last):
File « /home/pi/Projet/Reconnaissance texte.py », line 12, in
img = Image.fromarray(gray)
File « /usr/lib/python3/dist-packages/PIL/Image.py », line 2185, in fromarray
arr = obj.__array_interface__
AttributeError: ‘tuple’ object has no attribute ‘__array_interface__’

Je ne comprends pas ce qui ne va pas. Avez-vous une idée qui pourrait m’aider?

    Florent · 29 avril 2019 à 17 h 52 min

    Bonjour,
    Je pense que la variable gray soit un tuple et non un array.
    Vérifiez la ligne 7 soit bien « _, gray = cv2.threshold(gray, 10, 255,cv2.THRESH_BINARY) » et non « gray = cv2.threshold(gray, 10, 255,cv2.THRESH_BINARY) »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.