OCR pour les documents numérisés
Tesseract via pytesseract, prétraitement des images et amélioration de la précision.
OCR pour les documents numérisés est une leçon AI Agents gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Agents, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Agents comprend 4 leçons au total.
Quand l'OCR est nécessaire
Tous les documents ne sont pas des PDF créés numériquement. Les documents numérisés, les photographies de texte, les notes manuscrites et les PDF constitués d'images nécessitent la reconnaissance optique de caractères (OCR) pour extraire le texte.
L'OCR convertit les images pixelisées de texte en caractères lisibles par une machine. Deux bibliothèques Python de premier plan sont pytesseract (Google Tesseract) et EasyOCR (apprentissage profond, multilingue).
Bases de pytesseract
pytesseract est une bibliothèque Python qui encapsule le moteur OCR Tesseract de Google. Installez d'abord Tesseract (au niveau de l'OS), puis exécutez pip install pytesseract Pillow.
import pytesseract
from PIL import Image
# Simple text extraction
image = Image.open('scanned_document.png')
text = pytesseract.image_to_string(image)
print(text)
# Specify language (default: English)
text_fr = pytesseract.image_to_string(
Image.open('french_doc.png'),
lang='fra'
)
# Get detailed output with bounding boxes
data = pytesseract.image_to_data(
image,
output_type=pytesseract.Output.DICT
)
for i, word in enumerate(data['text']):
if word.strip():
conf = data['conf'][i]
print(f'Word: {word!r:20} Confidence: {conf}')Prétraitement des images : niveaux de gris
La précision de l'OCR dépend fortement de la qualité de l'image. La première étape de prétraitement consiste à convertir l'image en niveaux de gris : la couleur ajoute du bruit sans améliorer la reconnaissance des caractères.
Utilisez Pillow ou OpenCV pour le prétraitement. Les niveaux de gris réduisent le bruit et améliorent la détection des contours des caractères par Tesseract.
from PIL import Image, ImageOps
import numpy as np
def preprocess_grayscale(image_path):
img = Image.open(image_path)
# Convert to grayscale
img = img.convert('L') # 'L' = 8-bit grayscale
# Optionally resize for better OCR (Tesseract works best at ~300 DPI)
# Scale up small images
width, height = img.size
if width < 800:
scale = 800 / width
new_size = (int(width * scale), int(height * scale))
img = img.resize(new_size, Image.LANCZOS)
return img
img = preprocess_grayscale('scan.jpg')
text = pytesseract.image_to_string(img)
print(text[:300])Prétraitement des images : seuillage
Le seuillage transforme une image en niveaux de gris en une image entièrement en noir et blanc. Cela supprime les ombres grises, l'éclairage irrégulier et le bruit de fond, ce qui fait ressortir nettement le texte pour l'OCR.
from PIL import Image, ImageFilter
import numpy as np
def apply_threshold(img):
# Method 1: Simple fixed threshold
img_array = np.array(img)
threshold = 128
binary = np.where(img_array > threshold, 255, 0).astype(np.uint8)
return Image.fromarray(binary)
def adaptive_threshold(img):
# Method 2: Otsu's method via OpenCV (better for uneven lighting)
try:
import cv2
img_array = np.array(img)
_, binary = cv2.threshold(
img_array, 0, 255,
cv2.THRESH_BINARY + cv2.THRESH_OTSU
)
return Image.fromarray(binary)
except ImportError:
return apply_threshold(img)
img = preprocess_grayscale('uneven_scan.png')
img_clean = adaptive_threshold(img)
text = pytesseract.image_to_string(img_clean)
print(text[:300])Prétraitement des images : redressement
Les documents numérisés sont souvent légèrement inclinés. Même une inclinaison de 2 degrés réduit considérablement la précision de l'OCR. Le redressement détecte et corrige l'angle de rotation avant de transmettre l'image au moteur OCR.
import numpy as np
from PIL import Image
def deskew(img):
try:
import cv2
img_array = np.array(img)
# Find rotation angle using Hough line transform
edges = cv2.Canny(img_array, 50, 150, apertureSize=3)
lines = cv2.HoughLines(edges, 1, np.pi/180, threshold=100)
if lines is None:
return img # no lines detected, return unchanged
angles = []
for line in lines:
rho, theta = line[0]
angle = np.degrees(theta) - 90
if -45 < angle < 45:
angles.append(angle)
if not angles:
return img
median_angle = np.median(angles)
if abs(median_angle) > 0.5: # only deskew if significant tilt
print(f'Deskewing by {median_angle:.2f} degrees')
return img.rotate(-median_angle, expand=True, fillcolor=255)
return img
except ImportError:
return img # OpenCV not available — skip deskewOptions de langue de Tesseract
Tesseract prend en charge plus de 100 langues. Téléchargez les modules linguistiques avec le gestionnaire de paquets de votre OS. Pour les documents multilingues, indiquez plusieurs langues en les séparant par un +.
import pytesseract
from PIL import Image
# List available languages
import subprocess
result = subprocess.run(['tesseract', '--list-langs'], capture_output=True, text=True)
print('Available languages:')
print(result.stdout)
# Single language
text_en = pytesseract.image_to_string(Image.open('doc.png'), lang='eng')
# Multiple languages (auto-detect best match)
text_multi = pytesseract.image_to_string(
Image.open('doc.png'),
lang='eng+fra+deu' # English + French + German
)
# Tesseract config options for better accuracy
custom_config = r'--oem 3 --psm 6' # OEM 3=LSTM, PSM 6=assume uniform block of text
text_tuned = pytesseract.image_to_string(
Image.open('doc.png'),
config=custom_config
)EasyOCR : fondé sur l'apprentissage profond
EasyOCR utilise des modèles d'apprentissage profond et dépasse Tesseract sur les images dégradées, le texte incurvé et les écritures non latines. Il ne nécessite aucune installation au niveau de l'OS.
Installez-le avec pip install easyocr. La première exécution télécharge les poids des modèles (environ 200 Mo).
import easyocr
# Initialize reader (downloads model on first run)
reader = easyocr.Reader(
['en', 'tr'], # list of languages
gpu=False # set True if CUDA available
)
# Read text from image
results = reader.readtext('scanned_page.png')
for (bbox, text, confidence) in results:
print(f'Text: {text!r:30} Confidence: {confidence:.2f}')
# bbox = [[x1,y1],[x2,y2],[x3,y3],[x4,y4]] (four corners)
# Get plain text only
text_only = ' '.join(result[1] for result in results)
print('Full text:', text_only[:300])EasyOCR pour les documents multilingues
EasyOCR gère bien les documents mêlant plusieurs langues, ce qui est utile pour les contrats internationaux, les articles de recherche dont les légendes sont rédigées dans plusieurs langues ou les documents contenant des termes techniques dans une autre écriture.
import easyocr
# For Arabic-English mixed document
reader_ar = easyocr.Reader(['ar', 'en'], gpu=False)
results = reader_ar.readtext('arabic_contract.png')
# For CJK languages
reader_cjk = easyocr.Reader(['ch_sim', 'en'], gpu=False) # Simplified Chinese + English
results_cjk = reader_cjk.readtext('chinese_report.png')
# Filter by confidence threshold
HIGH_CONFIDENCE = 0.7
def filter_confident_results(results, threshold=HIGH_CONFIDENCE):
return [
(bbox, text, conf)
for bbox, text, conf in results
if conf >= threshold
]Chaîne complète de prétraitement
Enchaînez toutes les étapes de prétraitement : niveaux de gris, seuillage et redressement, dans une seule fonction de traitement. Exécutez l'OCR sur l'image nettoyée et renvoyez à la fois le texte et les métriques de confiance.
import pytesseract
from PIL import Image
def ocr_pipeline(image_path, lang='eng', engine='tesseract'):
print(f'Processing: {image_path}')
# 1. Load
img = Image.open(image_path)
# 2. Preprocess
img = img.convert('L') # grayscale
img = adaptive_threshold(img) # binarize
img = deskew(img) # correct rotation
# 3. OCR
if engine == 'easyocr':
reader = easyocr.Reader([lang], gpu=False)
results = reader.readtext(image_path)
text = ' '.join(r[1] for r in results if r[2] > 0.5)
else:
config = f'--oem 3 --psm 6 -l {lang}'
text = pytesseract.image_to_string(img, config=config)
# 4. Clean
text = '\n'.join(
line.strip() for line in text.splitlines()
if line.strip()
)
return text
text = ocr_pipeline('invoice_scan.jpg')
print(text[:500])Gestion des PDF constitués d'images
Certains PDF contiennent des pages numérisées stockées sous forme d'images dans le conteneur PDF. Détectez ces PDF constitués d'images et appliquez l'OCR page par page, en utilisant PyMuPDF pour extraire d'abord les images.
import fitz
from PIL import Image
import io
import pytesseract
def is_image_pdf(doc):
# Check if first page has very little extractable text
text = doc[0].get_text().strip()
return len(text) < 50
def ocr_pdf(filepath):
doc = fitz.open(filepath)
if not is_image_pdf(doc):
# Native text — no OCR needed
return '\n'.join(doc[i].get_text() for i in range(len(doc)))
print('Image PDF detected — running OCR')
all_text = []
for page_num in range(len(doc)):
page = doc[page_num]
# Render page as image at 300 DPI
mat = fitz.Matrix(300/72, 300/72) # scale to 300 DPI
pix = page.get_pixmap(matrix=mat)
img = Image.open(io.BytesIO(pix.tobytes('png')))
text = pytesseract.image_to_string(img)
all_text.append(f'--- Page {page_num+1} ---\n{text}')
doc.close()
return '\n'.join(all_text)Filtrage par niveau de confiance et post-traitement
Les résultats de l'OCR contiennent des erreurs, en particulier sur les images dégradées. Traitez ensuite le texte en filtrant les mots dont le niveau de confiance est faible, en corrigeant les erreurs courantes de l'OCR (0 au lieu de O, 1 au lieu de l) et en normalisant les espaces.
import re
COMMON_OCR_ERRORS = {
r'\b0([a-z])\b': r'O\1',
r'\bl([0-9])\b': r'1\1',
r'\|': 'I',
r' +': ' ',
}
def post_process_ocr(text):
for pattern, replacement in COMMON_OCR_ERRORS.items():
text = re.sub(pattern, replacement, text)
lines = [line.strip() for line in text.splitlines()]
return '\n'.join(line for line in lines if line)
def high_confidence_ocr(words_with_conf, min_confidence=60):
words = [w for w, conf in words_with_conf if w.strip() and conf >= min_confidence]
return post_process_ocr(' '.join(words))
fake_ocr_output = [('0range', 90), ('|s', 40), ('l5', 85), ('good', 95)]
print(high_confidence_ocr(fake_ocr_output))Vérification des connaissances
À quoi sert l'application d'un seuil (binarisation) à une image avant l'OCR ?
Récapitulatif : OCR pour les documents numérisés
L'OCR convertit les images numérisées en texte lisible par une machine. pytesseract encapsule Google Tesseract : il est rapide, mature et propose plus de 100 modules linguistiques. EasyOCR utilise l'apprentissage profond et gère mieux les images dégradées et le texte multilingue.
Effectuez toujours un prétraitement : convertissez l'image en niveaux de gris, appliquez le seuillage d'Otsu pour la binarisation et redressez-la pour corriger la rotation. Pour les PDF constitués d'images, rendez les pages sous forme d'images à DPI élevé avec PyMuPDF, puis exécutez l'OCR. Filtrez les résultats selon un seuil de confiance afin d'exclure le bruit.
Questions Fréquemment Posées
La leçon « OCR pour les documents numérisés » est-elle gratuite ?
Oui — le texte complet de « OCR pour les documents numérisés » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Agents, passe à CoddyKit PRO. Le cours AI Agents comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « OCR pour les documents numérisés » ?
Tesseract via pytesseract, prétraitement des images et amélioration de la précision. Tu pratiques AI Agents avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer AI Agents ?
Aucune expérience préalable n'est requise. AI Agents sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « OCR pour les documents numérisés » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon AI Agents ?
Oui. Chaque leçon AI Agents inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Analyser des PDF avec PyMuPDF et pdfplumber
- OCR pour les documents numérisés
- Agents de questions-réponses sur plusieurs documents
- Classification et routage des documents