Tesseract OCR en Python
avec pytesseract.
Un guide complet et testé de pytesseract : installation, API principale, prétraitement d'images, PDF, scores de confiance, configuration PSM/OEM, performance et erreurs courantes.
Démarrage rapide (trois lignes)
Installez d'abord le moteur, puis exécutez ceci. La configuration complète suit plus bas.
import pytesseract
from PIL import Image
text = pytesseract.image_to_string(Image.open("image.png"))
print(text)Installer pytesseract
pytesseract n'est qu'un wrapper : il appelle le binaire Tesseract, donc le moteur doit être installé au préalable.
pip install pytesseract pillow
# optionnel, pour le prétraitement :
pip install opencv-python numpy
# optionnel, pour l'entrée PDF :
pip install pdf2imageSi le moteur n'est pas dans votre PATH (fréquent sous Windows), indiquez-le explicitement :
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"Nouveau avec le moteur ? Consultez le guide d'installation pour Windows, macOS, Linux, Docker et WSL.
API principale
pytesseract expose une fonction par type de sortie. Choisissez celle qui correspond à votre besoin.
| Fonction | Renvoie | À utiliser quand |
|---|---|---|
image_to_string | Texte brut | Vous ne voulez que le texte reconnu |
image_to_data | Boîtes par mot + confiance | Surligner le texte, filtrer les mots peu sûrs |
image_to_boxes | Boîtes par caractère | Géométrie au niveau du caractère |
image_to_pdf_or_hocr | PDF interrogeable ou hOCR | Créer des PDF interrogeables ou des overlays web |
image_to_osd | Détection d'orientation et de script | Détecter la rotation ou le script avant l'OCR |
image_to_alto_xml | ALTO XML | Pipelines d'archivage / bibliothèques |
Configuration : PSM, OEM, langues et liste de caractères
Passez les options sous forme de chaîne séparée par des espaces à config=.
# Un seul bloc de texte, moteur LSTM, français
text = pytesseract.image_to_string(img, lang="fra", config="--oem 3 --psm 6")
# Chiffres uniquement (totaux de reçus, relevés de compteurs)
text = pytesseract.image_to_string(img, config="--psm 7 -c tessedit_char_whitelist=0123456789.")
# Langues combinées
text = pytesseract.image_to_string(img, lang="eng+fra")| PSM | Mode | Idéal pour |
|---|---|---|
| 3 | Entièrement automatique (par défaut) | Documents standards |
| 4 | Une colonne de tailles variables | Articles, pages à une colonne |
| 6 | Un bloc de texte uniforme | Paragraphes, étiquettes |
| 7 | Une seule ligne de texte | Légendes d'une ligne, champs isolés |
| 8 | Un seul mot | Mots individuels |
| 11 | Texte épars | Reçus, texte d'interface dispersé |
| 13 | Ligne brute | Une ligne sans astuces Tesseract |
Modes OEM : --oem 1 (LSTM seul, par défaut en v5), --oem 0 (hérité), --oem 3 (auto). Référence complète dans la documentation.
Prétraitement d'images
Une entrée propre est le principal facteur de précision. Voici les étapes qui comptent le plus.
import cv2, numpy as np, pytesseract
from PIL import Image
image = cv2.imread("recu.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Mettre à l'échelle le petit texte vers ~300 DPI
gray = cv2.resize(gray, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
# Réduire le bruit puis seuillage d'Otsu en noir et blanc
blur = cv2.GaussianBlur(gray, (5, 5), 0)
_, binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
text = pytesseract.image_to_string(Image.fromarray(binary))- Niveaux de gris — supprimez les canaux de couleur avant le seuillage.
- Mise à l'échelle — le texte sous ~20 px est mal reconnu ; agrandissez-le.
- Seuillage — Otsu pour un éclairage uniforme, adaptatif sinon.
- Réduction du bruit — un léger flou retire les taches lues comme ponctuation.
- Redressement — corrigez la rotation avec
cv2.minAreaRectavant l'OCR. - Recadrage des bords — supprimez les bords sombres du scan.
Positions et scores de confiance
Utilisez image_to_data pour obtenir des boîtes par mot et une confiance de 0 à 100, puis filtrez le bruit.
from pytesseract import Output
data = pytesseract.image_to_data(img, output_type=Output.DICT)
for text, conf in zip(data["text"], data["conf"]):
if text.strip() and float(conf) > 60: # écarter le bruit peu fiable
print(round(float(conf)), text)OCR d'un PDF en Python
Tesseract travaille sur des images : rastérisez d'abord les pages avec pdf2image (qui nécessite poppler).
import io, pytesseract
from pdf2image import convert_from_path
from pypdf import PdfWriter, PdfReader
pages = convert_from_path("scan.pdf", dpi=300) # nécessite poppler
writer = PdfWriter()
for page in pages:
pdf_bytes = pytesseract.image_to_pdf_or_hocr(page, extension="pdf")
writer.add_page(PdfReader(io.BytesIO(pdf_bytes)).pages[0])
with open("scan_interrogeable.pdf", "wb") as f:
writer.write(f)Sous Windows, passez le dossier bin de poppler via poppler_path=. Pour un flux plus complet, voir la documentation sur les formats de sortie.
Performance
pytesseract appelle la CLI à chaque appel, donc le débit dépend de la structure.
| Approche | Quand | Compromis |
|---|---|---|
pytesseract par appel | Scripts et tâches ponctuelles | Lance un processus par appel — lent en boucle |
| Regrouper en TIFF multipage | Beaucoup de pages, mêmes réglages | Un processus pour plusieurs pages |
multiprocessing | Beaucoup d'images indépendantes | Utilise tous les cœurs ; plus de mémoire |
tesserocr | Fort volume, en processus | Binding natif, configuration plus lourde |
Catalogue d'erreurs
Ces erreurs couvrent la majorité des problèmes avec pytesseract.
| Erreur | Cause | Solution |
|---|---|---|
TesseractNotFoundError | Binaire non installé ou absent du PATH | Installez le moteur ou définissez pytesseract.pytesseract.tesseract_cmd. |
(-215:Assertion failed) src.type() == CV_8UC1 | Seuillage sur une image à 3 canaux | Convertissez avec cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) d'abord. |
Error opening data file ...fra.traineddata | Paquet de langue manquant | Installez la langue ou définissez TESSDATA_PREFIX. |
| Sortie vide | DPI faible, mauvais PSM ou pas de texte | Mettez à l'échelle, testez --psm 6/7/11, prétraitez. |
| Très lent en boucle | Un processus par appel | Regroupez, utilisez multiprocessing ou tesserocr. |
Mesurer la précision
Mesurez les taux d'erreur de caractères et de mots au lieu de juger la sortie à l'œil.
import pytesseract, jiwer
from PIL import Image
hypothesis = pytesseract.image_to_string(Image.open("exemple.png"))
reference = open("exemple.gt.txt").read()
print("CER:", jiwer.cer(reference, hypothesis))
print("WER:", jiwer.wer(reference, hypothesis))Gardez un petit jeu d'images représentatives avec leur texte de référence comme tests de régression et relancez-les quand vous changez le prétraitement ou la configuration.
FAQ Python
Comment utiliser Tesseract OCR en Python ?
Installez d'abord le moteur, puis pip install pytesseract pillow. Ouvrez l'image avec Pillow et appelez pytesseract.image_to_string(img).
Pourquoi TesseractNotFoundError ?
pytesseract ne trouve pas le binaire. Installez le moteur, mettez-le dans le PATH ou définissez pytesseract.pytesseract.tesseract_cmd avec le chemin complet.
Comment améliorer la précision ?
Mettez à l'échelle ~300 DPI, niveaux de gris, seuillage, réduction du bruit, redressement et le bon --psm. Utilisez le lang= adapté et, pour les champs fixes, une liste de caractères autorisés.
Comment faire l'OCR d'un PDF ?
Utilisez pdf2image (avec poppler) pour convertir les pages en images, lancez pytesseract sur chacune et combinez avec image_to_pdf_or_hocr(..., extension="pdf").
Comment obtenir les scores de confiance ?
Utilisez image_to_data(..., output_type=Output.DICT) et filtrez la liste conf.
pytesseract est-il lent ?
Chaque appel lance un processus. Regroupez, utilisez multiprocessing ou passez au binding en processus tesserocr pour un fort débit.
Étapes suivantes
Approfondissez le moteur et l'écosystème.