Tesseract OCR in Python
mit pytesseract.
Eine komplette, getestete Anleitung zu pytesseract: Installation, Kern-API, Bildvorverarbeitung, PDFs, Konfidenzwerte, PSM/OEM-Konfiguration, Performance und die häufigsten Fehler.
Schnellstart (drei Zeilen)
Installieren Sie zuerst die Engine und führen Sie dies aus. Die vollständige Einrichtung folgt unten.
import pytesseract
from PIL import Image
text = pytesseract.image_to_string(Image.open("image.png"))
print(text)pytesseract installieren
pytesseract ist nur ein Wrapper — es ruft das Tesseract-Binary auf, also muss die Engine zuerst installiert sein.
pip install pytesseract pillow
# optional, für Vorverarbeitung:
pip install opencv-python numpy
# optional, für PDF-Eingabe:
pip install pdf2imageWenn die Engine nicht im PATH liegt (unter Windows üblich), verweisen Sie explizit darauf:
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"Neu bei der Engine? Siehe die Installationsanleitung für Windows, macOS, Linux, Docker und WSL.
Kern-API
pytesseract bietet eine Funktion pro Ausgabetyp. Wählen Sie die passende.
| Funktion | Liefert | Verwenden, wenn |
|---|---|---|
image_to_string | Reiner Text | Sie nur den erkannten Text brauchen |
image_to_data | Boxen + Konfidenz pro Wort | Text hervorheben, unsichere Wörter filtern |
image_to_boxes | Boxen pro Zeichen | Geometrie auf Zeichenebene |
image_to_pdf_or_hocr | Durchsuchbares PDF oder hOCR | Durchsuchbare PDFs oder Web-Overlays |
image_to_osd | Ausrichtungs- und Schrifterkennung | Rotation oder Schrift vor dem OCR erkennen |
image_to_alto_xml | ALTO XML | Archiv- / Bibliotheks-Pipelines |
Konfiguration: PSM, OEM, Sprachen und Whitelist
Übergeben Sie Optionen als leerzeichengetrennte Zeichenkette an config=.
# Ein Textblock, LSTM-Engine, Deutsch
text = pytesseract.image_to_string(img, lang="deu", config="--oem 3 --psm 6")
# Nur Ziffern (Belegsummen, Zählerstände)
text = pytesseract.image_to_string(img, config="--psm 7 -c tessedit_char_whitelist=0123456789.")
# Kombinierte Sprachen
text = pytesseract.image_to_string(img, lang="eng+deu")| PSM | Modus | Ideal für |
|---|---|---|
| 3 | Vollautomatisch (Standard) | Standarddokumente |
| 4 | Eine Spalte mit variablen Größen | Artikel, einspaltige Seiten |
| 6 | Ein gleichmäßiger Textblock | Absätze, Etiketten |
| 7 | Eine einzelne Textzeile | Einzeilige Überschriften, einzelne Felder |
| 8 | Ein einzelnes Wort | Einzelne Wörter |
| 11 | Sparse-Text | Belege, verstreuter UI-Text |
| 13 | Rohzeile | Eine Zeile ohne Tesseract-Tricks |
OEM-Modi: --oem 1 (nur LSTM, Standard in v5), --oem 0 (Legacy), --oem 3 (automatisch). Vollständige Referenz in der Dokumentation.
Bildvorverarbeitung
Saubere Eingaben sind der größte Genauigkeitsfaktor. Diese Schritte zählen am meisten.
import cv2, numpy as np, pytesseract
from PIL import Image
image = cv2.imread("beleg.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Kleinen Text auf ~300 DPI skalieren
gray = cv2.resize(gray, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
# Rauschen entfernen, dann Otsu-Schwellenwert auf Schwarz/Weiß
blur = cv2.GaussianBlur(gray, (5, 5), 0)
_, binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
text = pytesseract.image_to_string(Image.fromarray(binary))- Graustufen — Farbkanäle vor dem Schwellenwert entfernen.
- Skalieren — Text unter ~20 px wird schlecht erkannt; hochskalieren.
- Schwellenwert — Otsu bei gleichmäßigem Licht, adaptiv bei ungleichmäßigem.
- Entrauschen — leichte Weichzeichnung entfernt Störpunkte, die als Satzzeichen gelesen werden.
- Entzerren — Rotation mit
cv2.minAreaRectvor dem OCR korrigieren. - Ränder entfernen — dunkle Scanränder zuschneiden.
Positionen und Konfidenzwerte
Nutzen Sie image_to_data für Boxen pro Wort und einen Konfidenzwert von 0–100 und filtern Sie Rauschen.
from pytesseract import Output
data = pytesseract.image_to_data(img, output_type=Output.DICT)
for text, conf in zip(data["text"], data["conf"]):
if text.strip() and float(conf) > 60: # unsicheres Rauschen verwerfen
print(round(float(conf)), text)PDF in Python per OCR verarbeiten
Tesseract arbeitet mit Bildern, also rasterisieren Sie die PDF-Seiten zuerst mit pdf2image (benötigt poppler).
import io, pytesseract
from pdf2image import convert_from_path
from pypdf import PdfWriter, PdfReader
pages = convert_from_path("scan.pdf", dpi=300) # benötigt poppler
writer = PdfWriter()
for page in pages:
pdf_bytes = pytesseract.image_to_pdf_or_hocr(page, extension="pdf")
writer.add_page(PdfReader(io.BytesIO(pdf_bytes)).pages[0])
with open("scan_durchsuchbar.pdf", "wb") as f:
writer.write(f)Unter Windows übergeben Sie den poppler-bin-Ordner mit poppler_path=. Für einen tieferen Workflow siehe die Dokumentation zu Ausgabeformaten.
Performance
pytesseract ruft die CLI bei jedem Aufruf auf, daher hängt der Durchsatz von der Struktur ab.
| Ansatz | Wann | Kompromiss |
|---|---|---|
pytesseract pro Aufruf | Skripte und Einzelaufgaben | Startet pro Aufruf einen Prozess — langsam in Schleifen |
| Bündeln in mehrseitiges TIFF | Viele Seiten, gleiche Einstellungen | Ein Prozess für viele Seiten |
multiprocessing | Viele unabhängige Bilder | Nutzt alle Kerne; mehr Speicher |
tesserocr | Hohes Volumen, im Prozess | Natives Binding, mehr Einrichtung |
Fehlerkatalog
Diese Fehler decken die meisten pytesseract-Probleme ab.
| Fehler | Ursache | Lösung |
|---|---|---|
TesseractNotFoundError | Binary nicht installiert oder nicht im PATH | Engine installieren oder pytesseract.pytesseract.tesseract_cmd setzen. |
(-215:Assertion failed) src.type() == CV_8UC1 | Schwellenwert auf 3-Kanal-Bild | Zuerst mit cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) konvertieren. |
Error opening data file ...fra.traineddata | Sprachpaket fehlt | Sprache installieren oder TESSDATA_PREFIX setzen. |
| Leere Ausgabe | Niedrige DPI, falscher PSM oder kein Text | Skalieren, --psm 6/7/11 testen, vorverarbeiten. |
| Sehr langsam in Schleife | Ein Prozess pro Aufruf | Bündeln, multiprocessing oder tesserocr nutzen. |
Genauigkeit messen
Messen Sie Zeichen- und Wortfehlerraten statt die Ausgabe nach Augenmaß zu beurteilen.
import pytesseract, jiwer
from PIL import Image
hypothesis = pytesseract.image_to_string(Image.open("beispiel.png"))
reference = open("beispiel.gt.txt").read()
print("CER:", jiwer.cer(reference, hypothesis))
print("WER:", jiwer.wer(reference, hypothesis))Halten Sie einen kleinen Satz repräsentativer Bilder mit Referenztext als Regressionstests und führen Sie sie erneut aus, wenn Sie Vorverarbeitung oder Konfiguration ändern.
Python-FAQ
Wie nutze ich Tesseract OCR in Python?
Installieren Sie zuerst die Engine, dann pip install pytesseract pillow. Öffnen Sie das Bild mit Pillow und rufen Sie pytesseract.image_to_string(img) auf.
Warum erhalte ich TesseractNotFoundError?
pytesseract findet das Binary nicht. Installieren Sie die Engine, legen Sie sie in den PATH oder setzen Sie pytesseract.pytesseract.tesseract_cmd auf den vollständigen Pfad.
Wie verbessere ich die Genauigkeit?
Auf ~300 DPI skalieren, Graustufen, Schwellenwert, Entrauschen, Entzerren und der richtige --psm. Nutzen Sie das passende lang= und für feste Felder eine Zeichen-Whitelist.
Wie OCR-e ich ein PDF?
Nutzen Sie pdf2image (mit poppler), um Seiten in Bilder umzuwandeln, führen Sie pytesseract pro Seite aus und kombinieren Sie mit image_to_pdf_or_hocr(..., extension="pdf").
Wie erhalte ich Konfidenzwerte?
Nutzen Sie image_to_data(..., output_type=Output.DICT) und filtern Sie die conf-Liste.
Ist pytesseract langsam?
Jeder Aufruf startet einen Prozess. Bündeln Sie, nutzen Sie multiprocessing oder wechseln Sie zum In-Process-Binding tesserocr.
Nächste Schritte
Gehen Sie tiefer in Engine und Ökosystem.