Scarnox · Blog

OCR per captcha di testo e immagini: come leggere i captcha distorti

Un captcha di immagine mostra una breve stringa di lettere o cifre come figura, a volte con rumore, rotazione e linee ondulate. Il riconoscimento ottico dei caratteri (OCR) può leggere versioni semplici di questi captcha con un motore open source come Tesseract. La precisione dipende da quanto è pulita l'immagine, quindi gran parte del lavoro è la pre-elaborazione. Questa guida mostra una configurazione Python funzionante, spiega dove fallisce e chiarisce un punto: l'API attiva di Scarnox risolve token di widget PopularCaptcha, non captcha da immagine a testo. Pianifica l'OCR come codice tuo, non come una chiamata API.

Quando l'OCR funziona e quando no

L'OCR è un primo tentativo ragionevole quando il testo è:

Fatica con lettere ruotate, lettere che si toccano, texture di sfondo e linee tracciate sopra i glifi. Ognuno di questi richiede un passaggio di pre-elaborazione specifico, e alcuni richiedono un modello diverso. Preparati a misurare la precisione invece di darla per scontata.

Installa gli strumenti

Ti servono Python, il binario Tesseract e due pacchetti Python:

pip install pillow pytesseract

Tesseract è un'installazione separata. Su Windows, usa l'installer del progetto Tesseract e assicurati che l'eseguibile sia nel PATH, oppure punta pytesseract.pytesseract.tesseract_cmd ad esso.

Pre-elabora, poi leggi

Gran parte della precisione deriva da un input pulito. La sequenza qui sotto converte in scala di grigi, aumenta il contrasto, applica una soglia netta, ingrandisce l'immagine e limita l'output ai caratteri che il captcha usa:

from PIL import Image, ImageOps
import pytesseract

# Caratteri che il captcha può usare. Escludi quelli simili, come 0/O e 1/I, se il
# captcha non li usa mai.
ALLOWED = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"

def read_text(path: str) -> str:
    img = Image.open(path)
    gray = ImageOps.grayscale(img)
    gray = ImageOps.autocontrast(gray)
    # Soglia netta: i pixel più chiari di 140 diventano bianchi, gli altri neri.
    bw = gray.point(lambda p: 255 if p > 140 else 0)
    # Tesseract funziona meglio con caratteri più grandi.
    bw = bw.resize((bw.width * 3, bw.height * 3))
    config = f"--psm 7 -c tessedit_char_whitelist={ALLOWED}"  # psm 7: una sola riga di testo
    return pytesseract.image_to_string(bw, config=config).strip()

if __name__ == "__main__":
    print(read_text("sample_captcha.png"))

Il valore di soglia 140 è un punto di partenza. Stampa l'immagine elaborata, confrontala con l'originale e regola finché le lettere sono piene e lo sfondo è pulito.

Misura la precisione prima di fidarti

Una lettura corretta su una singola immagine non dimostra nulla. Salva un insieme di captcha con risposte note, esegui la funzione su tutti e conta le corrispondenze:

def accuracy(samples: dict[str, str]) -> float:
    # samples associa un percorso di file al testo corretto
    hits = sum(read_text(path) == truth for path, truth in samples.items())
    return hits / len(samples)

labelled = {
    "samples/0001.png": "K7PQ2",
    "samples/0002.png": "M3XN9",
}
print(f"accuracy: {accuracy(labelled):.0%}")

Tieni sotto controllo questo numero ogni volta che cambi la pre-elaborazione. Se il valore resta basso dopo diverse modifiche, probabilmente l'OCR è lo strumento sbagliato per quello stile di captcha, e conviene valutare un approccio diverso.

Dove si rompe

Una lista di controllo per la pre-elaborazione

Quando una lettura fallisce, segui questi passaggi in ordine. Cambia una cosa alla volta, così vedi quale passaggio ha aiutato:

  1. Controlla la dimensione dell'input. I captcha molto piccoli spesso si leggono meglio dopo un ingrandimento di 3x.
  2. Converti in scala di grigi e allarga il contrasto in modo che le lettere risaltino.
  3. Applica una soglia, e prova alcuni valori prima di sceglierne uno.
  4. Rimuovi il rumore a puntini con un filtro mediano, poi applica di nuovo la soglia se serve.
  5. Ritaglia l'immagine sull'area del testo, così lo sfondo non confonde il motore.
  6. Limita l'insieme di caratteri a quello usato dal captcha.
  7. Prova una modalità di segmentazione della pagina diversa se il testo è sparso o disposto su più righe.

Conserva l'ordine e le impostazioni nel controllo di versione, accanto ai campioni etichettati. Una pipeline di pre-elaborazione è codice, e va revisionata come il codice.

OCR o un modello che esegui tu

L'OCR classico è veloce e gira su un portatile, ma è fragile quando un captcha cambia stile. I modelli di immagine addestrati su un tuo insieme etichettato possono gestire più variazioni, al costo di raccogliere dati ed eseguire l'inferenza. Entrambi sono una tua responsabilità da costruire e mantenere. Nessuno dei due è oggi un endpoint Scarnox ospitato, quindi pianifica l'infrastruttura prima di sceglierne uno.

Cosa fa e cosa non fa Scarnox qui

L'API attiva di Scarnox risolve token di widget PopularCaptcha. La richiesta è POST https://api.scarnox.com/api/tasks/create con un tipo di attività PopularCaptcha, una sitekey e un URL di pagina, e la risposta è un token per il campo del modulo. È un lavoro diverso dalla lettura del testo in un'immagine, e Scarnox non offre oggi un endpoint da immagine a testo. Se il tuo problema è un captcha di immagine, usa l'OCR o un modello che esegui tu, e consulta le altre guide per sapere cosa copre Scarnox. Puoi creare un account e iniziare con il credito di prova gratuito, senza carta, per i flussi PopularCaptcha che supporta. Le tariffe attuali sono nella pagina dei prezzi.

Usi legittimi

Non usare l'OCR per superare un captcha su un sito che non consente l'accesso automatizzato. I captcha di immagine esistono proprio per rallentare quel tipo di accesso.

Passi successivi