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 ")