Spaces:
Sleeping
Sleeping
File size: 4,018 Bytes
547e622 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
import os
import sys
import pytesseract
import cv2
import numpy as np
from PIL import Image
import json
import logging
import tempfile
# Configuration du logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
# Chemin vers Tesseract (à ajuster selon l'environnement)
if sys.platform.startswith('win'):
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
# Répertoire temporaire
TEMP_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "temp")
if not os.path.exists(TEMP_DIR):
os.makedirs(TEMP_DIR)
def preprocess_image(image_path):
"""Prétraitement de l'image pour améliorer la reconnaissance OCR"""
try:
# Lire l'image avec OpenCV
img = cv2.imread(image_path)
if img is None:
logger.error(f"Impossible de lire l'image: {image_path}")
return None
# Convertir en niveaux de gris
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Appliquer un filtre bilatéral pour réduire le bruit tout en préservant les bords
blur = cv2.bilateralFilter(gray, 9, 75, 75)
# Normaliser la luminosité et le contraste
normalized = cv2.normalize(blur, None, 0, 255, cv2.NORM_MINMAX)
# Seuillage adaptatif pour améliorer le contraste entre le texte et l'arrière-plan
thresh = cv2.adaptiveThreshold(normalized, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2)
# Enregistrer l'image prétraitée
processed_image_path = os.path.join(TEMP_DIR, f"processed_{os.path.basename(image_path)}")
cv2.imwrite(processed_image_path, thresh)
return processed_image_path
except Exception as e:
logger.error(f"Erreur lors du prétraitement de l'image: {str(e)}")
return None
def perform_ocr(image_path, lang='fra'):
"""Extraire le texte d'une image en utilisant Tesseract OCR"""
try:
# Prétraiter l'image
processed_image_path = preprocess_image(image_path)
if not processed_image_path:
processed_image_path = image_path # Utiliser l'image originale si le prétraitement échoue
# Configuration OCR
custom_config = r'--oem 3 --psm 6'
# Effectuer l'OCR
text = pytesseract.image_to_string(Image.open(processed_image_path), lang=lang, config=custom_config)
# Nettoyer le texte
text = text.strip()
# Supprimer l'image prétraitée si elle existe
if processed_image_path != image_path and os.path.exists(processed_image_path):
os.remove(processed_image_path)
return text
except Exception as e:
logger.error(f"Erreur OCR: {str(e)}")
return None
def process_image(image_path, lang='fra'):
"""Traiter une image et extraire son texte"""
try:
# Extraire le texte
extracted_text = perform_ocr(image_path, lang)
if not extracted_text:
return {"error": "Aucun texte n'a pu être extrait de l'image"}
# Préparer le résultat
result = {
"text": extracted_text,
"confidence": 0.9 # Valeur fictive car Tesseract ne fournit pas de score de confiance simple
}
return result
except Exception as e:
logger.error(f"Erreur lors du traitement de l'image: {str(e)}")
return {"error": str(e)}
# Test direct du module
if __name__ == "__main__":
if len(sys.argv) > 1:
image_path = sys.argv[1]
result = process_image(image_path)
print(json.dumps(result, ensure_ascii=False, indent=2))
else:
print("Usage: python ocr_module.py <chemin_image>") |