0Pricing
AI Agents · Lektion

OCR für gescannte Dokumente

Tesseract über pytesseract, Bildvorverarbeitung und Verbesserung der Genauigkeit.

OCR für gescannte Dokumente ist eine kostenlose AI Agents-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Agents-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.

Wann OCR erforderlich ist

Nicht alle Dokumente sind digital erstellte PDFs. Gescannte Dokumente, Textfotografien, handschriftliche Notizen und bildbasierte PDFs erfordern Optical Character Recognition (OCR), um Text zu extrahieren.

OCR wandelt Pixelbilder von Text in maschinenlesbare Zeichen um. Zwei führende Python-Bibliotheken sind pytesseract (Google Tesseract) und EasyOCR (Deep Learning, mehrsprachig).

Grundlagen von pytesseract

pytesseract ist ein Python-Wrapper für Googles Tesseract-OCR-Engine. Installieren Sie zuerst Tesseract auf Betriebssystemebene und anschließend pip install pytesseract Pillow.

import pytesseract
from PIL import Image

# Simple text extraction
image = Image.open('scanned_document.png')
text = pytesseract.image_to_string(image)
print(text)

# Specify language (default: English)
text_fr = pytesseract.image_to_string(
    Image.open('french_doc.png'),
    lang='fra'
)

# Get detailed output with bounding boxes
data = pytesseract.image_to_data(
    image,
    output_type=pytesseract.Output.DICT
)
for i, word in enumerate(data['text']):
    if word.strip():
        conf = data['conf'][i]
        print(f'Word: {word!r:20} Confidence: {conf}')

Bildvorverarbeitung: Graustufen

Die OCR-Genauigkeit hängt stark von der Bildqualität ab. Der erste Schritt der Vorverarbeitung ist die Umwandlung in Graustufen — Farbe erzeugt zusätzliches Rauschen, ohne die Zeichenerkennung zu verbessern.

Verwenden Sie Pillow oder OpenCV für die Vorverarbeitung. Graustufen reduzieren das Rauschen und verbessern die Erkennung von Zeichengrenzen durch Tesseract.

from PIL import Image, ImageOps
import numpy as np

def preprocess_grayscale(image_path):
    img = Image.open(image_path)

    # Convert to grayscale
    img = img.convert('L')  # 'L' = 8-bit grayscale

    # Optionally resize for better OCR (Tesseract works best at ~300 DPI)
    # Scale up small images
    width, height = img.size
    if width < 800:
        scale = 800 / width
        new_size = (int(width * scale), int(height * scale))
        img = img.resize(new_size, Image.LANCZOS)

    return img

img = preprocess_grayscale('scan.jpg')
text = pytesseract.image_to_string(img)
print(text[:300])

Bildvorverarbeitung: Schwellwertverfahren

Beim Schwellwertverfahren wird ein Graustufenbild in reines Schwarz-Weiß umgewandelt. Dadurch werden graue Schatten, ungleichmäßige Beleuchtung und Hintergrundrauschen entfernt, sodass der Text für die OCR deutlich hervortritt.

from PIL import Image, ImageFilter
import numpy as np

def apply_threshold(img):
    # Method 1: Simple fixed threshold
    img_array = np.array(img)
    threshold = 128
    binary = np.where(img_array > threshold, 255, 0).astype(np.uint8)
    return Image.fromarray(binary)

def adaptive_threshold(img):
    # Method 2: Otsu's method via OpenCV (better for uneven lighting)
    try:
        import cv2
        img_array = np.array(img)
        _, binary = cv2.threshold(
            img_array, 0, 255,
            cv2.THRESH_BINARY + cv2.THRESH_OTSU
        )
        return Image.fromarray(binary)
    except ImportError:
        return apply_threshold(img)

img = preprocess_grayscale('uneven_scan.png')
img_clean = adaptive_threshold(img)
text = pytesseract.image_to_string(img_clean)
print(text[:300])

Bildvorverarbeitung: Schräglagenkorrektur

Gescannte Dokumente sind häufig leicht gedreht. Bereits eine Neigung von 2 Grad verringert die OCR-Genauigkeit erheblich. Bei der Schräglagenkorrektur wird der Drehwinkel erkannt und korrigiert, bevor das Bild an die OCR-Engine übergeben wird.

import numpy as np
from PIL import Image

def deskew(img):
    try:
        import cv2
        img_array = np.array(img)

        # Find rotation angle using Hough line transform
        edges = cv2.Canny(img_array, 50, 150, apertureSize=3)
        lines = cv2.HoughLines(edges, 1, np.pi/180, threshold=100)

        if lines is None:
            return img  # no lines detected, return unchanged

        angles = []
        for line in lines:
            rho, theta = line[0]
            angle = np.degrees(theta) - 90
            if -45 < angle < 45:
                angles.append(angle)

        if not angles:
            return img

        median_angle = np.median(angles)
        if abs(median_angle) > 0.5:  # only deskew if significant tilt
            print(f'Deskewing by {median_angle:.2f} degrees')
            return img.rotate(-median_angle, expand=True, fillcolor=255)
        return img
    except ImportError:
        return img  # OpenCV not available — skip deskew

Sprachoptionen von Tesseract

Tesseract unterstützt mehr als 100 Sprachen. Laden Sie Sprachpakete mit dem Paketmanager Ihres Betriebssystems herunter. Geben Sie bei mehrsprachigen Dokumenten mehrere Sprachen an und trennen Sie sie mit einem +.

import pytesseract
from PIL import Image

# List available languages
import subprocess
result = subprocess.run(['tesseract', '--list-langs'], capture_output=True, text=True)
print('Available languages:')
print(result.stdout)

# Single language
text_en = pytesseract.image_to_string(Image.open('doc.png'), lang='eng')

# Multiple languages (auto-detect best match)
text_multi = pytesseract.image_to_string(
    Image.open('doc.png'),
    lang='eng+fra+deu'  # English + French + German
)

# Tesseract config options for better accuracy
custom_config = r'--oem 3 --psm 6'  # OEM 3=LSTM, PSM 6=assume uniform block of text
text_tuned = pytesseract.image_to_string(
    Image.open('doc.png'),
    config=custom_config
)

EasyOCR: Deep-Learning-basiert

EasyOCR verwendet Deep-Learning-Modelle und erzielt bei beeinträchtigten Bildern, gebogenem Text und nichtlateinischen Schriften bessere Ergebnisse als Tesseract. Eine Installation auf Betriebssystemebene ist nicht erforderlich.

Installieren Sie die Bibliothek mit pip install easyocr. Beim ersten Start werden die Modellgewichte (etwa 200 MB) heruntergeladen.

import easyocr

# Initialize reader (downloads model on first run)
reader = easyocr.Reader(
    ['en', 'tr'],  # list of languages
    gpu=False       # set True if CUDA available
)

# Read text from image
results = reader.readtext('scanned_page.png')

for (bbox, text, confidence) in results:
    print(f'Text: {text!r:30} Confidence: {confidence:.2f}')
    # bbox = [[x1,y1],[x2,y2],[x3,y3],[x4,y4]] (four corners)

# Get plain text only
text_only = ' '.join(result[1] for result in results)
print('Full text:', text_only[:300])

EasyOCR für mehrsprachige Dokumente

EasyOCR verarbeitet mehrsprachige Dokumente gut — beispielsweise internationale Verträge, wissenschaftliche Arbeiten mit Bildunterschriften in mehreren Sprachen oder Dokumente mit technischen Begriffen in einer anderen Schrift.

import easyocr

# For Arabic-English mixed document
reader_ar = easyocr.Reader(['ar', 'en'], gpu=False)
results = reader_ar.readtext('arabic_contract.png')

# For CJK languages
reader_cjk = easyocr.Reader(['ch_sim', 'en'], gpu=False)  # Simplified Chinese + English
results_cjk = reader_cjk.readtext('chinese_report.png')

# Filter by confidence threshold
HIGH_CONFIDENCE = 0.7
def filter_confident_results(results, threshold=HIGH_CONFIDENCE):
    return [
        (bbox, text, conf)
        for bbox, text, conf in results
        if conf >= threshold
    ]

Vollständige Vorverarbeitungspipeline

Führen Sie alle Vorverarbeitungsschritte — Graustufen, Schwellwertverfahren und Schräglagenkorrektur — in einer einzigen Pipeline-Funktion zusammen. Führen Sie die OCR am bereinigten Bild aus und geben Sie sowohl den Text als auch die Konfidenzmetriken zurück.

import pytesseract
from PIL import Image

def ocr_pipeline(image_path, lang='eng', engine='tesseract'):
    print(f'Processing: {image_path}')

    # 1. Load
    img = Image.open(image_path)

    # 2. Preprocess
    img = img.convert('L')         # grayscale
    img = adaptive_threshold(img)  # binarize
    img = deskew(img)              # correct rotation

    # 3. OCR
    if engine == 'easyocr':
        reader = easyocr.Reader([lang], gpu=False)
        results = reader.readtext(image_path)
        text = ' '.join(r[1] for r in results if r[2] > 0.5)
    else:
        config = f'--oem 3 --psm 6 -l {lang}'
        text = pytesseract.image_to_string(img, config=config)

    # 4. Clean
    text = '\n'.join(
        line.strip() for line in text.splitlines()
        if line.strip()
    )
    return text

text = ocr_pipeline('invoice_scan.jpg')
print(text[:500])

Bildbasierte PDFs verarbeiten

Einige PDFs enthalten gescannte Seiten, die als Bilder im PDF-Container gespeichert sind. Erkennen Sie diese „Bild-PDFs“ und wenden Sie die OCR seitenweise an, indem Sie zunächst mit PyMuPDF die Bilder extrahieren.

import fitz
from PIL import Image
import io
import pytesseract

def is_image_pdf(doc):
    # Check if first page has very little extractable text
    text = doc[0].get_text().strip()
    return len(text) < 50

def ocr_pdf(filepath):
    doc = fitz.open(filepath)
    if not is_image_pdf(doc):
        # Native text — no OCR needed
        return '\n'.join(doc[i].get_text() for i in range(len(doc)))

    print('Image PDF detected — running OCR')
    all_text = []

    for page_num in range(len(doc)):
        page = doc[page_num]
        # Render page as image at 300 DPI
        mat = fitz.Matrix(300/72, 300/72)  # scale to 300 DPI
        pix = page.get_pixmap(matrix=mat)
        img = Image.open(io.BytesIO(pix.tobytes('png')))
        text = pytesseract.image_to_string(img)
        all_text.append(f'--- Page {page_num+1} ---\n{text}')

    doc.close()
    return '\n'.join(all_text)

Konfidenzfilterung und Nachbearbeitung

OCR-Ausgaben enthalten Fehler, insbesondere bei beeinträchtigten Bildern. Bearbeiten Sie den Text nach, indem Sie Wörter mit niedriger Konfidenz herausfiltern, häufige OCR-Fehler korrigieren (0 statt O, 1 statt l) und Leerzeichen vereinheitlichen.

import re

COMMON_OCR_ERRORS = {
    r'\b0([a-z])\b': r'O\1',
    r'\bl([0-9])\b': r'1\1',
    r'\|': 'I',
    r'  +': ' ',
}

def post_process_ocr(text):
    for pattern, replacement in COMMON_OCR_ERRORS.items():
        text = re.sub(pattern, replacement, text)
    lines = [line.strip() for line in text.splitlines()]
    return '\n'.join(line for line in lines if line)

def high_confidence_ocr(words_with_conf, min_confidence=60):
    words = [w for w, conf in words_with_conf if w.strip() and conf >= min_confidence]
    return post_process_ocr(' '.join(words))

fake_ocr_output = [('0range', 90), ('|s', 40), ('l5', 85), ('good', 95)]
print(high_confidence_ocr(fake_ocr_output))

Wissensüberprüfung

Welchen Zweck hat die Anwendung eines Schwellwerts (Binarisierung) auf ein Bild vor der OCR?

Zusammenfassung: OCR für gescannte Dokumente

OCR wandelt gescannte Bilder in maschinenlesbaren Text um. pytesseract kapselt Google Tesseract — eine schnelle und ausgereifte Lösung mit mehr als 100 Sprachpaketen. EasyOCR verwendet Deep Learning und verarbeitet beeinträchtigte Bilder und mehrsprachigen Text besser.

Führen Sie immer eine Vorverarbeitung durch: Wandeln Sie das Bild in Graustufen um, wenden Sie die Otsu-Schwellwertmethode zur Binarisierung an und korrigieren Sie die Drehung durch Schräglagenkorrektur. Rendern Sie bei bildbasierten PDFs die Seiten mit PyMuPDF als Bilder mit hoher DPI und führen Sie anschließend die OCR aus. Filtern Sie die Ergebnisse anhand eines Konfidenzschwellwerts, um Rauschen auszuschließen.

Häufig gestellte Fragen

Ist die Lektion „OCR für gescannte Dokumente“ kostenlos?

Ja — der vollständige Text von „OCR für gescannte Dokumente“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Agents-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „OCR für gescannte Dokumente“?

Tesseract über pytesseract, Bildvorverarbeitung und Verbesserung der Genauigkeit. Du übst AI Agents mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um AI Agents zu starten?

Keine Vorkenntnisse erforderlich. AI Agents auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „OCR für gescannte Dokumente“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser AI Agents-Lektion Code schreiben und ausführen?

Ja. Jede AI Agents-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. PDFs mit PyMuPDF und pdfplumber parsen
  2. OCR für gescannte Dokumente
  3. Q&A-Agenten für mehrere Dokumente
  4. Dokumente klassifizieren und weiterleiten
← Zurück zu AI Agents