import cv2 import numpy as np from typing import Optional class DocumentImageProcessor: """ Saját fejlesztésű képtisztító pipeline OCR-hez. A nyers (mobillal fotózott) képekből kontrasztos, fekete-fehér, zajmentes változatot készít, amelyet az AI már közel 100%-os pontossággal tud olvasni. """ @staticmethod def process_for_ocr(image_bytes: bytes) -> Optional[bytes]: try: # 1. Kép betöltése a memóriából (FastAPI UploadFile bytes-ból) # A képet nem mentjük a lemezre, villámgyorsan a RAM-ban dolgozzuk fel. nparr = np.frombuffer(image_bytes, np.uint8) img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) if img is None: raise ValueError("A képet nem sikerült dekódolni.") # 2. Szürkeárnyalatossá alakítás (A színek csak zavarják a szövegfelismerést) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 3. Kép átméretezése (Felskálázás) # Az AI és az OCR motorok a minimum 300 DPI körüli képeket szeretik. height, width = gray.shape if width < 1000 or height < 1000: gray = cv2.resize(gray, None, fx=2.0, fy=2.0, interpolation=cv2.INTER_CUBIC) # 4. Kontraszt növelése (CLAHE - Contrast Limited Adaptive Histogram Equalization) # Ez eltünteti a vaku okozta becsillanásokat és kiemeli a halvány betűket. clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) contrast = clahe.apply(gray) # 5. Enyhe homályosítás (Denoising / Noise Reduction) # Eltünteti a papír textúráját (pl. a forgalmi engedély vízjelét vagy a blokk gyűrődéseit). blur = cv2.GaussianBlur(contrast, (5, 5), 0) # 6. Adaptív Küszöbérték (Binarization) # Minden pixel környezetét külön vizsgálja. Ez küszöböli ki azt, amikor a fotó egyik # sarka sötét (pl. árnyékot vet a telefon), a másik meg világos. thresh = cv2.adaptiveThreshold( blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, # Blokk méret (páratlan szám) 2 # Konstans levonás ) # 7. Visszakódolás bájt formátumba (PNG), hogy átadhassuk az AI-nak success, encoded_image = cv2.imencode('.png', thresh) if not success: raise ValueError("Nem sikerült a feldolgozott képet PNG-be kódolni.") return encoded_image.tobytes() except Exception as e: print(f"Hiba a képfeldolgozás során: {str(e)}") return None