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 è:
- su una singola riga, con spaziatura regolare;
- ad alto contrasto, con lettere scure su sfondo chiaro;
- privo di distorsioni forti, caratteri sovrapposti e linee che li attraversano.
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
- Rumore e linee. Rimuovi le linee con operazioni morfologiche, oppure accetta un tasso di successo più basso.
- Rotazione. Stima l'angolo e ruota l'immagine prima di leggerla.
- Lettere che si toccano. Dividere i caratteri per colonna e leggere ciascuno separatamente spesso funziona meglio che leggere l'intera riga.
- Cambiamenti nel tempo. Un sito può cambiare stile senza preavviso, e la precisione può crollare in una notte. Conserva l'insieme etichettato e rieseguilo regolarmente.
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:
- Controlla la dimensione dell'input. I captcha molto piccoli spesso si leggono meglio dopo un ingrandimento di 3x.
- Converti in scala di grigi e allarga il contrasto in modo che le lettere risaltino.
- Applica una soglia, e prova alcuni valori prima di sceglierne uno.
- Rimuovi il rumore a puntini con un filtro mediano, poi applica di nuovo la soglia se serve.
- Ritaglia l'immagine sull'area del testo, così lo sfondo non confonde il motore.
- Limita l'insieme di caratteri a quello usato dal captcha.
- 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
- Leggere testo da documenti scansionati, screenshot o immagini di test di tua proprietà.
- Strumenti di accessibilità che descrivono o leggono un captcha, così un utente con disabilità visiva può usare un percorso alternativo fornito dal sito.
- Testare il tuo design di captcha per vedere quanto sia facile per gli strumenti automatici leggerlo, così puoi renderlo più robusto.
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.