Archivischer Tonwert und Schärfung

TippTonwert in einem Satz

Ein Scan ist kein Foto — er ist ein Schriftträger aus Papier und Tinte; die gesamte Tonwert-Verarbeitung folgt daraus: gemessen wird im Satzspiegel, Papier soll weiß bleiben, Tinte soll tief werden, die Kamera-Optik wird nicht geglättet.

Fotografische Verarbeitungskonventionen sind für Bücher und Archivalien ungeeignet. Ein Belichtungsautomat, der den Mittelwert auf 18-%-Grau legt, würde ein Buchblatt mit mittlerem Weißton auf Grau ziehen. Eine Schärfung, die chromatische Kanten betont, würde Farbränder an schwarzen Buchstaben einführen. Die ArchivalToneEngine verfolgt stattdessen einen dokumentenspezifischen Ansatz: alle Parameter werden aus dem Dokument selbst gemessen und auf Papier-Tinte-Verhältnisse ausgerichtet.

1 Farbraum und GPU-Kontext

Die gesamte Tonwertkette läuft über einen gemeinsamen CIContext (sharedContext), der mit dem linearen sRGB-Farbraum als Arbeitsraum konfiguriert ist. Das ist nicht optional — es ist die Voraussetzung dafür, dass alle nachfolgenden Filter korrekt rechnen.

WarnungDie Gamma-Falle

Wird der CIContext mit .workingColorSpace = sRGB (gamma-kodiertes sRGB) konfiguriert, passiert folgendes: CIToneCurve und CIDocumentEnhancer gehen intern davon aus, lineares Licht zu verarbeiten, und gamma-kodieren ihre Ausgaben entsprechend. Auf einem bereits gamma-kodierten Eingabebild kodieren sie doppelt — ein Tintenanker, der auf 0,04 (fast Schwarz) gesetzt wird, landet tatsächlich bei 0,243. Gemessen: Sollwert 0,04, tatsächlicher Wert 0,243 = Gamma-Fehler Faktor ~6.

Zusätzlich läuft die Flat-Field-Division (CIDivideBlendMode) auf gamma-kodierten Werten statt auf linearem Licht, was die Ausleuchtungskorrektur verfälscht.

Der lineare Arbeitsraum ist die einzige korrekte Einstellung.

Der Kontext gibt sRGB als Ausgabe-Farbraum an (outputColorSpace: CGColorSpace(name: CGColorSpace.sRGB)). Damit gilt: Eingabe und Histogrammauswertung laufen im linearen Raum, die Ausgabe ist gamma-kodiertes sRGB für die Anzeige und Speicherung.

2 Das zentrale Messquadrat

Alle statistischen Messungen — Tintenanker, Papieranker, Medianhelligkiet — werden ausschließlich auf dem zentralen Messquadrat des Bildes durchgeführt. Die Kantenlänge dieses Quadrats beträgt standardmäßig 60 % der kürzeren Bildkante (measureSquare = 0.6).

Diese Einschränkung hat einen wichtigen Grund: Am Rand des Buchbildes können schwarzer Untergrund, Hände des Nutzers, der Kopierständer oder die dunkle Papierverformung am Falz sichtbar sein. Würden diese Pixel in die Helligkeitsmessung eingehen, wäre der gemessene Tintenanker viel zu dunkel (der schwarze Untergrund dominiert das Histogramm), und die Tonwertkurve würde das Papierweiß aufhellen, weil sie einen falschen Dunkelwert kompensiert. Das zentrale Messquadrat schließt den Satzspiegel ein und den Rand aus.

Das berechnete measureRect (normiert, 0–1, Bottom-Left-Ursprung) wird im ToneReport gespeichert.

3 Die fünf Stufen der Verarbeitung

flowchart TD
    Input["Rektifiziertes Seitenbild\n(lineare sRGB GPU-Textur)"] --> FF["1. Flat-Field-Korrektur\nCIDivideBlendMode"]
    FF --> Levels["2. Gemessene Spreizung\nCIToneCurve (Ink + Paper Anker)"]
    Levels --> SCurve["3. Archivische S-Kurve\nCIToneCurve Vertiefung"]
    SCurve --> Enhance["4. CIDocumentEnhancer\nFeinstruktur-Finisher"]
    Enhance --> Sharpen["5. Typographische Schaerfung\nLuminanz-Unsharp + CIColorClamp"]
    Sharpen --> Output["page NNN.jpg\n(sRGB JPEG)"]

3.1 Stufe 1: Flat-Field-Korrektur

Die Flat-Field-Korrektur gleicht inhomogene Ausleuchtung aus — den Helligkeitsgradienten, den Kopierständer-Lampen oder Fensterreflexionen auf der Buchseite erzeugen.

Das Verfahren: Das rektifizierte Bild wird mit einem starken Gauß-Weichzeichner geglättet (Radius ca. 15 % der kürzeren Kante). Dieses geglättete Bild repräsentiert die niederfrequente Ausleuchtungsverteilung — das „Lichtfeld” ohne Textinhalt. Anschließend dividiert CIDivideBlendMode das Originalbild durch dieses Lichtfeld (mit dem Original als backgroundImage und dem Lichtfeld als inputImage, wie es der Filter erwartet). Das Ergebnis ist ein Bild mit weitgehend gleichmäßiger Grundhelligkeit.

HinweisReihenfolge der Operanden in CIDivideBlendMode

CIDivideBlendMode rechnet background ÷ input, nicht umgekehrt. Die Buchseite muss als backgroundImage, das Ausleuchtungsfeld als inputImage eingegeben werden. Vertauscht man die Rollen, erhält man die Kehrwert-Operation — das Bild invertiert sich.

Die Flat-Field-Korrektur ist optional (flatField: Bool). Bei gleichmäßiger Ausleuchtung bringt sie wenig; bei ausgeprägten Gradienten (z. B. einseitig beleuchtete Buchseiten) verhindert sie eine inhomogene Tonwertkurve.

3.2 Stufe 2: Gemessene Spreizung

Das Histogramm des zentralen Messquadrats liefert zwei Ankerpunkte:

  • Tintenanker: 0,5. Perzentil der Helligkeitsverteilung (die dunkelsten 0,5 % der Pixel) → wird auf Zielwert 0,04 (fast Schwarz) gesetzt.
  • Papieranker: 85. Perzentil (die hellsten 15 % der Pixel bilden die Papierregion) → wird auf Zielwert 0,96 (fast Weiß) gesetzt.

Diese Ankerwerte werden als Kontrollpunkte einer CIToneCurve eingesetzt. Die Kurve zieht das gemessene Tinten-Minimum auf 0,04 und das Papiermaximum auf 0,96, während sie dazwischen linear interpoliert. Das Ergebnis ist eine vollständig ausgesteuertes Dokument, das den gesamten Tonwertraum nutzt, ohne Papier auf Grau zu ziehen oder Tinte zu zerrissen.

Ein Schutz gegen blurrige Quellen (blurrySourceGuard): Wenn der gemessene Tinte-Papier-Kontrast sehr klein ist (< 0,15), greift eine abgemilderte Spreizung statt der vollen Streckung. Das verhindert, dass ein wirklich unscharf aufgenommenes Bild durch Überstreckung noch schlechter aussieht. Der ToneReport vermerkt dies als "gentle-stretch" im note-Feld.

3.3 Stufe 3: Archivische S-Kurve

Nach der linearen Spreizung vertieft eine weitere CIToneCurve die Tintentöne im unteren Viertel des Helligkeitsbereichs, ohne das Papierweiß anzutasten. Die Stärke dieser S-Kurve wird durch den contrast-Parameter gesteuert (Standard: 1,35). Ein Wert von 1,0 bedeutet keine Zusatzkurve, höhere Werte vertiefen die Schrift weiter.

3.4 Stufe 4: CIDocumentEnhancer

Der System-Filter CIDocumentEnhancer ist ein lokaler Kontrastverstärker, der für Dokumentscans optimiert ist. Er wird nach der Tonwertnormierung als Feinstruktur-Finisher eingesetzt — nicht als erste Stufe, wie es viele andere Scan-Apps tun. Der Unterschied ist entscheidend: Als Finisher nach der Normierung verbessert er feine Texturdetails (Schriftränder, Tintenstruktur). Als erste Stufe würde er die unkorrekte Ausleuchtung und die unkalibrierte Tonwertspreizung verstärken.

3.5 Stufe 5: Typographische Schärfung und Ringschutz

Die letzte Stufe schärft ausschließlich im Luminanzkanal — nie an Farbrändern. Das verhindert Chroma-Artefakte (bunte Säume an schwarzen Buchstaben). Ein Unsharp-Masking mit kleinem Radius (skaliert auf die Seitenauflösung) verstärkt die feinen Schriftränder. Abschließend klemmt CIColorClamp alle Pixelwerte auf den Bereich [0, 1], um Ringing-Artefakte durch Überschwingen des Sharpening-Filters zu unterdrücken.

4 Das ToneReport-Artefakt

Alle Entscheidungen der Tonwertstufe sind im ToneReport festgehalten:

ToneReport — Tonwert-Protokoll einer Buchseite

{
  "measureRect": {"x": 0.20, "y": 0.20, "width": 0.60, "height": 0.60},
  "inkPoint": 0.042,
  "paperPoint": 0.931,
  "medianLuminance": 0.871,
  "inkTarget": 0.04,
  "paperTarget": 0.96,
  "measured": true,
  "flatFieldApplied": true,
  "enhancerApplied": true,
  "sharpened": true,
  "monochrome": false,
  "note": null,
  "usedPaperMask": true
}

Ein medianLuminance-Wert um 0,87 ist typisch für eine gut beleuchtete Buchseite: Der Großteil der Fläche ist Papier (hohe Helligkeit), Tinte ist ein vergleichsweise kleiner Flächenanteil.

Ein inkPoint-Wert nahe 0,04 (Zielwert) und paperPoint nahe 0,93–0,97 sind Anzeichen für eine gut kalibrierte Aufnahme. Werte außerhalb dieses Bereichs deuten auf schlechte Ausleuchtung, falsches Messquadrat oder eine ungeeignete Vorlage hin.