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