Spaces:
Sleeping
Sleeping
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>") |