Dieser Artikel stellt die Mathematik von Ansels Lichterrekonstruktion vor: das ursprüngliche
guided laplacians-Design von 2021, dessen allgemeine Ideen nur je im pixls.us-Forum
skizziert worden waren,1 und die harmonische Transposition, die Methode, die es
ablöste, nachdem eine Ground-Truth-Studie einen Fehler bei der Wiederherstellung der Magnitude
aufgedeckt hatte.2 Er ist so aufgebaut, dass jede Leserin und jeder Leser den eigenen
Abschnitt findet: Die Ergebnisse und der Abschnitt Intuition & Hintergrund jeder
Methode kommen ohne Mathematik aus; Entwickler finden die Unterabschnitte Implementierung &
Optimierungen und die Performance-Studie; die
theoretischen Erkenntnisse und der
Friedhofs-Anhang sind so geschrieben, dass sie auch außerhalb der
Fotografie wiederverwendbar sind; und
wie diese Arbeit tatsächlich entstand dokumentiert das
Mensch-Maschine-Forschungsprotokoll dahinter.
Kurzfassung
Wenn ein Kamerasensor sättigt, beschneiden die drei Farbkanäle nicht zur selben Zeit, sodass ein ausgefressenes Licht in der Farbe driftet, meist Richtung Magenta. Dieser Artikel dokumentiert Ansels Lichterrekonstruktion von Anfang bis Ende und in der Reihenfolge, in der sie entstand: die ursprünglichen guided laplacians von 2021 (Wavelet-Detailübertragung durch einen geführten Filter, nie zuvor vollständig niedergeschrieben), die Ground-Truth-Studie, die ihren Magnitude-Fehler aufdeckte, und die Methode, die sie ablöste — die harmonische Transposition, die das lokale Farblinien-Modell des geführten Filters beibehält, seine Koeffizienten aber als glatte diffundierte Felder, gesteuert von der Struktur der überlebenden Kanäle, über die ausgefressene Zone trägt, den Sättigungsabfall (Rolloff) des Sensors vor dem Fit entzerrt und jedes Frequenzband und jede Pixelklasse dem Schätzer übergibt, der dort messbar am besten ist. Jede Design-Entscheidung ist durch eine Zahl auf einem öffentlichen Benchmark belegt, und die Fehlschläge sind mit derselben Sorgfalt dokumentiert wie die Erfolge, einschließlich zweier Ergebnisse, die wir für allgemeingültig halten: Die Nahtenergie an jeder Schätzer-Übergabe entspricht der Uneinigkeit der Schätzer und lässt sich nicht wegwichten, und die Gültigkeit einer Farblinie tief in einer ausgefressenen Zone ist aus den Daten um sie herum unentscheidbar.34
Das Problem
Der Magenta-Stich
Ein digitaler Sensor ist ein Array von Photosites, jede bedeckt von einem farbigen Filter eines Farbfilter-Arrays (CFA): dem Bayer-Muster (2×2 aus R, G, G, B) oder Fujis X-Trans (6×6). Jede Photosite ist ein Potentialtopf, der sich während der Belichtung mit Photoelektronen füllt und bei einer festen Kapazität sättigt. Da die Kapazität des Potentialtopfs eine Eigenschaft des Siliziums ist, sättigen alle drei Farben bei ungefähr demselben RAW-Codewert.
Die Falle ist der Weißabgleich. Ein neutrales graues Motiv erzeugt in den drei Kanälen keine gleichen RAW-Signale: die CFA-Transmissionen, die spektrale Empfindlichkeit des Sensors und das Szenenilluminant unterscheiden sich alle pro Kanal. Um ein solches Motiv neutral wiederzugeben, multipliziert der RAW-Entwickler jeden Kanal mit einem Weißabgleich-Koeffizienten: typischerweise wird der Grünkanal nahe $1$ belassen, während Rot und Blau um den Faktor $1.5$ bis $2$ hochmultipliziert werden.
Verfolgen Sie nun ein neutrales Licht, während es heller wird. Am Sensor hat die Sättigung nichts Kanalspezifisches: Die drei RAW-Signale klettern auf eine gemeinsame Obergrenze zu — den vollen Potentialtopf — und beschneiden bei mehr oder weniger demselben Wert. Das Magenta wird danach hergestellt, durch die Weißabgleich-Verstärkungen: Das Multiplizieren jedes Kanals ändert sowohl seine Steigung auf dem Weg nach oben als auch das Niveau, auf dem sein beschnittenes Plateau landet. Grün (Verstärkung $\approx 1$) plateauisiert dort, wo der Sensor es belassen hat; Blau und Rot werden durch ihre Verstärkungen hochgeschoben und plateauisieren darüber. Jenseits der Sättigung sind die aufgezeichneten Verhältnisse nicht mehr neutral — Rot und Blau überschießen Grün, und das „weiße" Licht liest sich als Magenta. (Bei echten Motiven beschneiden die Kanäle sehr wohl noch in Sequenz — die Eigenfarbe des Motivs und die kanalweisen Empfindlichkeiten staffeln die Einsätze, weshalb teilweise beschnittene Pixel existieren und überlebende Guides tragen — aber das Magenta eines ausgefressenen Neutraltons ist das Werk der Verstärkungen, nicht kanalweiser Schwellen.)
Note
Dies ist ein rein mechanisches, kolorimetrisches Artefakt des Aufnahmeapparats. In der Szene gibt es kein Magenta. Jede Rekonstruktion, die in einem Farbraum nach dem Entrasterung arbeitet, kämpft bereits gegen einen Farbtonfehler, den ein Entrasterung-Algorithmus über benachbarte Pixel verschmiert hat. Die Rekonstruktion vor dem Entrasterung, solange die Daten noch ein sauberes kanalweises Mosaik sind, ist der ganze Sinn der guided-laplacian-Methode.Der Wert, bei dem ein Kanal als beschnitten deklariert wird, ist nicht das numerische Maximum, sondern eine kanalweise Schwelle, abgeleitet vom RAW-Weißpunkt:
wobei $\text{white}_c$ das processed_maximum des Moduls für Kanal $c$ ist (das kanalweise
RAW-Weißniveau, das die früheren Pipeline-Stufen überlebt) und clip ein Benutzer-Sicherheitsfaktor
um $1$ herum ist. Der $0.995$-Rand hält fast gesättigte Photosites (deren Antwort nahe der Spitze
des Potentialtopfs bereits nichtlinear geworden ist) aus dem „gültigen" Satz heraus.2
Einfachere Behelfslösungen
Ansels Modul bietet drei billigere Rekonstruktionsmodi vor dem guided-laplacian-Modus, und sie sind erwähnenswert, weil sie einrahmen, was die teure Methode einbringt:
- Clip zerquetscht schlicht jeden Kanal auf die gemeinsame Schwelle $\texttt{clip}\times\min_c \text{white}_c$ (dieselben Weißniveaus, ohne den $0.995$-Rand). Kein Magenta, aber jede beschnittene Region wird zu einem flachen, texturlosen weißen Klumpen.
- Reconstruct in LCh wandelt jeden Bayer-Block in ein Luminanz/Chroma/Farbton-Tripel um, reskaliert die Chroma beschnittener Blöcke, um die unbeschnittene Luminanz zu treffen, und wandelt zurück. Es entfernt den Farbtondrift, kann aber keine Textur erfinden.2
- Reconstruct color (inpaint) propagiert Farbverhältnisse von benachbarten unbeschnittenen Pixeln entlang von Zeilen und Spalten, mithilfe des Verhältnis-Updates mit exponentiellem Abfall aus Magic Lanterns Algorithmus. Es ist schnell und gerichtet, aber eindimensional und von komplexen Kanten leicht zu täuschen.2
Der guided laplacians-Modus ist der einzige, der sowohl die Textur als auch die Magnitude
einer beschnittenen Region wiederherstellt, indem er von den Kanälen borgt, die entlang der
lokalen Farblinie überlebt haben.
Das vorgelagerte Darktable liefert zwei Rekonstruktionsmodi mit, die Ansel nicht führt, und sie bieten einen lehrreichen Vergleich, weil sie von einer anderen Annahme darüber ausgehen, was ein ausgefressenes Licht ist. Beide wurden von den G’mic- und Darktable-Teams entwickelt und beide arbeiten, wie unsere Methode, auf dem RAW-Mosaik: jeder Farbkanal wird zunächst überall aus seiner 3×3-Photosite-Nachbarschaft approximiert, was ein grobes, aber vollauflösendes kanalweises Bild ergibt.
Inpaint opposed beruht auf einer empirischen Beobachtung: Für einen beschnittenen Kanal ist der Mittelwert der beiden anderen Kanäle (der „opponierte" Durchschnitt, berechnet im Kubikwurzel-Raum, um den Dynamikumfang zu komprimieren) in der überwältigenden Mehrheit der Bilder eine gute Schätzung des fehlenden Werts. Der Mechanismus ist entsprechend einfach: Ersetze jeden beschnittenen Wert durch diesen opponierten Durchschnitt, dann füge einen globalen Chrominanz-Offset hinzu, gemessen an den Pixeln, die den beschnittenen Bereichen morphologisch am nächsten sind, um den Gesamtfarbstich zu absorbieren. Seine dokumentierten Fehlermodi sind die Szenen, in denen eine feste Beziehung nicht halten kann: gemischte Beleuchtung, ein Weißabgleich weit von der Annahme der Pipeline entfernt, oder mehrere Lichtquellen mit unterschiedlichen Farben, die verschiedene Lichter speisen.
Segmentation based verfeinert denselben Basis-Schätzer mit räumlicher Adaption. Die beschnittenen Pixel jedes Kanals werden per Flood-Fill zu zusammenhängenden Segmenten zusammengefasst (optional durch ein morphologisches Closing verschmolzen, das „combine"-Steuerelement); für jedes Segment durchsucht der Algorithmus seinen unbeschnittenen Rand nach dem besten Kandidaten-Pixel (bewertet nach lokaler Standardabweichung und Median in einem 5×5-Fenster) und transplantiert die Pseudo-Chrominanz dieses Kandidaten (der Kanal minus der opponierte Mittelwert, wiederum im Kubikwurzel-Raum) über das gesamte Segment. Wenn kein überzeugender Kandidat existiert, greift er auf einen segmentweiten Durchschnitt mit einer Chrominanz-Korrektur zurück. Wo alle Kanäle beschneiden, extrapoliert ein separater „rebuild"-Durchgang eine Luminanzfläche aus den Randgradienten, gesteuert (gegated) durch eine Distanztransformation — der nächste Verwandte, in dieser ganzen Landschaft, unserer biharmonischen Kuppel. Die Annahmen sind somit: eine repräsentative Chrominanz pro Segment (besser als eine pro Bild, aber innerhalb eines Segments immer noch flach), Textur, die von dem geerbt wird, was die überlebenden Kanäle tragen, und Gradienten-Extrapolation, wo nichts überlebte.
Beide sind ein verzweifelter Versuch, den beschädigten Bereich mit irgendetwas Plausiblem zu füllen, fördern aber flache farbige Flächen mit der falschen Magnitude.
Grundprinzipien
Die Methode ist eine Zusammenstellung von vier Ideen. Zwei davon (diskrete Laplace-Operatoren und die à-trous-B-Spline-Pyramide) werden wortgleich mit diffuse or sharpen geteilt und hier nur zusammengefasst. Die anderen beiden, der geführte Filter und die Chrominanz-Diffusion, tragen die Rekonstruktion und werden vollständig hergeleitet.
Gradienten und Laplace-Operatoren
Für ein diskretes Bild $u(i,j)$ misst der Gradient die lokale Steigung,
und der Laplace-Operator misst die lokale Krümmung: wie stark ein Pixel vom Durchschnitt seiner Nachbarn abweicht,
Der Laplace-Operator ist hier das Arbeitspferd, weil er Textur als Oszillation um einen lokalen Durchschnitt isoliert (er ist null auf flachen Regionen und reagiert nur auf lokalen Kontrast) und weil er linear ist: Über- oder Unterbelichten des Bildes reskaliert ihn einfach (eine Eigenschaft, auf die wir uns unten stützen). Textur auf diese Weise zu isolieren ist das, was uns erlaubt, sie zwischen Kanälen zu transplantieren, ohne die absolute Helligkeit des Guides mitzuschleppen; der Unterschied in der Gesamtmagnitude zwischen einem beschnittenen Kanal und seinem Guide wird von der Steigung des geführten Filters absorbiert, nicht vom Laplace-Operator selbst. Ansel verwendet die rotationssymmetrische 9-Punkt-Schablone von Oono & Puri
deren Winkelfehler viel kleiner ist als beim naiven 5-Punkt-Kreuz, sodass die Diffusion die Pixelraster-Achsen nicht bevorzugt.567
Die À-trous-B-Spline-Pyramide
Um auf Strukturen vieler Größen einzuwirken, wird das Bild in Frequenzbänder aufgeteilt, indem es wiederholt mit dem separierbaren kardinalen B-Spline-Kernel verwischt wird
einer kompakten Approximation einer Gaußfunktion mit dem Parameter $\sigma_B \approx 1.0554$.8 Auf Skala $s$ werden die Taps um eine Schrittweite von $2^s$ Pixeln auseinandergezogen („à-trous" = „mit Löchern"), sodass derselbe winzige Kernel immer weiter reicht, ohne je im Aufwand zu wachsen. Schreibt man $G_s$ für die aufeinanderfolgenden Tiefpass- (progressiv verwischten) Bilder und $H_s$ für die Detailbänder,
ist das Bild exakt die Summe seiner Bänder, $u = \sum_{s=0}^{n-1} H_s + G_{n-1}$. Ein Detailband $H_s$ ist eine Differenz von Gaußfunktionen, die selbst eine skalierte Approximation eines Laplacian-of-Gaussian ist — sodass „das Band $H_s$ filtern" und „einen Laplace-Operator auf Skala $s$ anwenden" zwei Sichtweisen derselben Operation sind. Die vollständige Herleitung, einschließlich wie der äquivalente Gauß-Radius wächst als
wird im Begleitartikel über diffuse or sharpen gegeben.29
Note
Zwei Produkte dieser Pyramide werden unten verwendet. Der Tiefpass $G_s$ ist ein lokaler gewichteter Mittelwert auf Skala $s$ — genau der lokale Durchschnitt, den der geführte Filter braucht, auf einer ganzen Leiter von Fenstergrößen. Das Detailband $H_s$ ist ein skalierter Laplace-Operator, der Operator, den die Chrominanz-Diffusions-Rückfalllösung integriert. Die eigentliche Rekonstruktion arbeitet auf den $G_s$ (die die Magnitude der Farbe tragen); die Rückfalllösung arbeitet auf den $H_s$.Der geführte Filter
Der geführte Filter von He, Sun und Tang ist die Maschine, die Textur von einem guten Kanal in einen beschnittenen borgt.3 Angenommen, wir wollen ein Ausgabebild $q$ erzeugen, das einem Ziel $p$ treu bleibt, aber die Kanten und Textur eines Guides $I$ trägt. Nehmen wir an, dass innerhalb eines beliebigen kleinen Fensters $\omega_k$ um Pixel $k$ die Ausgabe eine affine Funktion des Guides ist:
Diese einzige Annahme, eine lokale Farblinie, ist das ganze Modell. Sie besagt, dass innerhalb eines kleinen Patches der Kanal, den wir wiederaufbauen, nur eine skalierte, verschobene Kopie des Guides ist. Es ist derselbe Prior, der dem kanalübergreifenden Entrasterung, dem Dehazing, dem Image Matting und der Kolorierung zugrunde liegt: Natürliche Oberflächen zeichnen Farblinien (lokal sind ihre Kanäle affin verwandt), weil die meisten Kanten Änderungen der Reflektanz sind, die alle Kanäle gemeinsam skalieren.10 Unter einer affinen Abbildung ist $\nabla q = a_k \nabla I$, sodass $q$ jede Kante von $I$ erbt, lediglich durch $a_k$ reskaliert.
Wir fitten $(a_k, b_k)$ per kleinster Quadrate und halten $a_k$ klein, um kein Rauschen zu verstärken (ein Ridge-Term $\varepsilon a_k^2$):
Das Nullsetzen der Ableitungen liefert die geschlossene Form, die fast wortgleich im Code auftaucht:
Die Kovarianz im Zähler (ein Maß dafür, wie stark Guide und Ziel gemeinsam steigen und fallen) ist der Schlüssel: Wo sie sich gemeinsam bewegen, geht $a_k \to 1$ und die Textur des Guides wird durchkopiert; wo der Guide flach ist ($\operatorname{var} \to 0$), geht $a_k \to 0$ und die Ausgabe fällt auf den lokalen Mittelwert $\bar p$ zurück. Der Ridge-Parameter $\varepsilon$ setzt die Skala, unterhalb derer Variationen als Rauschen behandelt und geglättet statt übertragen werden.
Note
Hes geführter Filter hat einen zweiten Schritt (das Mitteln der fensterweisen Koeffizienten $(a_k, b_k)$ über alle Fenster, die ein Pixel überdecken), der die Ausgabe davor bewahrt, blockig auszusehen. Die neu aufgebaute Implementierung erhält dieselbe Glättung gratis, indem sie die Fensterstatistiken mit einem glatten Kernel (einer Gaußfunktion) statt einer harten Box berechnet: überlappende glatte Fenster machen $a$ und $b$ zu glatt variierenden Feldern, sodass $a,I + b$ bereits artefaktfrei ist, ohne einen separaten Mittelungsdurchgang. Dies ist kein kosmetisches Detail: Wiederholt man denselben Fit mit einem harten Box-Fenster vergleichbarer Trägerbreite, hinterlässt das sichtbare achsenparallele Streifen und gestufte Plateaus überall dort, wo Bildstruktur eine Fenstergrenze kreuzt, und kostet etwa ein Drittel mehr Fehler auf der Kantenszene des Benchmarks. Der Code von 2021 seinerseits verwendete eine harte $3\times3$-Box ganz ohne Mittelung — er kam damit durch, weil das Fenster drei Pixel breit ist und die iterierte Diffusion glättet, was immer es hinterlässt.[^impl]Diffusion als Farb-Inpainting
Die Farbe eines Lochs zu füllen ist ein anderes Problem als seine Textur zu füllen. Die Farbe eines Lochs sollte glatt variieren und zu seinem Rand passen; sie sollte kein eigenes hochfrequentes Detail (feine, schnell variierende Textur) tragen. Der natürliche Formalismus ist die Dirichlet-Energie, die Gesamtmenge an Variation, die das Bild enthält, groß dort, wo es sich windet, und null dort, wo es konstant ist:
deren Minimierer über das Loch $\Omega$, mit den umgebenden Pixeln als Randbedingung, die harmonische Funktion ist, die $\Delta u = 0$ erfüllt.
(Notation, im gesamten Artikel verwendet: $\lVert v \rVert$ ist die euklidische Norm eines Vektors — für den Gradienten $\lVert \nabla u \rVert = \sqrt{(\partial_x u)^2 + (\partial_y u)^2}$, die lokale Steigungsmagnitude; $\lvert s \rvert$ ist der Absolutwert eines Skalars; und $\langle \cdot \rangle$ — spitze Klammern — ist der Durchschnitt der eingeschlossenen Größe über die Pixel der Region.) Der Gradientenabstieg dieser Energie ist genau die Wärmeleitungsgleichung
d. h. isotrope Diffusion, wobei isotrop richtungsblind bedeutet, sich gleichmäßig in alle Richtungen ausbreitend. Sie auszuführen breitet die Randfarbe nach innen aus, bis das Loch von einer glatten, krümmungsfreien Fläche gefüllt ist. Dies ist dasselbe anisotrope Wärmetransport-Inpainting-Modell von Qin et al., das Ansel bereits für diffuse or sharpen verwendet, hier auf seinen isotropen Fall beschränkt.4 Wir werden es nicht auf die Pixel anwenden, sondern auf die Farbverhältnisse, sodass nur die Chrominanz geglättet wird, während die rekonstruierte Luminanz in Ruhe gelassen wird.
Die Diffusion steuern: die anisotrope Erweiterung. Die obige Dirichlet-Energie behandelt jede Richtung gleich; sie ist isotrop. Sie verallgemeinert sich zu einer gewichteten Form,
wobei der Diffusionstensor $D$ eine kleine symmetrische Matrix ist, die an jedem Pixel definiert ist und deren Aufgabe es ist, Richtungen umzugewichten: volle Leitfähigkeit entlang eines seiner Eigenvektoren, gedämpfte Leitfähigkeit entlang des anderen. Das Minimieren dieser Energie löst $\mathrm{div}(D\,\nabla u) = 0$ (ihre Euler-Lagrange-Gleichung), und mit $D$ überall gleich der Identität reduziert es sich exakt auf den isotropen Fall oben. Der Sinn der Maschinerie ist das Steuern: Wähle die starke Richtung entlang der Isophoten des Bildes (der Linien konstanter Helligkeit) und die gedämpfte quer dazu, und die Diffusion glättet eine Größe entlang der Bildstruktur, während sie sich weigert, sie über Kanten zu tragen.
Dies sicher zu diskretisieren erfordert eine Vorsichtsmaßnahme. Schreibt man den Tensor $D = \begin{pmatrix} a & b \ b & c \end{pmatrix}$ (gemittelt zwischen jedem Pixel und seinem Nachbarn, mit dem Kreuzterm auf $|b| \leq \min(a, c)$ geklemmt), wird die Divergenz $\operatorname{div}(D\,\nabla u)$ zu einer Summe über die acht Nachbarn mit Gewichten
der Nichtnegativität-erhaltenden Schablone von Weickert: Die Klemmung garantiert, dass jedes Gewicht nichtnegativ ist, sodass die verankerte Relaxation $u_0 \leftarrow \sum_k w_k u_k / \sum_k w_k$ jede Unbekannte durch eine konvexe Kombination ihrer Nachbarn ersetzt. Das ist das diskrete Maximumprinzip — die gelösten Werte können den Bereich der Anker niemals verlassen, egal wie hart der Tensor steuert — und es ist das, was anisotrope Diffusion sicher auf Daten ausführbar macht, die physikalisch bleiben müssen. Die ausgelieferte Methode nutzt diese Maschinerie an zwei Stellen: dem Transport der Farblinien-Koeffizienten über die ausgefressene Zone (Schritt 3 des Algorithmus, wo der Tensor zusätzlich zwischen Isophoten- und Gradienten-Steuerung durch eine gemessene Kantenwahrscheinlichkeit überblendet) und der Chrominanz vollständig beschnittener Kerne (Schritt 8), wo Farben der Struktur der wiederhergestellten Luminanz folgen und niemals über sie hinausbluten dürfen.
Biharmonisches Inpainting
Harmonisches Inpainting ist das richtige Werkzeug für ein Signal, das im Loch flach werden sollte: eine glatte Chrominanz. Es ist das falsche Werkzeug für eines, das noch stieg, als der Sensor es beschnitt: die Magnitude eines ausgefressenen Lichts kletterte weiter, und es flach zu füllen ($\Delta u = 0$) hinterlässt eine matte Scheibe, wo eine helle Kuppel hingehört. Um die umgebende Steigung stattdessen nach innen zu tragen, anstatt sie zu löschen, bestrafe die Biegung des Signals statt seines Gradienten: minimiere die Dünnplatten- (biharmonische) Energie
deren Euler-Lagrange-Gleichung (die Bedingung, die jeder Minimierer der Energie erfüllen muss) die biharmonische Gleichung $\Delta^2 u = 0$ ist. Wo die harmonische Lösung $\Delta u = 0$ erzwingt (eine flache Minimalfläche), macht die biharmonische Lösung $\Delta u$ selbst harmonisch: die Krümmung am Rand wird ins Innere getragen, sodass der steigende Gradient des Randes zu einer Kuppel extrapoliert wird (ein Dünnplatten-Spline). Es ist das höherstufige, gradienten-fortsetzende Gegenstück zur Diffusion, im selben Geist, in dem diffuse or sharpen das Vorzeichen des Laplace-Operators umkehrt, um zu schärfen statt zu glätten. Wir lösen es als direktes dünnbesetztes lineares System auf dem Loch und verwenden es unten, um die Magnitude eines beschnittenen Kanals aus seinem eigenen gültigen Rand wiederaufzubauen, wo immer kein korrelierter Kanal überlebt, um ihn zu führen.7
Die Methode von 2021: guided laplacians
Bevor wir der Evolution der Methode folgen, dokumentiert dieser Abschnitt das ursprüngliche
Design, wie es 2021 ausgeliefert wurde und wie es noch heute ausgeliefert wird — das Design
unverändert, obwohl es einen gemessenen Border-Gather-Fix mit der neuen Pipeline teilt
(dokumentiert mit den harmonischen Verfeinerungen weiter unten) — unter dem
guided laplacians-Modus (die neue Methode ist ein separater, opt-in-Modus: siehe die
Statusnotiz weiter unten). Es wurde gegen die Intuition kodiert und per Auge an natürlichen
Bildern abgestimmt, und seine allgemeinen Ideen wurden nur je im pixls.us-Forum skizziert1;
dies ist seine erste vollständige Niederschrift.
Intuition & Hintergrund
Die Intuition. Unvermeidbares Clipping geschieht innerhalb von Lichtquellen: der Sonne, einer Flamme, einer spekularen Reflexion. Solche Quellen sind von einem leuchtenden Halo umgeben, und dieser Halo trägt drei ausnutzbare Arten von Information. Erstens sind die Farbkanäle dort stark korreliert (sie steigen alle zur Quelle hin), sodass ein Kanal, der beschnitten hat, die Form eines Kanals borgen kann, der es nicht tat. Zweitens zeigen die Gradienten des Halos auf die Quelle, sodass selbst ein vollständig ausgefressener Kern plausibel fortgesetzt werden kann, indem die umgebenden Gradienten nach innen propagiert werden. Drittens ist der Halo wie die Lichtquelle selbst gefärbt, sodass die Chrominanz durch Nach-innen-Propagieren von RGB-Verhältnissen wiederhergestellt werden kann. Das Design von 2021 verwandelte jede Intuition in einen Operator: eine geführte Übertragung feiner Struktur zwischen Kanälen und eine iterierte Diffusion, die Struktur aus dem gültigen Umfeld in die ausgefressene Region schiebt, während sie Farbverhältnisse nach innen diffundiert.
Die Ziele. Rekonstruiere vor dem Entrasterung, auf dem RAW-Mosaik, sodass die Interpolation niemals beschnittene Samples sieht; verlasse dich niemals auf den Weißabgleich oder irgendeine Annahme darüber, welche Farbe das Licht „haben sollte" (die Eigenfarbe der Lichtquelle ist unerkennbar); und ziehe glatte, physikalisch plausible Fortsetzungen scharfen Halluzinationen vor, weil ein Fehler in einem ausgefressenen Licht als hartes Artefakt weit sichtbarer ist denn als weiches.
Seine Bilanz. In ihren Design-Fällen funktionierte die Methode, und tut es immer noch: eine Sonnenscheibe oder ein Spekular auf Wasser wird mit glaubwürdiger Struktur wiederaufgebaut und ohne den flachen grauen Fleck, den einfaches Clipping hinterlässt. Sie bewahrt Gradienten, wo einfachere Methoden (Kanalverhältnis-Skalierung, Einzelfarb-Inpainting) sie abflachen, und da sie auf Gradienten statt auf Farben arbeitet, toleriert sie einen falschen Weißabgleich. Zwei strukturelle Grenzen wurden von Anfang an verstanden und akzeptiert: ein ausgefressener Himmel, durch grüne Blätter gesehen, wird grün wiederhergestellt (die Methode propagiert die benachbarte Farbe, per Design), und starke chromatische Aberration bricht die Kanalausrichtung, die die Farblinie braucht.
Das Optimierungsproblem
Die Texturübertragung. Das Bild wird mit der oben beschriebenen à-trous-B-Spline-Pyramide zerlegt: auf jeder Skala $s$ spaltet sich das Signal in eine niederfrequente Approximation und ein Detailband $H_s$. Weil der kardinale B-Spline einer Gaußfunktion sehr nahekommt und das Detailband skalenweise als Differenz mit dieser approximierten Gaußfunktion berechnet wird, ist $H_s$ selbst bereits einem Laplace-Operator nahe, in der Magnitude reskaliert (es überschätzt den Laplace-Operator tatsächlich). Auf jedem Detailband wird jeder beschnittene Kanal $c$ gegen einen Guide-Kanal $g$ gefittet (pro Pixel als der Kanal mit der stärksten lokalen Varianz gewählt, also derjenige, der die meiste Struktur trägt — ohne Prüfung, ob der Guide selbst dort gültig ist) mit dem oben hergeleiteten geführten Filter:
wobei Kovarianz und Varianz lokale fensterweise Statistiken sind (eine harte 3×3-Box, die beschnittene Samples nicht ausschließt), und die Division schlicht übersprungen wird, wo die Varianz des Guides unter $10^{-12}$ fällt — es gibt keinen Dämpfungsterm. Weil ein Detailband mittelwertfrei ist, ist der Achsenabschnitt $b_c$ im Wesentlichen null: die Übertragung bewegt Textur vom Guide zum beschnittenen Kanal, skaliert durch ihre gemessene lokale Beziehung.
Die Chrominanz-Diffusion. Die zweite Stufe operiert auf den RGB-Verhältnissen (der Chrominanz, $\text{RGB}/n$ mit $n = \lVert \text{RGB} \rVert$, der euklidischen Norm — dem Symbol, das die Update-Regeln unten verwenden) und iteriert den Neun-Punkt-Laplace-Operator von Oono & Puri auf jeder Verhältnisebene; die Normebene $n$ reitet auf derselben Pyramide, ist aber ausdrücklich vom Schritt geschützt (davor gesichert und danach wiederhergestellt), sodass sie unverändert resynthetisiert wird. Diese Iteration ist der Gradientenabstieg eines expliziten variationellen Problems: über die beschnittene Region $\Omega$, mit dem gültigen Rand als Randdaten, minimiert sie
für jede Verhältnisebene und für die Norm: eine Dirichlet- (harmonische) Energie, die die Chrominanz und das Niveau des Randes glatt nach innen trägt, plus ein optionaler Screening-Term, der den Kern zur mittleren gültigen Farbe $\bar u$ hin mit dem „inpaint a flat color"-Gewicht $\lambda_{\text{solid}}$ des Benutzers zieht. Ihre Euler-Lagrange-Gleichung ist die Screened-Poisson-Gleichung aus dem Theorie-Abschnitt; der Code von 2021 löst sie nie bis zum stationären Zustand — der „iterations"-Regler kürzt den Abstieg ab, sodass das praktische Ergebnis ebenso vom Iterationsbudget wie von der Energie abhängt. Zwei Eigenschaften folgen direkt aus diesem Ziel und erklären den charakteristischen Look der Methode: eine harmonische Füllung flacht ab (sie bestraft Gradienten, sodass das Innere zu einem Niveauplateau tendiert — der Theorie-Abschnitt zeigt, warum eine biharmonische Energie nötig ist, um Steigungen fortzusetzen), und nichts in beiden Stufen beschränkt das rekonstruierte Niveau eines beschnittenen Kanals, das Stufe 1 nicht übertragen kann (mittelwertfreie Bänder) und Stufe 2 nur aus einem Rand diffundiert, der beim Clip sitzt.
Der Algorithmus
Die gesamte Prozedur auf einen Blick:
flowchart TD A["raw mosaic (one colour per pixel)"] --> B["bilinear interpolation to temporary RGB
+ per-channel clip masks"] B --> C["downsample 4× (for speed)"] C --> D["à-trous B-spline pyramid:
split into detail bands, one per frequency range"] D --> E["per band, RGB, fine → coarse:
guided-filter fit of the clipped channel
against the most textured channel
(validity not checked)
→ transfer of TEXTURE (zero-mean details)"] E --> F["per band, RGB ratios & norm, iterated 9-point Laplacian diffusion:
spread structure from the valid rim
into the blown core, isotropically"] F --> G["optional: reaction toward a flat colour
(user slider) + Poissonian re-graining"] G --> H["upsample, remosaic,
feathered composite over the raw"]
Die Kompromisse sind absichtlich. Das Arbeiten auf Detailbändern macht die Übertragung immun gegen Weißabgleich-Fehler (nur Formen bewegen sich zwischen Kanälen). Der Neun-Punkt-Laplace-Operator ist die isotrope, rotationsinvariante Diskretisierung, hergeleitet in den Grundprinzipien, sodass die Diffusion den Kern von außen nach innen füllt, ohne den Achsen des Pixelrasters zu folgen. Glattheit wird stets der Schärfe vorgezogen: ein Fehler in einem ausgefressenen Licht liest sich als hartes Artefakt, wenn scharf, und als plausibles Glühen, wenn weich. Und die Fein-zu-Grob-Bandreihenfolge bedeutet, dass jedes Band unabhängig innerhalb eines Durchgangs gefittet wird — es gibt keine skalenübergreifende Konsistenzbedingung, was gerade deshalb harmlos bleibt, weil die Bänder mittelwertfrei sind.
Drei vorbereitende Stufen verdienen eine Notiz — sie werden von jeder Rekonstruktionsmethode in diesem Artikel geteilt, den Nachfolger eingeschlossen.
Bilineares Entrasterung. Das Mosaik wird bilinear zu einem temporären RGB-Bild demosaiced: ein Wegwerf-Entrasterung, dessen einzige Aufgabe es ist, jedem Kanal überall einen Wert für den kanalweisen geführten Fit zu geben; die endgültige Ausgabe wird zurück zu einem einzelnen Kanal remosaiced. Eine kanalweise Clip-Maske zeichnet zusammen mit ihrem logischen ODER (weichgezeichnet in die Kompositions-Opazität $\alpha$) auf, welche Kanäle gesättigt sind.2
Lokale Kanalnormalisierung. Jede Farbe wird durch den Durchschnittswert dieser Farbe in der aktuellen Kachel geteilt, ein grober lokaler Weißabgleich, an Ort und Stelle berechnet. Dies egalisiert die Kanalmagnituden, sodass der Varianzvergleich zur Guide-Auswahl nicht zu dem Kanal hin verzerrt ist, der die größten RAW-Zahlen trägt; es verwendet absichtlich nicht den vorgelagert deklarierten Weißabgleich wieder.2
Weichzeichnen der Maske. Die binäre Maske wird durch einen kleinen $5\times5$-Box-Durchschnitt zu einer Opazität $\alpha \in [0,1]$ geglättet, verwendet als endgültiges Kompositionsgewicht und als kanalweise Soft-Gewichte der à-trous-Rekonstruktion unten. Das Weichzeichnen mildert die Naht, wo die Rekonstruktion auf unberührte Pixel trifft; in den numerischen Tests senkte es den Randfehler dieser Methode, anstatt ihn zu erhöhen — es zu entfernen wurde getestet und schadet hier messbar (die Soft-Gewichte sind tragend), während die Nachfolgermethode das Weichzeichnen ganz fallen lässt (ihre Masken sind von Anfang bis Ende binär; siehe den Friedhof).
Die Update-Regeln
Das Optimierungsproblem benennt, was diese Methode minimiert, und der Algorithmus erzählt ihre Stufen; hier sind die tatsächlichen Signal-Updates des ausgelieferten 2021-Modus, in Ausführungsreihenfolge, für einen Implementierer, der bei null anfängt. Ebenen: das viermal heruntergesampelte temporäre RGB $u_c$ (bilineares Entrasterung, kanalnormalisiert), die weichgezeichneten kanalweisen Masken $\alpha_c \in [0,1]$ und ihre Any-Clip-Opazität $\alpha$. Zerlegung: die à-trous-B-Spline-Pyramide mit Schrittweite $2^s$ pro Skala — kaskadierte Verwischungen $\mathrm{LF}_s$, Detailbänder $D_s = \mathrm{LF}_{s-1} - \mathrm{LF}_s$, plus das gröbste Residuum.
1. Texturübertragung (der RGB-Durchgang), pro Skala von fein nach grob, an jedem Pixel, wo $\alpha > 0$. Auf der $3\times3$-à-trous-Nachbarschaft (Schrittweite $2^s$) des Detailbands berechne den kanalweisen Patch-Mittelwert und die Varianz, wähle den Guide $g$ als den Kanal mit der größten Patch-Varianz (Gültigkeit wird nicht geprüft — die Wurzel von Fehlschlag 4), fitte die auf Null-Achsenabschnitt vorgespannte Farblinie auf den Details,
und blende die Vorhersage ein, quadratisch mit dem äquivalenten Radius der Skala verblassend —
genommen bei Schritt $4s$, nicht $s$: der Code wertet $\sigma$ bei s * DS_FACTOR aus und belastet
jede Skala auch mit dem Downscale-Faktor, sodass das Verblassen weit steiler ist, als $\sigma_s^2$
allein nahelegt ($\beta$ ist $\alpha/380$ bei $s{=}1$ und $\alpha/97\,000$ bei $s{=}2$ — die
geführte Übertragung lebt effektiv auf den feinsten Skalen):
Die Resynthese summiert die verarbeiteten Bänder plus das Residuum, geklemmt auf $\geq 0$; auf der letzten Iteration wird Poisson-Korn der Amplitude $\sigma = u_c \cdot \texttt{noise_level}$ eingefaltet (nur aufhellend) unter $\alpha$. Das Ergebnis wird in Richtung und Magnitude aufgeteilt, $r_c = u_c / \lVert u \rVert$ und $n = \lVert u \rVert$, für den nächsten Durchgang.
2. Chrominanz-Diffusion (der Chroma-Durchgang), dieselbe Pyramide über die vier Ebenen $(r_R, r_G, r_B, n)$: jedes Detailband der drei Verhältnis-Ebenen macht einen expliziten Euler-Schritt der Screened-Wärmeleitungsgleichung, pro Pixel, wo $\alpha > 0$ und pro Kanal — das Band der Normebene wird vor dem Schritt gesichert und danach wiederhergestellt, sodass $n$ die Pyramide undiffundiert durchquert,
mit $\mathbf{K}_{\text{iso}}$ dem Neun-Punkt-isotropen Laplace-Operator aus den
Grundprinzipien, $\kappa = \sigma_B^2 / (2\sqrt{\pi}) \approx 0.31$
der Band-zu-Laplace-Reskalierung und $\lambda$ der Flachfarb-Reaktion (solid_color).
Resynthese wie oben, dann werden die Verhältnisse auf Einheitsnorm renormalisiert und
rekombiniert, $u_c \leftarrow r_c \cdot n$.
3. Iterieren. Durchgänge 1–2 wiederholen sich iterations-mal (der Benutzer-Regler); nichts
erkennt Konvergenz, die Anzahl ist das Budget.
4. Komponieren. Die Rekonstruktion wird viermal hochgesampelt und über das RAW-Mosaik durch die weichgezeichnete Opazität geblendet, pro Photosite der Farbe $c$: $\text{out} = \alpha\, u_c + (1 - \alpha)\, \text{raw}$.
Nichts anderes schreibt ein Pixel — und, wie die Ground-Truth-Studie feststellte, überträgt nichts oben ein Niveau: jedes Update wirkt auf mittelwertfreie Detailbänder oder auf Verhältnisse, was genau die strukturelle Lücke ist, die der Nachfolger schließt.
Implementierung & Optimierungen
Die gesamte Rekonstruktion läuft auf einem viermal heruntergesampelten Puffer — einem
Sechzehntel der Pixel — und das Ergebnis wird hochgesampelt und unter einer weichgezeichneten
Maske zurück über das RAW komponiert. Diese eine Entscheidung erkauft den größten Teil der
Geschwindigkeit der Methode und kostet messbare Genauigkeit: Dieselbe Mathematik in voller
Auflösung erneut auszuführen senkt den Randfehler um etwa 30 %, weil die hochgesampelte
Rekonstruktion unscharf gegen das scharfe Original ist, dem sie sich anschließen muss (die
Nachfolgermethode läuft aus genau diesem Grund in voller Auflösung). Die à-trous-Detailbänder
überschätzen den Laplace-Operator um eine bekannte Konstante (das $\sigma_B = 1.05537$ des
B-Splines ergibt $1/\kappa = 3.1827$), was der Diffusionsschritt kompensiert; die Diffusion läuft
iterations × (ein RGB-Verhältnis-Durchgang + ein Norm-Durchgang) pro Skala, auf dem gesamten
Frame — es gibt keine Regionssegmentierung, sodass der Aufwand mit dem Bild skaliert, nicht mit
dem beschnittenen Bereich. Poisson-Korn ($\sigma = \text{Wert} \times \text{Rauschniveau}$) wird
auf der letzten Iteration neu erzeugt, sodass rekonstruierte Bereiche neben echter Textur nicht
plastikartig glatt aussehen.
Entdeckte Probleme
Was im obigen Flussdiagramm nie geschieht, ist eine Übertragung des Niveaus — eine Beobachtung, die ohne Ground Truth unsichtbar ist, und wo die gesamte Studie von 2026 beginnt.
Die Probleme. In der Praxis meldeten Benutzer immer wieder ausgefressene Lichter, die nach der
Rekonstruktion magenta blieben — genau der Defekt, zu dessen Behebung die Methode existiert. Die
im Rest dieses Artikels dokumentierte Studie lokalisierte die Grundursache schließlich in der
obigen Mathematik: der geführte Fit wurde nur auf die Detailbänder angewandt. Ein Detailband
hat einen lokalen Mittelwert von null, sodass der Achsenabschnitt $b_c$ keine Energie trägt und
nur Textur je übertragen wird — niemals das Niveau. Die niederfrequente Komponente des
beschnittenen Kanals, am Clip-Wert festgenagelt, wurde unverändert wieder hinzugefügt; ein
ausgefressener Kanal blieb beim Clip (oder wurde von der Chrominanz-Behandlung darunter geschubst)
und blieb magenta. In dem später gebauten Validierungs-Benchmark ist diese ursprüngliche
Rekonstruktion bei Einzelkanal-Clips oft schlechter als nichts zu tun: ein
Wurzel-mittlerer-quadratischer Fehler (RMSE) von 0.073 gegenüber 0.049 dafür, die Pixel beschnitten
zu lassen, auf einer naturähnlichen Szene, wo der letztliche Wiederaufbau 0.015 erreicht (diese
drei Zahlen stammen vom Benchmark des Python-Forschungsprototyps — fix_prototype.py im
Forschungs-Repository —
dessen NumPy-Portierung des 2021-Moduls für das C einsteht; die ausgelieferten Implementierungen
werden in den Ergebnissen bewertet).

Eine synthetische Szene: drei gesättigte Einzelkanal-Lichter (rote, grüne, blaue Scheiben) und ein helles, nahezu neutrales. Ground Truth ist die unbeschnittene Szene, clipped das, was der Sensor aufzeichnet, previous method die Python-Portierung des à-trous-Moduls von 2021, corrected method dasselbe Design mit der Vollsignal-Reparatur, die gleich unten beschrieben wird.
In den Einzelkanal-Scheiben klettert das korrigierte Ergebnis zurück zur wahren Farbe (z. B. stellt die rote Scheibe $\approx 1.7$ gegenüber wahr $\approx 1.9$ wieder her, mit Grün und Blau exakt getroffen), wo die vorherige Methode unter dem Clip bleibt ($\approx 0.9$). Die vollständig beschnittene neutrale Scheibe, flach beim Clip sowohl im Sensor als auch in der vorherigen Methode, wird durch die geteilte Luminanzfüllung wieder aufgekuppelt (Zentrum $\approx 1.5$ gegenüber wahr $\approx 1.6$) und bleibt nahezu neutral, ihre Chrominanz getragen von der Rand-Diffusion.
Die Einzeiler-Reparatur — denselben geführten Fit auf das Vollsignal anwenden (Niederfrequenz und Detail zusammen), sodass der Achsenabschnitt den lokalen Mittelwert trägt und ein ausgefressener Kanal über den Clip steigen kann (die Mathematik ist in den Update-Regeln) — behebt diese Klasse von Fehlschlägen, und sie ist das Fundament, das alles Spätere beibehielt: alle nachfolgenden Methoden in diesem Artikel fitten Farblinien auf Vollwerten. Sie war notwendig, aber nicht hinreichend. Mit Ground Truth zum Messen — auf dem reparierten Design, in voller Auflösung um eine Leiter von Fenstergrößen wiederaufgebaut (der Friedhofs-Anhang führt es aus) — blieben vier strukturelle Fehlschläge, und sie formten die Nachfolgermethode:
Erstens degeneriert die Fensterleiter überall dort, wo ein Fenster meist Clip-Niveau-Daten sieht (feine Fenster nahe dem Rand, grobe Fenster tief im Loch), und ein degenerierter Fit (Kovarianz nahe null, Steigung nahe null) füllt flach, ungefähr auf Clip-Niveau. Schlimmer noch, die Übergabe zwischen aufeinanderfolgenden Skalen folgt einer Kontur konstanter Tiefe ins Loch, und die Uneinigkeit der beiden Skalen druckt einen sichtbaren Bogen entlang davon.
Zweitens konkurriert die $\epsilon$-Dämpfung oben mit der lokalen Varianz des Guides, sodass sie die Steigung stillschweigend zerquetscht, wo immer diese Varianz klein ist — was verrauschten Inhalt zufällig schützt und saubere glatte Gradienten (wie Himmel) durch denselben Mechanismus abflacht. Eine Konstante, zwei entgegengesetzte Konsequenzen, kein Wert, der beiden dient.
Drittens beschneidet der Sensor nicht abrupt: er komprimiert die letzten paar Prozent unterhalb der Sättigung, sodass das Band von Pixeln, das die Rekonstruktion als vertraute Anker behandelt, systematisch zu niedrig aufgezeichnet wird.11 Selbst ein Orakel, das das beschnittene Innere exakt wiederaufbaute, würde dann sichtbar heller sitzen als der verzerrte Ring, an den es sich anfügen muss: die Naht steckt in den Daten, nicht in der Schätzung, und nur das Korrigieren der Daten (die Knie-Inversion) kann sie entfernen.
Viertens beruht die gesamte Methode auf einer einzigen Hypothese: Benachbarte Kanäle steigen und fallen gemeinsam, sodass ein beschnittener Kanal eine messbare affine Funktion eines überlebenden ist. Und manche Inhalte (ein Himmel, dessen Farbton selbst driftet, Irisieren, Farbtextur feiner als das Fenster) erfüllen sie schlicht nicht. Dort enthält der Guide für jeden Schätzer keine Information über den fehlenden Kanal, sodass das Design dies messen muss ($R^2$) und die Informationsquelle vollständig wechseln muss: räumliche Glattheit statt Kanal-übergreifendem Transfer.
Diese zu beheben erforderte mehr als eine Korrektur — es erforderte einen Paradigmenwechsel.
Die neue Methode: harmonische Transposition
Dieser Abschnitt dokumentiert die Methode, die heute ausgeliefert wird — ihre Prämissen, ihr
Optimierungsproblem, ihren Algorithmus und wie die Produktionsimplementierung vom Forschungsprototyp
abweicht. Gemessene Ergebnisse, Performance und die allgemeinen Erkenntnisse haben jeweils ihren eigenen
Abschnitt weiter unten. Die harmonische Transposition wird als eigener Rekonstruktionsmodus neben den
ursprünglichen guided laplacians ausgeliefert: Die à-trous-Methode von 2021 behält ihren historischen
Namen und ihr Design — unverändert bis auf die gemeinsame Korrektur des Rand-Gathers, die ihre eigenen
Bewertungen verbessert — und die neue Methode ist ein explizites Opt-in.
Der Rekonstruktionskern ist agnostisch gegenüber dem Sensormosaik und läuft auf Bayer und X-Trans
gleichermaßen, auf dem Prozessor und innerhalb einer OpenCL-Pipe, wo jede beschnittene Region auf
derjenigen Seite des Busses gelöst wird, die sich als schneller erwiesen hat
(siehe den Performance-Abschnitt).
Intuition & Hintergrund
Die obige Reparatur ändert, was der geführte Filter überträgt; die harmonische Transposition ändert, wie das Modell reist. Wo immer mindestens ein Kanal überlebt hat, ist die Rekonstruktion ein Regressionsproblem, kein Inpainting-Problem: Die gültigen Kanäle sind gemessene Daten, an jedem Pixel der ausgefressenen Zone vorhanden, und die einzige Unbekannte ist die lokale Beziehung (die Farblinie) zwischen ihnen und dem beschnittenen Kanal. Die Methode von 2021 — und ihr korrigierter Vollsignal-Rebuild — wertete diese Beziehung aus, wo immer ein Statistikfenster reichen konnte, und nähte die Auswertungen zusammen; jede Naht war eine Naht, und Fenster tief im Inneren eines großen Lochs erreichten überhaupt nichts. Die harmonische Transposition kehrt den Transport um: Fitte die Farblinie einmal, dort, wo die Daten sie stützen, diffundiere dann die Koeffizienten des Modells — nicht die Pixelwerte — als glatte Felder über die ausgefressene Zone, und werte sie erst dann an jedem Pixel gegen die gemessenen überlebenden Kanäle aus. Koeffizienten sind von Natur aus glatt, wo Werte es nicht sind; die Guides injizieren zur Auswertungszeit die volle Auflösungsstruktur wieder. Warum dies ein Unterschied in der Art und nicht im Grad ist — und worauf es sich verallgemeinert — wird in den theoretischen Erkenntnissen ausbuchstabiert.
Alles andere, was die Methode von 2021 richtig gemacht hat, wird beibehalten, auf solidere Grundlage gestellt: das Farblinienmodell und seine gefensterte gewichtete Methode der kleinsten Quadrate (die Regression des geführten Filters), die biharmonische Kuppel für die guide-lose Magnitude, die Chrominanz als beschränkte Verhältnisse getragen, die Vorliebe für glatte Fortsetzungen und die Kornregeneration. Was neu ist, neben dem Transport: Segmentierung pro Region in voller Auflösung (die Kosten skalieren mit der beschnittenen Fläche, nicht mit dem Bild), eine gemessene Inversion des Sensor-Rolloffs, die das Band nahe dem Clipping entzerrt, bevor irgendetwas gefittet wird (Fehler 3 oben), Fits, die durch ihre eigene gemessene Qualität $R^2$ gesteuert und beglaubigt werden (Fehler 4), und eine überall angewandte Designregel, abgeleitet aus dem Naht-Energie-Gesetz der theoretischen Erkenntnisse: kein Schritt darf zwischen Schätzern übergeben, die sich widersprechen (Fehler 1).
Das Optimierungsproblem
Keiner der beiden Schritte stellt eine globale Energie zusammen und ruft einen benannten Solver auf, aber jeder ist die lokale Aktualisierungsregel eines Variationsproblems, und zusammen machen sie das Ziel explizit. Auf der beschnittenen Region $\Omega$ minimiert die Rekonstruktion vier gekoppelte Energien auf dem Modell.
1. Kanal-übergreifende affine Konsistenz. Wo ein gültiger Guide $g$ existiert, sollte jeder beschnittene Kanal eine affine Funktion des Guides sein: Der geführte Filter ist der exakte Minimierer von
Das Fitten auf den vollen Werten $u$ (nicht dem Detail) ist es, was den Minimierer den lokalen Mittelwert tragen lässt, sodass $E_{\text{affine}}$ Magnitude und Textur gemeinsam wiederherstellt.310 Dieser Term wird proportional zur quadrierten Korrelation $(R^2)^2$ des Fits beglaubigt; wo $R^2 \to 0$, wird der Kanal stattdessen an seine eigene Glattheit zweiter Ordnung gebunden (ein biharmonischer Term pro Kanal $\int_\Omega (\Delta u_c)^2, \mathrm{d}\Omega$), sodass das Ziel niemals eine Farblinie belohnt, die die Daten nicht stützen. Das Quadrieren schärft diesen Abwägung, sodass eine mittelmäßige Korrelation sich eher auf den glatten Rückfall stützt als auf eine unstetige Kanal-übergreifende Schätzung.
1b. Anisotroper Koeffiziententransport (die ausgelieferte Form von Term 1). Der affine Fit von Term 1 definiert seine Koeffizienten nur dort, wo ein Fenster genügend beglaubigte Daten enthält; über den Rest der ausgefressenen Zone ist das Modell selbst die Unbekannte. Die ausgelieferte Methode erweitert ihn, indem sie eine anisotrope Dirichlet-Energie auf den Koeffizientenebenen minimiert,
wobei die Anker die gesteuerten Fits von Term 1 sind (genügend beglaubigte Masse, $R^2 > 0.25$, beschränkte Steigungen) und $D$ der varianzadaptive Steuerungstensor von Schritt 3 ist, aufgebaut aus der gemessenen Guide-Struktur: gradientendominant auf einer sauberen Halo-Rampe (das Modell reist radial vom Rand nach innen), isophotendominant, wo eine harte Kante die Zone kreuzt (Farblinien dürfen sich nicht über eine Objektgrenze hinweg mischen). Ihre Euler–Lagrange-Gleichung $\operatorname{div}(D \, \nabla p) = 0$ ist die gesteuerte Füllung; mit $D = I$ reduziert sie sich auf die schlichte harmonische Füllung. Die Auswertung $\hat u_c = a\,u_{g_1} + b\,u_{g_2} + d$ gegen die gemessenen Guides schließt den Term: Die Energie transportiert das Modell, und die Daten stellen das Detail wieder her.
2. Magnitudenkrümmung (Rückfall). Wo kein Guide überlebt, geht das feine Detail verloren, aber die niederfrequente Form nicht: Sie sollte die umgebende Krümmung fortsetzen statt abzuflachen. Für einen teilweise beschnittenen Kanal ist dies der bereits oben aufgerufene biharmonische Term pro Kanal $\int_\Omega (\Delta u_c)^2, \mathrm{d}\Omega$. Für den vollständig beschnittenen Kern wird er einmal auf die summierte Luminanz $L_\text{sum} = R+G+B$ angewandt, eine gemeinsame Kuppel statt dreier divergierender:
verankert am wahren gültigen Rand des Kerns; ihre Euler–Lagrange-Gleichung $\Delta^2 L = 0$ ist die gekuppelte Füllung von oben.
3. Chrominanzglattheit (Rückfall). Wo kein Guide überlebt, sollten die rekonstruierten Verhältnisse $r = \text{RGB}/L_\text{sum}$ glatt sein und zum Rand passen, optional in Richtung Flachheit verschoben:
Ihre Euler–Lagrange-Gleichung ist die abgeschirmte Poisson-Gleichung, die die Diffusion integriert,4 und die Rekombination $\text{RGB} = L\cdot r$ schließt die gemeinsame Füllung.
Die Energien wirken auf komplementäre Pixel: der affine Term dort, wo ein Kanal überlebt (gewichtet durch seine Korrelation $R^2$), der biharmonische Term pro Kanal dort, wo er es nicht tut, und die gemeinsame Luminanzkuppel plus Chrominanzdiffusion nur in den vollständig beschnittenen Kernen — letztere minimiert unter einer Ungleichung: Das diffundierte Verhältnis eines beschnittenen Kanals kann im Verhältnisraum niemals unter seine Sättigungsuntergrenze fallen, $r_c \geq c_{0,c}/L_\text{sum}$, was den Chrominanzterm in ein Hindernisproblem verwandelt (die Mathematik steht im Chrominanz-Unterabschnitt). Die rekonstruierbare Menge selbst ist pro Kanal: $\Omega_c$ enthält die Pixel oberhalb der Clip-Schwelle — erweitert bis herab auf $0.9$ davon für Kanäle, deren Sensor-Rolloff eingesetzt hat (die Band-Übersteuerung von Schritt 2), wo die Untergrenze $c_{0,c}$ die knie-korrigierte Messung ist statt der gesättigten Ablesung. Jede Energie wird durch ihre eigene Stufe minimiert: der affine Term durch die geführten Fits (ein Fenster, dimensioniert auf den Rekonstruktionsradius der Region); der Transportterm durch die verankerte, gesteuerte Relaxation von Schritt 3; die Glattheitsterme durch ihre direkten linearen Lösungen. Es gibt bewusst keine nachträgliche Glättungsenergie, die auf die Ausgabe wirkt: Ein früheres Design bügelte Nähte im Nachhinein mit einem unsicherheitsgewichteten Regularisierer aus, und ihn außer Dienst zu stellen ist der Punkt — die Nähte werden nie erzeugt (siehe den Friedhof). Dies ist dieselbe Ingenieursphilosophie wie diffuse or sharpen: ein Stapel lokaler, physikalisch motivierter Aktualisierungsregeln, deren kombinierter Fixpunkt die Rekonstruktion ist, statt eines monolithischen inversen Problems.
Der Algorithmus
Alles geschieht auf dem RAW-Mosaik, in linearem szenenbezogenem (scene-referred) RGB, vor dem Entrasterung und in voller Auflösung. Die Methode baut jeden beschnittenen Kanal aus den Kanälen wieder auf, die überlebt haben (entlang der lokalen Farblinie, ihr proportional zu ihrer tatsächlichen Belastbarkeit vertrauend), und wo kein Kanal überlebt hat, baut sie eine gemeinsame Luminanzkuppel auf und trägt die umgebende Chrominanz nach innen.
Die Mosaik-Vorbereitung — bilineares Entrasterung zu einem wegwerfbaren RGB, lokale Kanalnormalisierung und die Clip-Maske pro Kanal — wird mit der Methode von 2021 geteilt und in deren Algorithmus-Abschnitt beschrieben, mit einer Ergänzung und drei Verfeinerungen. Die Ergänzung: Für die vollständig beschnittenen Kerne wird eine skalare Magnitude $L_\text{sum}$ (die summierte Luminanz $R+G+B$) von der Chrominanz $\text{RGB}/L_\text{sum}$ abgespalten — jeder Kanal geteilt durch die summierte Luminanz, eine beschränkte, helligkeitsfreie Beschreibung der Farbe, die dieser Artikel durchgängig unter diesem Namen verwendet — sodass die beiden mit unterschiedlichen Mitteln rekonstruiert werden können: eine Kuppel für die Magnitude, Diffusion für die Chrominanz. Die Verfeinerungen, jede auf ein gemessenes Rand-Artefakt zurückgeführt:
- Masken sind binär, durchgängig. Der Modus von 2021 verläuft (feathert) seine Maske; der Nachfolger hält jede Gültigkeits- und Compositing-Maske hart (sein einziges glattes Gewicht ist die verwaschene Übergabe des gemeinsamen Kerns, Schritt 7 des Algorithmus, der zwei Rekonstruktionen überblendet — er reklassifiziert niemals Messungen). Die Gültigkeitsmasken pro Kanal steuern jeden Fit und jede Auswertung, und ihr Feathering reklassifizierte randbeschnittene Photosites — deren RAW-Werte an der Detektionsschwelle liegen, unter Sensor-Rolloff nach unten verzerrt — als gültige Anker auf schrägen Konturen, was die Randrekonstruktion in Richtung Clip-Niveau zog (eine $\sim 10$ px durchhängende Rampe gegen die Ground Truth). Das Compositing-Gewicht ist ein harter Schalter: Gültige Photosites behalten ihre Messung exakt, beschnittene Photosites übernehmen die reine Rekonstruktion (ein gefeathertes Alpha änderte messbar nichts, sobald die beiden Korrekturen dieser Liste vorhanden sind — die Außerdienststellung ist im Friedhof dokumentiert).
- beschnittene RAW-Werte sind Untergrenzen, niemals Überblendungsziele. Auf beschnittenen Photosites ist die RAW-Ablesung eine untere Schranke, keine Messung: Das Composite schreibt $\max(\text{raw}, \text{reconstruction})$, niemals eine Überblendung in Richtung der verzerrten Ablesung (die alte gefeatherte Überblendung druckte an jeder Kontur einen V-förmigen Einbruch durch den RAW-Wert).
- Ränder spiegeln. Der Randring des bilinearen Gathers kopierte früher das zentrale Photosite in alle drei Kanäle und knüpfte alle drei Clip-Flags an den eigenen Kanal des Zentrums — korrumpierte Guides und gestrichelte Masken entlang der ersten und letzten Zeilen und Spalten, die die Randzeilen-Fits am Clip-Niveau verankerten. Die reflektierte Nachbarindexierung (das Bayer-Muster ist 2-periodisch, sodass Spiegeln die Farbe jedes Nachbarn bewahrt) stellt die innere Logik an den Rändern wieder her; diese Korrektur wird mit dem Modus von 2021 geteilt.
Jede Ground-Truth-Szene verbesserte sich bei beiden Metriken allein durch diese drei Verfeinerungen — der Fehler des Rolloff-Himmels sank um ein Drittel — weil die Randringe des Prüfstands genau dort liegen, wo verzerrte Anker früher eindrangen.
Das konzeptionelle Ziel der Rekonstruktion lässt sich in einem Satz formulieren: Wo immer mindestens ein Kanal überlebt hat, ist die Rekonstruktion ein Regressionsproblem, kein Inpainting-Problem: Die gültigen Kanäle sind gemessene Daten, an jedem Pixel der beschnittenen Zone vorhanden, die die wahre Struktur der Szene tragen. Die eine Designregel des Algorithmus, auf die harte Tour gelernt, lautet, dass kein Schritt zwischen Schätzern übergeben darf, die sich widersprechen (das Naht-Energie-Gesetz der theoretischen Erkenntnisse). Jede Stufe unten ist daher entweder von Konstruktion aus nahtfrei oder entzerrt die Daten, sodass die Schätzer übereinstimmen.
Das Schritt-für-Schritt-Verfahren, wie es in process_harmonic_bayer (und seinem X-Trans-Zwilling)
implementiert ist:
Die Zahlen im Diagramm beziehen sich auf die darunter im Detail beschriebenen Schritte.
flowchart TD
subgraph P ["once per image"]
direction TB
A["raw mosaic"] --> B["1 · interpolate
+ clip masks"]
B --> K["2 · knee inversion"]
K --> S["1 · depth map
+ segmentation"]
end
subgraph R ["for each clipped region"]
direction TB
CF["3 · colour-line fits
(magnitude + texture)"] --> HF["4 · fine-detail refit"]
HF --> SD["5–6 · floors
+ self-dome"]
SD --> JC["7 · all-clipped core"]
JC --> AN["8 · chrominance coherence"]
end
S --> CF
AN --> O["remosaic + composite"]
1. Detektion, Interpolation, Segmentierung. Das RAW-Farbfilter-Array-Mosaik wird bilinear interpoliert, mit Clip-Flags pro Kanal, die bei $0.995\,c$ für das Clip-Niveau $c$ gesetzt werden, und einer binären Gültigkeitsmaske pro Kanal; die euklidische Distanztransformation gibt dann jedem Pixel seine Tiefe $\delta$ innerhalb der beschnittenen Zone, und die Zusammenhangskomponenten-Segmentierung gruppiert die beschnittenen Pixel in Regionen, jede mit ihrem Distanztransformations-Rekonstruktionsradius.
2. Inversion des Sensor-Rolloffs (Knie). Reale Sensoren komprimieren die letzten paar Prozent unterhalb der Sättigung, sodass das Band nahe dem Clipping $[0.8\,c, 0.995\,c)$ Werte enthält, die nach unten verzerrt sind. (Das Band wird großzügig geschnitten: Auf Sensoren, die hart clippen statt auszulaufen, macht die No-Op-Garantie unten die zusätzliche Breite kostenlos.) Die Rekonstruktion extrapoliert unverzerrte Schätzungen über dieses Band, sodass die beiden an der Detektionskontur uneins sind: eine Naht, die keine Gewichtung entfernen kann. Die Korrektur entzerrt die Daten selbst: Eine gefensterte gemeinsame Regression sagt jeden Bandwert aus den voll beglaubigten Kanälen voraus, die (gemessenen, vorhergesagten) Paare werden in 24 Bins über das Band gepoolt, und der Median-Lift pro Bin wird nur akzeptiert, wenn er statistisch signifikant ist — Median über dem Doppelten seines Standardfehlers, ein $\approx 95\,\%$-Konfidenz-Gate, mit mindestens 100 Stimmen, sodass die Fehlerschätzung selbst stabil ist; 24 Bins sind so fein, wie das Band geschnitten werden kann und dabei jeder Bin besetzt bleibt:
wobei $k$ die unbekannte Kompression des Sensors ist, sodass $\hat{k}^{-1}$ die geschätzte Korrektur
ist — die Funktion, die einen gemessenen Wert $v$ aus dem Band nimmt und zurückgibt, was der Sensor
hätte aufzeichnen sollen. Die $v_i$ sind alle gemessenen Bandpixel, deren Wert in denselben Bin wie $v$
fällt; jedes $\hat v_i$ ist das, was die Farblinienregression für dieses Pixel vorhersagt, geurteilt
aus seinen voll beglaubigten benachbarten Kanälen. Ihre Differenz $\hat v_i - v_i$ ist die Stimme eines
Pixels darüber, um wie viel der Sensor auf diesem Niveau zu wenig aufgezeichnet hat, und die Korrektur
des Bins ist der Median seiner Stimmen — robust gegen die Ausreißer, denen ein Mittelwert folgen
würde. Die resultierende Kurve wird dann monoton und nur ansteigend gemacht. Auf hart beschnittenen
(unverzerrten) Daten ist jeder Bin-Median innerhalb des Rauschens null, sodass die Korrektur eine
No-Op-Garantie hat, bit-exakt auf den vier synthetischen Hart-Clip-Fällen verifiziert, während auf
pk1synth (der einen synthetischen Szene, die mit einem analytischen Sensor-Rolloff erzeugt wurde,
sodass ihre Ground Truth das reale Knie nachzeichnet) die blinde Schätzung die wahre Kurve bis auf einen
quadratischen Mittelwertfehler von $7\cdot10^{-4}$ auf dem grünen Kanal und $1.8\cdot10^{-3}$ auf dem
spärlicheren roten trifft:
Die Band-Übersteuerung. Der Lift stellt das Niveau des Bandes wieder her, aber eine Wertekarte kann eine Steigung nicht wiederherstellen, die der Sensor nie aufgezeichnet hat: Wo die Kompression das Band auf einen nahezu konstanten Wert abgeflacht hat, ist das angehobene Band ebenfalls nahezu konstant, und seine Verbindung mit der ansteigenden Rekonstruktion druckt unter Kantenvergrößerung eine feine Doppelkontur (das Band ist messbar $7$–$14\times$ flacher als die Ground Truth, eingeklammert von zwei Gradientenspitzen). Die Information ist jedoch nicht verloren — die Guides sind durch das Band hindurch unbeschnitten und tragen die wahre Steigung. Für jeden Kanal also, dessen Rolloff eingesetzt hat, erweitert die Detektion sich unterhalb der Schwelle in das tiefe Band hinein: Diese Pixel werden vom Farblinienmodell wie jedes beschnittene Pixel rekonstruiert, mit ihrer knie-angehobenen Messung als ihre Sättigungsuntergrenze pro Pixel, und die Fits verankern auf knie-korrigierten Daten unterhalb des Bandes. Die Untergrenze macht die Übersteuerung von Konstruktion aus konservativ — auf verrauschten realen Bildern übersteigt das Modell selten die angehobene Messung, und die Ausgabe bleibt pixelidentisch; auf der Rolloff-Prüfstandsszene, wo das Modell die Steigung wirklich kennt, sinkt der Zonenfehler beim Greifen der Übersteuerung um einen weiteren Faktor fünf (RMSE $0.012 \to 0.0025$ damals gemessen; $0.0053$ im ausgelieferten Build, nachdem die späteren Compositing-Runden ihre eigenen Anteile genommen haben) und das Konturgradientenprofil wird von der Ground Truth ununterscheidbar. Kanäle ohne gemessenen Rolloff behalten die schlichte Detektion: Auf hart clippenden Sensoren ist das Band vertrauenswürdige Daten und bleibt verankert.
3. Das Koeffizientenfeld. Für jeden beschnittenen Kanal $v$ mit Guides $u_1, u_2$ wird ein gefensterter gewichteter Fit nach der Methode der kleinsten Quadrate auf einer einzigen Skala $\sigma = \operatorname{clip}(r/6, 8, 64)$ berechnet (mit $r$ dem Rekonstruktionsradius der Region — die $\pm 3\sigma$-Unterstützung des Fensters überspannt dann den Radius, sodass selbst der Fit des tiefsten Pixels gültige Daten erreicht; die Untergrenze hält genügend Proben für einen stabilen Fit auf winzigen Regionen, und die Obergrenze beschränkt die Kosten riesiger), über die Pixel, wo alle drei Kanäle gültig sind:
wobei $x$ das Pixel ist, dessen lokales Modell aufgebaut wird, und $y$ über seine Nachbarn läuft. Das Fenster $G_\sigma(x-y)$ ist eine Gaußfunktion, die Nachbarn nach Distanz gewichtet (volles Gewicht in der Nähe, über etwa $\sigma$ Pixel abklingend), und $w(y)$ ist die Vertrauensmaske — eins auf Pixeln, wo alle drei Kanäle echte Messungen enthalten, null anderswo, sodass beschnittene Pixel niemals abstimmen. Die erste Zeile fragt an jedem $x$: Welche Steigungen $a, b$ auf den beiden Guides und welcher Versatz $d$ erklären den beschnittenen Kanal auf der beglaubigten Nachbarschaft am besten? Die zweite Zeile verwendet dann dieses lokale Modell: Die Schätzung $\hat v(x)$ liest die beiden Guides an $x$ selbst und bildet sie durch die gefittete Beziehung ab. In der Praxis wird die Minimierung nie pro Pixel ausgeführt — sie wird aus zehn verwaschenen Momentebenen (einer Beglaubigte-Masse-Zählung, drei Mittelwerten, sechs zweiten Momenten, gesammelt in drei Vier-Kanal-Verwischungen) über die $2\times2$-Normalgleichungen gelöst. Die Momente werden um den Regionsmittelwert jedes Kanals akkumuliert: In Gleitkomma-Arithmetik löscht sich die rohe Form $E[u^2] - E[u]^2$ auf glattem Inhalt katastrophal aus (der quadrierte Mittelwert überragt die Varianz), und die Division des Fits verstärkt die überlebenden Ziffern zu geräteabhängigem Steigungsrauschen — die Zentrierung entfernt die Auslöschung, und die Steigungen und $R^2$ sind unter der Verschiebung invariant, während der Achsenabschnitt gleich nach dem Fit rückverschoben wird. Das System wird mit einer relativen Tikhonov-(Ridge-)Dämpfung $\lambda = 10^{-3}\,(\operatorname{var} u_1 + \operatorname{var} u_2)/2$ gelöst, die mit dem Signal skaliert, statt schwache-aber-echte Steigungen aufzufressen. Die $10^{-3}$ sind der kleinste Faktor, der entartete Fenster auf dem Prüfstand stabilisierte — alles Größere beginnt, echte Steigungen abzuflachen.
Die Neuerung ist, was als Nächstes geschieht: Statt jedes Pixel mit welchem Fit auch immer sein eigenes Fenster erreichen konnte auszuwerten (die Art der Leiter), werden die Koeffizientenebenen selbst über die beschnittene Zone diffundiert, gesteuert durch die gemessene Guide-Struktur, und erst dann gegen die gemessenen Guides ausgewertet. Koeffizienten sind von Natur aus glatt, wo Werte es nicht sind: Sie zu diffundieren transportiert das Modell in die Zone, und die Auswertung stellt die volle lokale Struktur wieder her, die von den gültigen Kanälen getragen wird. Keine Skalen, keine Tiefen-Gates, keine Level-Set-Schreibvorgänge (keine getrennt gestanzten Ringe gleicher Tiefe) — keine Nähte, von Konstruktion aus. Dieser Transport des Modells statt des Inhalts ist die am besten übertragbare Idee des Artikels, und wie er sich in der Art von der eigenen Koeffizientenverwischung des geführten Filters unterscheidet, wird in Drei Ergebnisse, die wir für allgemein halten dargelegt. Ein Pixel qualifiziert sich nur dann als Diffusions-Anker, wenn sein Fenster genügend beglaubigte Masse enthielt und sein Fit vernünftig ist: Das $R^2$ des Fits, das Bestimmtheitsmaß, ist der Anteil der lokalen Varianz des Kanals, den die Farblinie erklärt (1 bedeutet, die Guides sagen den Kanal perfekt voraus, 0 bedeutet überhaupt nicht), und Anker erfordern $R^2 > 0.25$ mit beschränkten Steigungen. Beide Gates sind aus Messungen kalibriert, nicht aus Geschmack: Inhalt mit überhaupt keiner Farblinie erreicht immer noch $R^2 \approx 0.25$–$0.6$ (gegenüber $\approx 0.9$, wo die Farblinie echt ist), sodass das Gate nur Fits ablehnt, die schlechter als reine Dekorrelation sind — numerische Zufälle, keine schwachen Modelle; und physikalische Farbliniensteigungen sind durch die Sättigungsverhältnisse der Kanäle beschränkt (unter $4$ auf jeder gemessenen Kamera), sodass die Schranke $|a| < 64$ eine Größenordnung über allem Physikalischen liegt, und nur entartete Fenster mit nahezu null Varianz — deren explodierende Steigungen die Diffusionsgrenze vergiften würden — sie je auslösen. Die Diffusion ist eine grob-zu-fein Jacobi-Füllung: Jede Unbekannte wird wiederholt durch den Mittelwert ersetzt, den ihre Nachbarn implizieren. Drei Terme tragen das gesamte Schema:
- Zelle. Die Füllung läuft nicht pro Pixel. Die Koeffizientenebenen leben auf einem groben Gitter mit Rasterweite $\sigma/4$ (auf höchstens $8$ px begrenzt), und eine Zelle ist ein Knoten dieses Gitters — ein $\sigma/4$-großer Block von Pixeln. Die Koeffizienten kommen aus $\sigma$-breiten Fit-Fenstern, sodass vier Zellen pro $\sigma$ sie überabtasten, und die Rasterweiten-Begrenzung beschränkt den endgültigen bilinearen Hochskalierungsfehler.
- Anker. Eine Zelle, deren Fit-Fenster die obigen Vertrauens-Gates bestanden hat — sie enthält einen Koeffizienten, der tatsächlich auf gültigen Daten gemessen wurde.
- Fixiert. Die Durchläufe behandeln Anker als feste Randdaten und schreiben nur je die unbekannten Zellen zwischen ihnen um.
Diese Form ist wegen der Robustheit gewählt. Ein Gleitkomma-Konjugierte-Gradienten auf dem nahezu singulären rein-harmonischen System divergiert stochastisch, wenn die Zone den Regionsrand erreicht. Jacobi mit fixierten Ankern kann das nicht: Jede Aktualisierung ist ein Mittelwert von Nachbarn, sodass die Relaxation dem Maximumprinzip gehorcht — keine Unbekannte kann je den Bereich der Ankerwerte verlassen.
Die Konvergenz kommt aus der Tiefe der Pyramide, nicht aus der Anzahl der Durchläufe. Die gröbste Ebene startet aus einem flachen Ankermittelwert — dem am weitesten von der Lösung entfernten möglichen Zustand — und Jacobis langsamster Fehlermodus auf einem $N$ Zellen breiten Loch klingt in $\mathcal{O}(N^2)$ Durchläufen ab. Also halbiert die Pyramide immer weiter, bis die lange Seite des gröbsten Gitters höchstens $8$ Zellen beträgt ($8^2 = 64$ Durchläufe zum Relaxieren, bequem innerhalb des Budgets), und jede Ebene läuft dann dieselben flachen $100$ Durchläufe — die feineren Ebenen korrigieren nur den lokalen Interpolationsfehler. Eine flachere Pyramide mit fester Anzahl beschnitt die Füllung auf tiefen Löchern messbar — die Zahlen stehen in den allgemeinen Ergebnissen unten.
Note
Dies ist die eine verbleibende Pyramide der Methode, und sie gehört zur Füllung — dem Transport bereits gefitteter Koeffizienten. Sie hat nichts mit den Fit-Fenstern zu tun, die einen einzigen aus dem Radius abgeleiteten $\sigma$ pro Region verwenden (mehrskalige Fenster existieren nur innerhalb des Knie-Schätzers), und sie ist nicht die außer Dienst gestellte spurenformige Chroma-Pyramide des Vollclip-Kerns, die die divergenzformige direkte Lösung ersetzte und die nur noch als Rückfall für Kerne über $2^{14}$ Unbekannten überlebt.Der Transport selbst ist ebenfalls nicht gleichförmig: Er wird durch die gemessene Guide-Struktur gesteuert. Eine Steuerungsebene $L_\text{mean}$ — der Mittelwert der gültigen Kanäle, wo immer mindestens einer überlebt, der flache Plateau-Mittelwert im Vollclip-Kern (wo der Tensor dann zur Identität entartet); dies ist eine andere Luminanz als die summierte Magnitude $L_\text{sum}$, die die Kuppel und die Verhältnisse verwenden — wird auf jede Pyramidenebene heruntergerechnet, und die Nachbarmittelwerte werden durch den anisotropen Tensor gewichtet
wobei $g$ die Einheitsgradientenrichtung von $L_\text{mean}$ ist (bergauf), $t$ die Einheits-Isophotenrichtung und $\langle\lVert\nabla L_\text{mean}\rVert\rangle$ die über die Region gemittelte Gradientenmagnitude — die Normalisierung, die die Dämpfung belichtungsunabhängig macht — (entlang der Niveaulinien), und $c_2$ dieselbe Kanten-kreuzende Dämpfung wie der Chrominanz-Durchlauf von Schritt 8. Den Gradienten durch seinen eigenen regionalen Mittelwert zu normalisieren macht diese Dämpfung skalenfrei — nur Gradienten deutlich über dem Durchschnitt des Halos werden als Grenzen gelesen, wobei die $4$ festlegt, wie weich die Lesung ist. Das Überblendungsgewicht $m \in [0, 1]$ ist die Kantenwahrscheinlichkeit, gemessen aus der trendkorrigierten gefensterten Varianz von $L_\text{mean}$:
wobei $\operatorname{var}_w$ und $\bar L_\text{mean}$ die gefensterte Varianz und der Mittelwert der Steuerungsebene sind, und der Term $\tfrac{4}{3}\lVert\nabla L_\text{mean}\rVert^2$ die Varianz subtrahiert, die die lokale Rampe erklärt: Eine reine Rampe der Steigung $\nabla L_\text{mean}$, gesehen durch ein Fenster der räumlichen Varianz $\sigma_w^2$, hat die Intensitätsvarianz $\sigma_w^2 \lVert\nabla L_\text{mean}\rVert^2$, und das Fenster hier (zwei $3\times3$-Boxdurchläufe) hat $\sigma_w^2 = 2 \cdot \tfrac{2}{3} = \tfrac{4}{3}$ pro Achse. Ein glatter Halo-Gradient, so steil er auch sei, hinterlässt daher kein Residuum, während eine harte Kante Varianz hinterlässt, die keine Rampe erklären kann. Die Schwelle $k$ — der relative Kontrast, oberhalb dessen Resttextur als Grenze gelesen wird — ist die eine Konstante des Transports, die nicht hergeleitet werden konnte, also wurde sie durch einen empirischen Feindurchlauf auf den sechs Ground-Truth-Szenen kalibriert: Jede Szene bleibt über den gesamten Bereich $k \in [0.14, 0.25]$ auf oder unter dem isotropen Fehler (das Design ist nicht empfindlich dagegen), und $k = 0.15$ ist der Wert, der jede Szene gleichzeitig verbessert und den Okklusionssieg mit Vorsprung erringt. Die beiden Grenzwerte von $m$ lesen sich natürlich. Auf einer sauberen Halo-Rampe ($m \to 0$), $D \to g\,g^{\top} + c_2\,t\,t^{\top}$: Das Modell reist radial, entlang der Helligkeitsrampe vom Rand nach innen, wo seine Information tatsächlich lebt. Wo eine harte Kante die ausgefressene Zone kreuzt ($m \to 1$), $D \to t\,t^{\top} + c_2\,g\,g^{\top}$ mit $c_2$ klein: Der Transport läuft entlang der Grenze und weigert sich, sie zu kreuzen — eine Kante innerhalb der Zone bedeutet, dass der Inhalt jenseits einer anderen Farblinie folgt, und die beiden Modelle darüber hinweg zu mischen ist genau der Okklusionsfehler, den der Friedhof dokumentiert. Die Diskretisierung verwendet den nichtnegativitätserhaltenden Stencil, der mit der Diffusion von Schritt 8 geteilt wird (alle acht Nachbargewichte $\geq 0$), sodass die gesteuerte Füllung eine konvexe Kombination ihrer Anker bleibt: Das Maximumprinzip überlebt die Steuerung. Eine $10^{-4}$-Gewichtsuntergrenze hält jede Zelle verbunden, wo der Tensor auf nahezu null kollabiert; vier Größenordnungen unter den arbeitenden Gewichten konkurriert sie nie mit der Steuerung. Pixel mit einem einzigen überlebenden Guide erhalten dieselbe Behandlung mit einem Ein-Guide-Fit.
Eine Subtilität der Reihenfolge vervollständigt den Schritt. Der tiefste Kanal — derjenige mit den meisten beschnittenen Photosites, dessen Zone die Kerne enthält, in denen mehrere Kanäle gleichzeitig ausgefressen sind — wird nicht sofort ausgewertet: Seine diffundierten Koeffizienten werden zurückgelegt, und die Auswertung läuft zuletzt, nachdem die anderen beschnittenen Kanäle rekonstruiert wurden, sodass jeder Guide, den er liest, eine stetige Fläche ist. Ihn gegen einen Guide auszuwerten, der von gemessenen Werten auf ein Clip-Plateau springt, würde die eigene Clip-Kontur dieses Guides als sichtbaren Bogen ins Ergebnis drucken. Tief im Inneren des Kerns, wo diese Guides selbst Rekonstruktionen sind (sodass jeder Sprung Fehler aufsummiert), blendet die Schätzung durch ein glattes Gewicht zum direkten Ein-Guide-Fit zurück — glattes Gewicht mal glatte Felder lässt kein Level-Set zum Drucken übrig.
Die Fit-Qualität $R^2$ wird neben $(a, b, d)$ als vierte Ebene diffundiert, auf der breiteren, nur auf Masse basierenden Ankermenge (sie bleibt selbst dort beschränkt, wo der Fit es nicht tut).
4. Hybrides Laplace-Band-Guiding der hohen Frequenzen. Der Vollsignal-Fit überträgt die feine Textur der Guides mit den durch die Gesamtkovarianz implizierten Verstärkungen; wo die Farblinie schwach ist, gehört diese Textur nicht auf den rekonstruierten Kanal. Die Schätzung wird bei $\sigma/4$ aufgeteilt, und ihr Detailband wird aus zwei Kandidatenquellen neu aufgebaut: dem gedämpften Transfer (die Vollsignal-Hochfrequenzen skaliert durch das diffundierte $R^2$) und einer dedizierten Detailband-Farblinie (die Namensgeberin der Methode von 2021, zurückgekehrt), gefittet auf den Hochfrequenzebenen mit $R^2$-geschrumpften Verstärkungen (auf einem Band mit Mittelwert null ist die Schrumpfung der korrekte Schätzer: Es gibt keine Magnitude zu verlieren, nur Rauschen, das nicht gedruckt werden soll). Die beiden werden durch quadratische Minimalenergie-Odds überblendet,
was keinen Inhaltsdiskriminator benötigt: Eine fehlzündende Mischfenster-Verstärkung an einer Objektkante zeigt sich als lokale Spitze hochfrequenter Energie, sodass der Fehler sich selbst detektiert und der gedämpfte Pfad genau dort übernimmt. Dies ist es, was das letzte Residuum der Rolloff-Szene entfernt (ihr Überschusskanten-Score fällt von 1.48 auf 0.94 gegen eine Ground-Truth-Untergrenze von 0.69: Das dekomprimierte Bandrauschen druckt nicht mehr — die Randverzerrungs-Korrekturen des finalen Builds bringen ihn auf 0.74, und die Band-Übersteuerung von Schritt 2 auf 0.64, die Ergebnistabelle), während es die texturierten Fälle verbessert, an denen der reine Detailband-Fit früher zerbrach.
5. Weiche Sättigungsuntergrenze. Die physikalische Untergrenze (ein beschnittener Kanal ist mindestens seine gesättigte Ablesung $c_0$) wird als gerundete Bedingung angewandt, $\tfrac{1}{2}\big(e + c_0 + \sqrt{(e - c_0)^2 + (0.02\,c_0)^2}\,\big)$: Das harte $\max(e, c_0)$ druckt die bindende Kontur als Kante, wo immer eine schwache Vorhersage um die Sättigung oszilliert. Die Übergangsbreite $0.02\,c_0$ ist zwei Prozent des gesättigten Wertes — unterhalb von allem Sichtbaren, aber breit genug, dass der Gradient der Bedingung nie springt.
6. Tiefen-gesteuerte, farbton-gekoppelte Selbstkuppel. Wo das Modell zweifelhaft ist und das Pixel flach ist, übernimmt eine glatte Selbstfortsetzung, farbton-gekoppelt aufgebaut (die Kanäle sind durch eine gemeinsame Chrominanz gekoppelt, sodass der wahrgenommene Farbton nicht driften kann): eine gemeinsame biharmonische Luminanzkuppel mal einer harmonisch gefüllten Chrominanz, niemals drei unabhängige Kanäle, sodass der Rückfall den Farbton nicht in Richtung Grün/Magenta aufspalten kann (der Fehler, der seinen kanalweisen Vorläufer deaktiviert hielt). Das Übergabegewicht ist:
wobei $\delta$ die Tiefe des Pixels innerhalb der beschnittenen Zone ist (seine Distanz zum nächsten gültigen Pixel), $\sigma$ die Fit-Skala und $S$ ein Smoothstep, eine weiche Rampe von 0 auf 1 zwischen den beiden Schwellen, die hier die Fit-Qualität unter $0.4$ auf „zweifelhaft" und über $0.85$ auf „beglaubigt" abbildet. Die Bandkanten und die $1.5\sigma$-Tiefenskala wurden auf dem Ground-Truth-Prüfstand abgestimmt; die Tiefenskala bindet die Reichweite der Kuppel an die eigene Reichweite des Fit-Fensters, sodass die Übergabe dort geschieht, wo dem Fit die Proben wirklich ausgehen. Die beiden Faktoren beantworten zwei verschiedene Fragen: $R^2$ fragt ist die Farblinie hier echt, und die Tiefe fragt ist die Kuppel hier vertrauenswürdig (biharmonische Extrapolation ist nahe dem Rand exzellent und verschlechtert sich mit der Distanz). Die Tiefe ist das einzige Signal, das wir gefunden haben, dessen Verteilungen korrelierte tiefe Zonen tatsächlich von dekorreliertem flachem Inhalt trennen (siehe den Friedhof); tiefe Innenbereiche bleiben immer auf dem Koeffizientenfeld.
7. Gemeinsamer Kern, gefeathert. Vollständig beschnittene Pixel haben keine Guides: Die gemeinsame biharmonische Luminanzkuppel und die abgeschirmte Rand-Chrominanzdiffusion des Rebuilds rekonstruieren sie, unverändert — aber das Composite wird jetzt über eine verwaschene Vollclip-Maske gefeathert, statt durch eine harte geschrieben. Die Kuppel und die diffundierte Chrominanz sind beide über die Lochgrenze hinaus gültig, sodass ihr Überblenden in die beschnittenen Kanäle des umgebenden Rings im Raum stetig ist, ohne Kosten für den Kern selbst.
8. Chrominance coherence. The structure-steered chrominance of the all-clip core is now solved directly. The unknown $u$ is each chrominance plane in turn ; the equation is $\mathrm{div}(D\,\nabla u) = 0$, the steady state of the anisotropic diffusion of the theory section and, equivalently, the exact minimizer of its weighted smoothness energy $\int_\Omega \nabla u^\top D\,\nabla u\,\mathrm{d}\Omega$, with the coefficient-field results as Dirichlet anchors, fixed boundary values the solve must honour. The tensor is built from the recovered luminance (the reconstruction’s own output, smoothed by two box-blur passes) : with $g$ the unit gradient of that smoothed luminance and $t = g^\perp$ the isophote direction,
das heißt: Leitfähigkeit eins entlang der Isophoten, exponentiell gedämpft quer dazu, wobei die Dämpfung durch die eigene mittlere Gradientenmagnitude des Bildes $\langle \lVert \nabla L_\text{sum} \rVert \rangle$ normalisiert wird, sodass die Steuerung nicht von der Belichtung abhängt (dieser Tensor liest die wiederhergestellte summierte Luminanz — die Zwillingsform der Koeffizientenfüllung liest $L_\text{mean}$). Die Diskretisierung ist Weickerts nichtnegativitätserhaltender Stencil, eine symmetrische positiv-definite M-Matrix, sodass das diskrete Maximumprinzip von Konstruktion aus gilt: Die diffundierten Verhältnisse können die Rand-Chrominanz niemals übersteigen, was der frühere explizite Fluss konnte. Die dünnbesetzte Cholesky-Zerlegung faktorisiert den Kern einmal und substituiert die drei Kanäle rück. (Ein Solver-Vergleich steht hinter dieser Wahl: siehe den Friedhof für das lehrreiche Scheitern der anderen exakten Formulierung.) Das finale Remosaicing setzt die Ausgabe aus dem knie-korrigierten CFA zusammen, sodass das entzerrte Band die Datei erreicht, nicht nur die Fits.
Die Update-Regeln
Das Optimierungsproblem formuliert, was die Rekonstruktion minimiert, und der Algorithmus erzählt seine Stufen; die Diskussion unten analysiert das Design — was die Parameter darstellen, wie sie abgestimmt wurden, wie sich die Entscheidungen zur etablierten Theorie verhalten. Was ein Implementierer, der von Grund auf beginnt, braucht, sind die tatsächlichen Signalaktualisierungen: welche Gleichung welche Ebene schreibt, in welcher Reihenfolge. Hier ist der vollständige Katalog, in Ausführungsreihenfolge, für eine Region. Ebenen: Schätzungen pro Kanal $u_c$ (initialisiert auf die bilineare Interpolation des gemessenen Mosaiks, knie-korrigiert), binäre Gültigkeiten $v_c$, Untergrenzen pro Pixel $c_{0,c}$ (die knie-korrigierte Messung jedes rekonstruierbaren Pixels), summierte Luminanz $L_\text{sum} = \sum_c u_c$ und Verhältnisse $r_c = u_c / L_\text{sum}$ (die Steuerungsebene $L_\text{mean}$ von Regel 1 ist der Gültige-Kanal-Mittelwert, eine separate Größe).
1. Fitte und transportiere die Farblinie (Schritte 2–3 des Algorithmus). Der Fit ist auf den vollen Pixelwerten — niemals dem mittelwertsubtrahierten Detail — und verwendet nur die Proben, wo die beteiligten Kanäle gültig sind. In der Ein-Guide-Form, über das Gaußfenster $\omega$:
mit $\varepsilon$ einer relativen Tikhonov-Dämpfung, die die Division dort absichert, wo der Guide flach ist; die Zwei-Guide-Form löst die analogen $2\times2$-Normalgleichungen für $(a, b, d)$ aus den zehn Gauß-verwaschenen Momentebenen. Die Steigung wird nicht vorzeichenbegrenzt (eine frühe Leiter-Revision begrenzte sie; die ausgelieferten Fits werden stattdessen durch die Anker-Gates $R^2 > 0.25$ und $|a| < 64$ abgesichert). Zwei weitere Gates, die ein Implementierer nicht überspringen darf: Die Fit-Fenster werden durch eine weiche Luminanzaffinität $\min(L_\text{sum} / 0.35\,\bar L_\text{sum}^{\,\text{rim}}, 1)^2$ gewichtet — Proben, die viel dunkler als der Rand sind (Verdecker), stimmen kaum ab — und ein Fenster verankert den Transport nur dort, wo seine gewichtete Masse sowohl eine absolute Untergrenze (0.05) als auch ein Viertel seiner ungewichteten gültigen Masse übersteigt, sodass verdeckte Fenster sich auf die Füllung verlassen, statt den Verdecker zu fitten. Weil der Fit auf Werten ist, trägt der Achsenabschnitt den lokalen Mittelwert der Farbe: Die Vorhersage erbt das Niveau der umgebenden gültigen Daten, nicht nur ihre Textur, sodass dort, wo der Guide weiter in das Licht ansteigt, die Schätzung ihm folgt — über den Clip-Wert hinaus. In der Praxis wird der Fit nie pro Pixel ausgeführt: Die Momente sind Gauß-verwaschene Produktebenen, gegen die Gleitkomma-Auslöschung auf den gültigen Mittelwerten pro Region zentriert.
Note
Nur aus den gültigen Proben zu fitten ist wesentlich. Die beschnittenen Proben sind am Weißpunkt fixiert; sie einzubeziehen würde die beobachtete Steigung abflachen, und das Modell würde den beschnittenen Wert reproduzieren, statt über ihn hinaus zu extrapolieren. Dies ist die eine Subtilität, die eine funktionierende Rekonstruktion von einer trennt, die das Clipping bloß neu ausmalt.Steuere die Anker ($R^2 > 0.25$, beschränkte Steigungen, beglaubigte Masse), diffundiere dann jede Koeffizientenebene durch verankerte Jacobi-Durchläufe auf dem groben Gitter — die Aktualisierung eines Durchlaufs an einer Nicht-Anker-Zelle $i$, mit den acht Weickert-Gewichten $w_{ik}$ des Tensors $D$:
Anker fest gehalten, 100 Durchläufe pro Pyramidenebene, gröbste Ebene mit dem Ankermittelwert geseedet und jede feinere Ebene durch bilineare Hochskalierung der gröberen Lösung geseedet; dieselbe Aktualisierung für $b$, $d$ und $R^2$. Dann werte das transportierte Modell gegen die gemessenen Guides aus, an jedem Pixel, wo das Ziel beschnitten und beide Guides gültig sind:
Pixel mit einem einzigen gültigen Guide übernehmen dieselbe Aktualisierung aus dem Ein-Guide-Fit $u_c \leftarrow a\, u_g + d$. Die Auswertung des tiefsten Kanals wird aufgeschoben, bis die anderen beschnittenen Kanäle wiederaufgebaut sind, sodass seine Guides stetige Flächen sind.
2. Baue die hohen Frequenzen wieder auf (Schritt 4). Teile $u_{g}$ in niedrige Frequenz $\bar u_g$ (Gauß bei $\sigma/4$, bei 2 px untergrenzt — die Momente verwenden das $\sigma$ des Fits, die Bandaufteilung nicht) und Detail $u_g - \bar u_g$ auf; bilde die beiden Kandidaten — den Guide-Transfer $h_g = a\,(u_{g_1} - \bar u_{g_1}) + b\,(u_{g_2} - \bar u_{g_2})$ und das gedämpfte Selbstdetail $h_d = R^2 (u_c - \bar u_c)$ — und überblende sie durch quadratische Minimalenergie-Odds auf ihren lokalen (Gauß-verwaschenen) Energien $e_g, e_d$, genau wie Schritt 4 es angibt (ein harter Schalter würde eine Übergabe-Naht wieder einführen):
3. Weiche Sättigungsuntergrenze (Schritt 5), überall dort, wo ein Kanal rekonstruierbar ist, mit $w = 0.02\, c_{0,c}$:
4. Tiefen-gesteuerte Selbstkuppel (Schritt 6). Löse eine gemeinsame biharmonische Fortsetzung der Luminanz über das Loch, $\Delta^2 L_b = 0$ mit $L_b$ am Rand verankert (direkte dünnbesetzte Cholesky-Zerlegung auf dem 13-Punkte-diskreten Bilaplace-Operator, grobes Gitter — derselbe Solver, den der Implementierungsabschnitt dokumentiert), spalte seine Chrominanz vom Rand ab ($\bar r_c$, harmonische Füllung) und überblende durch den Kuppelanteil $f$:
mit $\delta$ der Tiefe des Pixels innerhalb der beschnittenen Zone (seine Distanz zum nächsten gültigen Pixel — die einzige Bedeutung, die $\delta$ in diesem Artikel trägt).
5. Vollständig beschnittener Kern (Schritte 7–8), auf Pixeln, wo kein Kanal überlebt hat. Magnitude: die biharmonische Kuppel $\Delta^2 L = 0$, verankert auf dem (bereits rekonstruierten) Kreisring. Chrominanz: zuerst die abgeschirmte-Poisson-Randfüllung pro Kanal, $(\Delta - \lambda)\, r_c = -\lambda\, \bar c_c$ mit $\bar c_c$ der mittleren gültigen Chromatizität der aufgefüllten Region und $\lambda$ der Flachfarb-Reaktion (direkte dünnbesetzte Lösung, geteilte Faktorisierung); dann der strukturgesteuerte Durchlauf. Seine primäre Form ist die divergenzformige exakte Lösung von Schritt 8 (kantengewichteter 8-Nachbar-Graph-Laplace-Operator, direkte dünnbesetzte Faktorisierung); Kerne über $2^{14}$ Unbekannten nehmen stattdessen die explizite spurenformige Pyramide — Schritte unter dem Hindernis, 240-mal pro Ebene iteriert:
gefolgt von einer 60-Durchlauf-projizierten Politur in voller Auflösung (aktivitäts-gesteuert: Sie läuft nur dort, wo tatsächlich ein Pixel auf seiner Untergrenze sitzt). Zusammensetzung, pro Pixel des Vollclip-Kerns — die einzigen Pixel, die dieser Durchlauf schreibt; teilweise beschnittene Pixel wurden durch die Regeln 1–4 erledigt und wirken als seine Anker:
weich-untergrenzt wie in Regel 3. (Der Code trägt auch einen Magnitudentransfer-Zweig für teilweise gültige Pixel, ein Überbleibsel aus der Leiter-Ära, das die Ankerkonstruktion unerreichbar macht — hier dokumentiert, damit niemand es abschreibt.)
6. Korn und Composite. Füge das Poissonsche Korn des nächsten Unterabschnitts dort hinzu, wo angefordert, schreibe dann durch den harten Schalter zurück: Rekonstruierbare Photosites übernehmen $\max(\text{raw}, u_c)$, gültige Photosites behalten ihre Messung unangetastet.
Alles andere in der Pipeline — die Knieschätzung, die Segmentierung, das Auffüllen — bereitet Eingaben für diese sechs Aktualisierungen vor; nichts anderes schreibt ein Pixel.
Diskussion
Die Operatoren, die der Algorithmus zusammensetzt, sind nicht willkürlich: Jeder ist der Schätzer, den sein Energieterm vorschreibt, und jeder trägt messbare Eigenschaften, auf die sich das Design stützt. Dieser Unterabschnitt leitet sie her und schließt mit der Parameterstudie, die die gesamte Methode dimensioniert — wie weit eine Rekonstruktion reichen sollte.
Dem Guide vertrauen
Die Farblinien-Anleihe ist nur so gut wie die Annahme dahinter: dass der beschnittene Kanal und sein Guide lokal affin verwandt sind. Auf einer natürlichen Oberfläche sind sie es; auf pathologischem Inhalt (unabhängige Gradienten pro Kanal oder eine Grenze zwischen zwei verschiedenfarbigen Materialien) sind sie es nicht, und die Anleihe zu erzwingen würde Struktur einmalen, die nicht dazugehört. Der Fit selbst berichtet, wie weit man ihm vertrauen kann: $R^2$ (definiert mit dem Fit, in den Aktualisierungsregeln) ist der Anteil der lokalen Varianz des Kanals, den die Farblinie erklärt — $1$, wo das Modell hält, $0$, wo die Anleihe bedeutungslos ist.
Die Methode wechselt also nie zwischen Kanal-übergreifender und Einzelkanal-Füllung — sie überblendet sie nach Konfidenz, indem sie darauf zurückfällt, den eigenen Gradienten des beschnittenen Kanals nach innen zu verlängern (kanalweises biharmonisches Inpainting, verankert auf dem wahren gültigen Rand dieses Kanals), sobald die Farblinie schwächer wird. Das Überblendungsgewicht ist die quadrierte Konfidenz $W_e = (R^2)^2$, und der Exponent ist eine gemessene Wahl, kein Geschmack. Über die beschnittenen Pixel trennt $R^2$ die beiden Regime nur mit einem weichen Rand: Es beträgt im Mittel $\approx 0.9$ auf naturähnlichem Inhalt, $\approx 0.65$ auf dekorreliertem Inhalt, und die beiden Verteilungen überlappen sich um $\sim15\%$ — und keine billigere Statistik macht es besser (skalen-übergreifende Steigungsstabilität und Guide-übergreifende Übereinstimmung wurden beide gemessen und trennen schlechter, sodass $R^2$ die ehrliche Obergrenze ist). Linear verwendet, würde der dekorrelierte Fall immer noch $\sim65\%$ einer Kanal-übergreifenden Schätzung übernehmen, die sowohl falsch als auch — weil die harte Guide-Auswahl dort umschlägt — unstetig ist. Das Quadrieren zieht die Regime auseinander: $0.9^2 \approx 0.81$ bewegt den vertrauenswürdigen Fall kaum, während $0.65^2 \approx 0.42$ den nicht vertrauenswürdigen halbiert, sodass sich dekorrelierte Pixel auf die glatte Füllung des eigenen Gradienten stützen. Weil der Rand weich ist, überlebt jedoch eine schwache Naht auf dem widrigsten Inhalt: Das Quadrieren kann eine Unstetigkeit in der Größe, die es gewichtet, nicht vollständig verbergen, und dieses Residuum ist das, wofür die Nie-Nähte-erzeugen-Designregel existiert (siehe den Friedhof).
Wo kein Kanal überlebt, gibt es keinen Guide und kein $R^2$ zum Abwägen, sodass die Rekonstruktion an den gemeinsamen Kern des nächsten Abschnitts übergibt. Die Überblendung wird also durch Guide-Gültigkeit gesteuert und durch quadrierte Korrelation gewichtet, nicht durch eine harte Zählung beschnittener Kanäle: Ein Mechanismus überspannt den gesamten Bereich von einem Ein-Kanal-Clip (überwiegend Kanal-übergreifend) über einen Zwei-Kanal-Clip (der überlebende Kanal führt) bis zu einem vollständig ausgefressenen Kern (die gemeinsame Kuppel). Dies ist es, was die Methode anmutig degradieren lässt, wenn die Kanal-übergreifende Korrelation fällt: Auf den naturähnlichen Testbildern dominiert der Kanal-übergreifende Term, auf den widrigen zufälligen Gradienten übernimmt die Selbstverlängerung, und die Rekonstruktion fabriziert nie eine Farblinie, die nicht da ist. Es ist die Korrelation, nicht die Anzahl der Überlebenden, die entscheidet, ob einem Guide vertraut werden kann — ein Zwei-Überlebenden-Pixel auf dekorreliertem Inhalt ist nicht besser geführt als ein Ein-Überlebenden-Pixel auf einer sauberen Farblinie.
Löcher ohne Überlebenden füllen
Wo jeder Kanal clippt, kann keine Farblinie gefittet werden: Das feine Detail des Lichts und sein exakter Gipfel sind wirklich verloren. Aber zwei Dinge können immer noch aus der Umgebung gerettet werden, sofern sie gemeinsam rekonstruiert werden: die niederfrequente Magnituden-Krümmung des Lochs und seine Chrominanz.
Der naive Zug ist, jeden Kanal unabhängig zu kuppeln: das kanalweise biharmonische Selbst-Inpainting des Konfidenzrückfalls, jetzt ungewichtet, auf allen drei Kanälen laufen zu lassen. Es scheitert auf lehrreiche Weise. Weil die Kanäle bei verschiedenen Radien clippen (jeder hat sein eigenes Weißniveau, und ein nahezu neutrales Licht kreuzt sie der Reihe nach), wird jeder Kanal von einem Rand in einer anderen Distanz vom Zentrum gekuppelt, und die drei Kuppeln erreichen verschiedene Höhen. Der letzte Kanal, der clippt, sättigt genau an seinem Rand flach, sodass er fast keine nach innen gerichtete Steigung trägt und seine Kuppel kaum ansteigt, während der erste Kanal, der clippt, über einen weiten Radius gekuppelt wird und steil ansteigt. Der Kern driftet daher farbton-daneben: eine neutrale Sonne, über einem orangen Himmel ausgefressen, rekonstruiert als gelbe Scheibe, weil Blau (der letzte, der hier clippt) kollabiert, während Rot übererholt. Drei korrekt aussehende 1-D-Kuppeln, eine falsche Farbe.
Die Korrektur besteht darin, zu trennen, was geteilt wird, von dem, was es nicht wird. Magnitude ist allen drei Kanälen gemeinsam (sie sind alle hell, weil dasselbe Licht sie überlaufen hat), sodass sie einmal rekonstruiert wird, als eine einzige Kuppel. Chrominanz variiert glatt und wird vom Rand nach innen getragen. Konkret: Spalte die summierte Luminanz $L_\text{sum} = R+G+B$ von der Chrominanz $\text{RGB}/L_\text{sum}$ ab, rekonstruiere jede durch ihren eigentlichen Operator und rekombiniere $\text{core}_c = L_{\text{dome}}\cdot (\text{RGB}/L)_c$.
Die Magnitudenkuppel
Die Luminanz $L_\text{sum}$ wird über den vollständig beschnittenen Kern durch das in ersten Prinzipien eingeführte biharmonische Inpainting gekuppelt: die Lösung $\Delta^2 L = 0$, verankert am wahren gültigen Rand des Kerns (der bereits rekonstruierte teilbeschnittene Kreisring, der ihn umgibt). Der Operator selbst ist eine Wiederbelebung: Ein Design von 2021 hatte Gradientenverlängerung als vorzeichenumgekehrten Laplace-Operator versucht (der diffuse or sharpen-Trick), aber eine umgekehrte Diffusion zu iterieren ist instabil, und es wurde als artefaktanfällig fallen gelassen; der Rebuild bringt die Idee in ihrer stabilen, direkten Form zurück, einmal auf der summierten Luminanz gelöst, statt pro Kanal iteriert. Die Magnitude durch schlichte Diffusion zu füllen würde sie zu einer matten Scheibe abflachen; die biharmonische Lösung setzt stattdessen die Steigung des Randes fort, sodass ein großer vollständig beschnittener Kern zu einer Kuppel ansteigt, statt zu einem Plateau zu kollabieren. Weil alle drei Kanäle auf dieser einen Kuppel reiten, kann keiner relativ zu den anderen kollabieren — der obige Fehler ist strukturell unmöglich. Sie kann den exakten Gipfel nicht erreichen (der steilste Teil des Gradienten wurde weggeschnitten, und der wahre Gipfel ist schlicht unbeobachtet), aber sie stellt grob $75$–$80\%$ des beschnittenen Anstiegs wieder her, als eine glatte Kuppel der korrekten Breite. Ein einzelnes Skalarfeld statt dreier zu lösen macht das biharmonische System auch um ein Drittel kleiner.
Eine Sättigungsuntergrenze
Der geführte Fit und die biharmonische Kuppel sind beide Extrapolationen, und eine Extrapolation kann zu kurz greifen: Ein aus einem einzigen niedrigen Überlebenden wiederaufgebauter Kanal oder eine Kuppel, die einen Rand fortsetzt, dessen nach innen gerichtete Steigung durch Clipping abgeflacht wurde, kann unterhalb des Niveaus herauskommen, das der Kanal tatsächlich erreichte. Das ist unphysikalisch: Wie das Problem feststellte, füllt sich der Potentialtopf des Photosites bis zu einer festen Kapazität, sodass bekannt ist, dass ein beschnittener Kanal mindestens auf seinem Clip-Niveau liegt. Zwei Untergrenzen erzwingen genau das, und beide sind monoton: Sie heben einen Wert nur je an, sodass sie nicht übersteigen und keinen bereits korrekten Farbton verschieben können (eine Anmerkung zur Zuschreibung: Die Untergrenzen waren, wie der 9-Punkte-Laplace-Operator, bereits in der C-Implementierung von 2021 — der Beitrag der Studie besteht nur darin, ihren Wert gemessen zu haben, und die Untergrenzen allein sind eine strikte, gleichförmige Verbesserung auf jeder Szene):
- jeder beschnittene Kanal wird auf seiner eigenen gesättigten Ablesung untergrenzt;
- die Luminanzkuppel des vollständig beschnittenen Kerns wird auf der Summe der Clip-Niveaus untergrenzt: Jeder Kanal dort ist maximiert, sodass der Kern die hellste Region ist, niemals ein Einbruch unter seinen Rand.
Billig und physikalisch unbestreitbar, entfernen die Untergrenzen den restlichen Magenta-und-Dunkel-Stich, den die Kuppel und die Diffusion allein in einem großen vollständig beschnittenen Kern hinterlassen können (eine ausgefressene Sonnenscheibe), und sie erklären die unten berichtete Verbesserung im vollständig beschnittenen korrelierten Fall.
Chrominanz, durch Diffusion
Die Chrominanz $r = \text{RGB}/L_\text{sum}$ wird vom Kernrand nach innen diffundiert: harmonisches Inpainting der Chrominanz, $\Delta r = 0$ mit $r$ am Rand fixiert. Entscheidend ist, dass der Rand hier der rekonstruierte Kreisring unmittelbar um den Kern ist, nicht der ferne Himmel: Da die überlebenden Kanäle beim Annähern an das Licht in Richtung Neutral geführt wurden, ist der Kreisring bereits nahezu neutral, sodass der diffundierte Kern ebenfalls nahezu neutral herauskommt — die ausgefressene Sonne wird weiß neu ausgemalt, nicht im Orange des Himmels. (Die frühere à-trous-Implementierung zog ihre Chrominanz stattdessen von zu weit außen und vergilbte den Kern; sowohl die Referenz als auch die aktuelle segmentierte Rekonstruktion diffundieren vom nahen Kreisring, wie hier.) Das rekombinierte $\text{core}_c = L_{\text{dome}}\cdot r_c$ ist dann eine korrekt gefärbte Kuppel.
Die vorherige à-trous-Implementierung realisierte diese $\Delta r = 0$-Lösung nicht als ein lineares System, sondern als iterierte Relaxation: Sie zerlegte die Verhältnisse in Wavelet-Bänder, wobei jedes Detailband einen expliziten Euler-Schritt von
nimmt, mit $\Delta$ dem isotropen 9-Punkte-Laplace-Operator $\mathbf{K}_{\text{iso}}$. Die Konstante $\kappa$ reskaliert das à-trous-Detailband (eine Differenz von B-Splines) zu einem korrekt skalierten stetigen Laplace-Operator und setzt den effektiven Diffusionszeitschritt.7 Die wiederaufgebaute Rekonstruktion löst stattdessen $\Delta r = 0$ direkt: eine dünnbesetzte Lösung im Prototyp, konjugierter Gradient (ein iterativer Solver, der seine Antwort Schritt für Schritt verfeinert) im C. Aber die Relaxationssicht legt immer noch zwei Dinge offen:
- Mit $\lambda = 0$ ist es die reine Wärmeleitungsgleichung $\partial r / \partial t = \kappa \Delta r$ auf den Farbverhältnissen: harmonisches Inpainting, das die Chrominanz des Lochs glatt von seinem Rand füllt, der oben hergeleitete Dirichlet-Minimierer (äquivalent zur direkten $\Delta r = 0$-Lösung, iteriert).
- Der Term $-\lambda\, r$, gesteuert durch den Parameter
solid_color, ist eine Reaktion erster Ordnung, die das Verhältnisdetail gegen null dämpft. Seine Euler–Lagrange-Gleichung ist die abgeschirmte-Poisson-/modifizierte-Helmholtz-Gleichung $\Delta r - \lambda\, r = 0$: eine Diffusion, zurückgehalten durch einen rückstellenden Zug gegen null; größeres $\lambda$ zieht die innere Chrominanz zu einer flacheren, gleichförmigeren „solid color"-Füllung.
Die Diffusion ist rein isotrop: Textur sollte der Struktur folgen, aber Chrominanz sollte ohne Rücksicht auf die Richtung füllen, sodass ein rotationssymmetrischer Glätter das ist, was gewollt ist. Die gesamte gemeinsame Füllung ist auf die vollständig beschnittenen Pixel gesteuert, sodass sie nie einen Kanal stört, den der geführte Schritt bereits wiederhergestellt hat.
Die Sättigungsuntergrenzen, als Hindernisse. Eine Messung überlebt selbst dort, wo alle drei Kanäle ausgefressen sind: Die gesättigte Ablesung jedes Photosites ist eine untere Schranke seines wahren Wertes, sodass im Verhältnisraum die Chrominanz eines beschnittenen Kanals nie unter $c_{0,c} / L_\text{sum}$ fallen kann. Nur ganz am Ende angewandt — ein hartes $\max$ bei der Rekombination — druckte diese Schranke ein exakt flaches Regal am Clip-Niveau, endend in einem Gradientenbruch, wo immer die glatte Füllung einen Kanal nahe seinem eigenen Rand unterschätzte (gemessen am blauen Kanal eines realen Sonnenuntergangs: zehn Pixel flach am Clip-Wert, dann eine Steigungsunstetigkeit). Die ausgelieferte Rekonstruktion behandelt die Untergrenzen stattdessen als eine Bedingung der Diffusion selbst — ein Hindernisproblem:
gelöst durch projizierte Relaxation: nach jedem Glättungsschritt $r_c \leftarrow \max(r_c, c_{0,c}/L_\text{sum})$. Jedes Nachbargewicht der Diskretisierung ist nichtnegativ, sodass das projizierte Schema monoton bleibt und zur Lösung der Variationsungleichung konvergiert: Der Einfluss der Bedingung breitet sich glatt durch das Feld aus — die Füllung hebt sich um die aktive Menge herum, statt punktweise festgeklemmt zu werden — und die Rekombination wendet dann nur noch eine weiche Rundung an (dasselbe Zwei-Prozent-Smooth-Max wie die Untergrenze des Koeffizientenfelds) auf ein Feld, das bereits zulässig ist. Das Hindernis reitet die gesamte grob-zu-fein-Leiter (Zellhindernisse pro Ebene) plus eine kurze projizierte Politur in voller Auflösung, die auch den Direktlösungspfad abdeckt — eine exakte dünnbesetzte Faktorisierung kann nicht mitten in der Lösung projizieren. Eine stärkere Variante, die das Hindernis um die gemessene nach außen gerichtete Steigung des Randes, nach innen extrapoliert, anhebt, wurde implementiert, gemessen und verworfen: Sie fabriziert Struktur, wo die Extrapolation bindet (der Fehler der Magenta-Sonne stieg um 14 %) und ändert nichts dort, wo das schlichte Hindernis bereits hält.

Der verzweifelte vollständig beschnittene Fall: eine helle Sonne, über den (kanalweisen) Weißpunkt jedes Kanals ausgefressen, über einem orangen Himmel. Der Sensor zeichnet eine flache Scheibe auf, die die RGB-Koeffizienten des Weißabgleichs magenta werden lassen; die vorherige Methode gibt eine matte, übergroße gelbe Scheibe mit einer harten Kante zurück (ihre kanalweisen Füllungen driften farbton-daneben und kuppeln nie); die korrigierte Methode baut eine neutrale Kuppel der richtigen Größe aus einer gemeinsamen Luminanzkuppel plus rand-diffundierter Chrominanz wieder auf.
Über den beschnittenen Kern, RMSE $0.87 \to 0.27$ und SSIM $0.61 \to 0.95$; die Chrominanz der Füllung bewegt sich von Magenta $(0.37, 0.27, 0.36)$ zu einem nahezu neutralen $(0.39, 0.33, 0.28)$, im Wesentlichen die Ground Truth von $(0.36, 0.33, 0.31)$ (die vorherige Methode landet bei einem gelben $(0.51, 0.34, 0.15)$).
Körnung hinzufügen
Als letzter Schliff, und nur dort, wo die Maske offen ist, erhält die Rekonstruktion Poisson-Rauschen mit einer Amplitude proportional zum lokalen Wert ($\sigma_c = \texttt{noise_level}\cdot u_c$), gefaltet, damit es ausschließlich aufhellt, und mit $\alpha$ zusammengesetzt. Das Photonen-Schrotrauschen ist signalabhängig, sodass ein vollkommen glattes Feld, das in eine Aufnahme mit hohem ISO eingesetzt wird, plastikartig wirkt; die Anpassung der Körnung lässt die Reparatur verschwinden.2
Der Rekonstruktionsradius
Wie breit sollte das gröbste geführte Fenster, der Rekonstruktionsradius $\rho$, sein? Es ist der eine Regler, der Reichweite gegen Lokalität abwägt, und es stellt sich heraus, dass er eine saubere Antwort hat.
Der Radius eines Lochs ist seine Tiefe, nicht seine Größe. Für ein Loch $\Omega$ sei $d(x)$ der Abstand von einem beschnittenen Pixel $x$ zum nächstgelegenen gültigen Pixel. Die maßgebliche Größe ist der tiefste Punkt,
$$R=\max_{x\in\Omega} d(x)=\max\big(\text{distance transform of }\Omega\big)$$
nicht der umschließende Rahmen (Bounding Box). Eine kompakte Scheibe und ein langer dünner diagonaler Streifen können sich einen umschließenden Rahmen teilen und dabei völlig unterschiedliche $R$ haben : für den Streifen ist $R$ seine halbe Dicke, denn so weit muss die Führung reichen, um gültige Daten zu berühren. Den Radius anhand des umschließenden Rahmens zu bemessen, würde bei langgestreckten oder diagonalen Löchern massiv zu weit greifen.
Warum $\rho \approx R$ optimal ist. Zwei Fehler konkurrieren, während $\rho$ wächst. Abdeckung : ein Fenster der Skala $\rho$ legt ein Gewicht $\sim e^{-d(x)^2/2\rho^2}$ auf gültige Daten, das vernachlässigbar ist, bis $\rho \gtrsim d(x)$ ; darunter ist die Anpassung unbestimmt und das Pixel bleibt praktisch unrekonstruiert. Lokalität : sobald abgedeckt, ist die angepasste Farblinie ein Fenstermittel der räumlich variierenden wahren Farblinie, sodass die Extrapolation aus immer weiter entfernten Stichproben eine Verzerrung hinzufügt, die mit $\rho$ wächst. Der Fehler pro Pixel ist daher
$$E(x;\rho)\approx \underbrace{C_1\,e^{-d(x)^2/2\rho^2}}_{\text{coverage}\ \downarrow}+\underbrace{C_2\,\rho}_{\text{locality}\ \uparrow}$$
dessen Minimum bei $\rho^*(x)\approx d(x)$ liegt : das kleinste Fenster, das gültige Daten erreicht. Ein einzelner Regionsradius muss sein tiefstes Pixel abdecken, also $\rho=R$; die Grob-zu-Fein-Leiter ist dann genau dieses Optimum pro Pixel, kontinuierlich gemacht : die gröbste Skala $R$ bedient das Zentrum, jede feinere Skala bedient die Schale in ihrer eigenen Tiefe.
Zu weites Greifen ist bei der Qualität gratis, aber nicht beim Preis. Im Prototyp lässt ein Durchlauf von $\rho$ von $0.4R$ bis $3R$ sowohl den durchschnittlichen als auch den Tiefkern-RMSE flach, auf korrelierten wie auch auf dekorrelierten Szenen gleichermaßen. Der Grund ist struktureller Natur : die Grob-zu-Fein-Leiter überschreibt jeden groben (überglätteten) Wert mit der feinsten Skala, die das Pixel noch erreicht, sodass der Radius nur die Abdeckung festlegt, niemals den endgültigen Wert eines Pixels. Der Rechenaufwand hingegen ist nicht flach (er steigt sowohl mit der aufgefüllten Fläche als auch mit der Anzahl der Skalen), sodass das Verhältnis von Qualität zu Kosten mit $\rho$ monoton fällt :
| $\rho/R$ | durchschn. RMSE | Tiefkern-RMSE | relative Kosten | Qualität / Preis |
|---|---|---|---|---|
| 0.4 | 0.083 | 0.141 | 0.43 | 1.00 |
| 1.0 | 0.083 | 0.141 | 1.00 | 0.43 |
| 2.0 | 0.083 | 0.141 | 2.39 | 0.18 |
| 3.0 | 0.083 | 0.141 | 4.43 | 0.10 |
Die Rekonstruktionsradius-Studie : Fehler und Kosten gegenüber der Anpassungsskala als Bruchteil des Regionsradius. RMSE = quadratisch gemittelter Fehler (root-mean-square error) gegenüber der Ground Truth, 0 ist eine perfekte Rekonstruktion.
Der Idealpunkt liegt pro Pixel, und die Implementierung liefert ihn. Da die Qualität oberhalb der Tiefe flach ist und die Kosten es nicht sind, ist das beste Verhältnis von Qualität zu Preis das kleinste Fenster, das jedes Pixel noch abdeckt, d. h. $\rho(x)=d(x)$ pro Pixel, niemals ein globales Maximum. Die Leiter-C setzte dies unmittelbar um : eine zusammengeführte Kachel nahm den größten Radius $R$ der Gruppe als gröbste Skala (sodass das tiefste Pixel abgedeckt war), und jedes Pixel wurde dann auf Skalen begrenzt, die nicht gröber als $\sim2\,d(x)$ waren, sodass ein flaches Pixel (ein kleines Loch oder der Rand eines großen) niemals für die groben Skalen zahlte, die nur das Zentrum benötigt. Die Distanztransformation wird einmal für das gesamte Bild berechnet und steuert den Radius pro Region. Die einzige feste Regel ist die Asymmetrie : niemals unter die Tiefe gehen (die Abdeckung bricht zusammen) und niemals weit darüber (reine Verschwendung von Rechenaufwand). Die ausgelieferte Methode hält das Fazit in einer einfacheren Form : ein Anpassungsfenster, bemessen auf den Radius der Region, $\sigma = \operatorname{clip}(r/6,\, 8,\, 64)$ px, ohne dass eine Begrenzung pro Pixel übrig bleibt.
Implementierung & Optimierungen
Es existieren zwei Implementierungen : die NumPy-Referenz, die neben diesem Artikel veröffentlicht ist, und der C-/OpenCL-Produktionscode, der in Ansel ausgeliefert wird. Sie werden als Teil des Validierungsprotokolls gegeneinander verglichen (diff), und sie weichen nur dort voneinander ab, wo die Geschwindigkeit es erfordert.
Der C-Produktionscode
Der diesem Artikel beiliegende Prototyp ist die Referenz : er bevorzugt Klarheit und Genauigkeit gegenüber Geschwindigkeit (dünnbesetzte Direktlösungen über das gesamte Bild, eine feste Gauß-Leiter, ein separater Varianzdurchlauf, eine Farblinien-Anpassung pro (Kanal, Führung)-Paar). Der Code, der tatsächlich in Ansel ausgeliefert wird, muss eine beschnittene Sonne innerhalb einer RAW-Datei von über 20 Mpx rekonstruieren, während der Benutzer wartet, sodass er auf eine Handvoll bewusster Weisen von der Referenz abweicht. Jeder Kompromiss unten ist auf korrelierten Inhalt abgestimmt, den überwältigend häufigen Fall in natürlichen Bildern, und akzeptiert einen kleinen Verlust bei synthetischem dekorreliertem Inhalt, der in der Praxis selten ist. Jede Abweichung ist im Quellcode umkehrbar. Eine Anmerkung zur Geschichte : diese Optimierungsarbeit wurde am C der Leiter-Ära durchgeführt, dessen Rekonstruktionskern die ausgelieferte Methode ersetzt. Die Maschinerie für Segmentierung, Auffüllung, dünnbesetzten Löser und gemeinsame Statistiken wird wortgetreu übernommen ; die leiterspezifischen Elemente (die Skalenleiter pro Loch, das Tiefengatter pro Pixel, die paarbeschränkte Führungswahl) überleben nur als Prinzipien, innerhalb des einzelnen Anpassungsfensters und der Koeffizientenauffüllung der ausgelieferten Methode.
Nur die beschnittenen Nachbarschaften segmentieren und rekonstruieren, in voller Auflösung. Die Referenz läuft über das gesamte Bild. Der ausgelieferte Code füllt die beschnittene Maske per Flood-Fill zu zusammenhängenden Regionen, füllt jede um ihren eigenen Rekonstruktionsradius auf ($1.25\times$ den Radius, begrenzt zwischen $8$ und $256$ px — je größer das Loch, desto weiter muss es nach gültigen Daten greifen), führt Regionen zusammen, deren aufgefüllte Kästen sich überlappen, sodass ihre Füllungen nie als Naht aufeinandertreffen, und lässt die vollständige Pipeline nur innerhalb jedes aufgefüllten Kastens laufen. Kosten : keine — die unberührten Pixel waren bereits korrekt. Gewinn : die Arbeit skaliert mit der beschnittenen Fläche, nicht mit dem Sensor.
Ein eigenständiges dünnbesetztes Cholesky schloss die Löserlücke. Die Referenz füllt die Magnitudenkuppel mit einer dünnbesetzten Direktlösung (
scipy.spsolve); ein iterativer Löser (konjugierte Gradienten auf $\Delta^2$) bleibt in einfacher Genauigkeit im RAW-Maßstab hängen (seine Konditionszahl, der Faktor, um den das System Rundungsfehler verstärkt, wächst wie die vierte Potenz der Regionsgröße), und eine dichte Faktorisierung ist $O(N^3)$, sodass das C zunächst ein dichtes Cholesky (die standardmäßige exakte Faktorisierung eines symmetrischen Systems in dreieckige Hälften, einmal berechnet und wiederverwendet) auf einem auf höchstens 2000 Unbekannte vergröberten Gitter auslieferte. Da die Kuppel niederfrequent ist, war die grobe Lösung dort, wo es darauf ankam, exakt — außer bei riesigen vollständig ausgefressenen Kernen, wo die Vergröberung selbst zum Genauigkeitsengpass wurde (der Testfall der magentafarbenen Sonne verbesserte sich am Tag, an dem die Obergrenze aufgehoben wurde, um 21 % im RMSE). Das C trägt nun sein eigenes dünnbesetztes symmetrisch-positiv-definites (SPD) Cholesky, eine aufwärtsblickende $LL^T$-Faktorisierung in doppelter Genauigkeit, geordnet durch geometrische verschachtelte Zerlegung (nested dissection) : die Unbekannten sind 2D-Gitterpunkte, sodass eine rekursive Koordinatenhalbierung die füllreduzierende Qualität liefert, die normalerweise eine Implementierung des approximativen minimalen Grades (AMD) erfordert, in wenigen Dutzend Zeilen und ohne externe Abhängigkeit. Das Kuppelgitter ist viermal feiner (8 192 Unbekannte, was den Qualitätsgewinn messbar sättigt), und die Chrominanzdiffusion des vollständig beschnittenen Kerns faktorisiert einmal für ihre drei rechten Kanalseiten, wenn der Kern klein ist ; die parallelen konjugierten Gradienten schlagen die serielle Faktorisierung bei den großen messbar, sodass es diese beibehält. Kosten : netto keine (die Lösungen für vollständig beschnittene Kerne wurden schneller). Gewinn : die letzte systematische Divergenz zwischen C und Prototyp verschwunden, und mit ihr die Genauigkeit bei riesigen Kernen.Eine Gauß-Leiter pro Loch, bemessen auf den Rekonstruktionsradius. Die Referenz verwendet eine Leiter mit festem Radius ($40, 24, \dots, 2$ px). Das optimierte Leiter-C bemaß die gröbste Skala jeder Region auf den Rekonstruktionsradius dieser Region und halbierte um den Faktor $2\times$ bis auf $\sim2$ px hinunter. Dies verdient eine eigene Behandlung : siehe Der Rekonstruktionsradius unten.
Gemeinsame gefensterte Statistiken : eine kostenlose Beschleunigung. Die Farblinien-Anpassung benötigt pro Kanalpaar die gefensterten Mittelwerte, Varianzen und die Kovarianz. Sie pro (Kanal, Führung) zu erheben kostet zwölf Weichzeichnungen pro Skala ; sie pro Kanalpaar zu erheben liefert die Anpassungen beider Kanäle aus denselben zwei Weichzeichnungen : sechs Weichzeichnungen, und mathematisch identisch. Dies allein halbierte die Laufzeit ungefähr.
Paarbeschränkte Varianz zur Führungsauswahl : geringe, eingegrenzte Kosten. Die Referenz entscheidet anhand der einkanaligen gefensterten Varianz jeder Führung, welcher von zwei Führungen zu trauen ist, ein separater Drei-Weichzeichnungs-Durchlauf pro Skala. Das optimierte Leiter-C verwendete die paarbeschränkte Varianz wieder, die es bereits für die Anpassung berechnet hatte, und ließ diesen Durchlauf gänzlich weg (neun Weichzeichnungen pro Skala auf sechs herunter). Dies änderte nur, welche Führung gewinnt, und nur dort, wo die beiden uneinig sind, d. h. bei dekorreliertem Inhalt. Kosten : auf einer vollständig dekorrelierten synthetischen Szene steigt der Einzelbeschnitt-RMSE von $0.043$ auf $0.047$ und der SSIM fällt von $0.964$ auf $0.960$ ; auf korrelierten Szenen und bei Beschnitt in zwei oder drei Kanälen liegt es innerhalb des Rauschens. Gewinn : ein Drittel der verbleibenden Weichzeichnungen entfernt.
Die kanalweise Selbstkuppel und der Nahtregularisierer sind im ausgelieferten Code deaktiviert. Beide glätten jeden RGB-Kanal unabhängig. Auf einem echten gesättigten bernstein-/orangefarbenen Licht (wo das $R^2$ der Farblinie durch die Nichtlinearität des Clippings absackt und fälschlich als „dekorreliert" gelesen wird) treibt das Grün von Rot und Blau weg und färbt die Rekonstruktion magenta. Die Referenz behält sie bei : sie entfernen Artefakte bei wirklich dekorreliertem Inhalt, den die synthetischen Szenen stark beanspruchen und echte Fotografien selten aufweisen (ihre Deaktivierung kostet die Referenz $\sim0.01$–$0.02$ RMSE auf der Zufallsszene, im Grunde nichts bei korreliertem Inhalt). Die saubere Lösung ist eine farbtongekoppelte Version (die Luminanz und eine gemeinsame Chrominanz glättet statt dreier unabhängiger Kanäle), und sie wurde inzwischen gebaut : in der endgültigen Koeffizientenfeld-Pipeline kehrt die Selbstkuppel als tiefengesteuerter Rückfall zurück, genau auf diese Weise farbtongekoppelt (eine gemeinsame biharmonische Luminanzkuppel mal eine harmonisch aufgefüllte Chrominanz), sodass der Rückfall den Farbton konstruktionsbedingt nicht verschieben kann. Der Nahtregularisierer ist endgültig ausgemustert — diese Pipeline hat keine Übergaben zwischen Schätzern mehr, die zu glätten wären.
Zwei Komponenten der C-Implementierung von 2021, die die Prototyp-Übersetzung stillschweigend fallen gelassen hatte, wurden wieder in die Referenz eingefügt, als echte methodische Anforderungen statt als Geschwindigkeitskompromisse, sodass sie keine Unterschiede mehr sind : der rotationsinvariante 9-Punkt-Laplace-Operator (der Operator, den dieser Artikel herleitet ; die Referenz verwendete zuvor das schlichte 5-Punkt-Kreuz567) und die Sättigungsuntergrenzen (unten). Beide verbessern den schwierigsten, relevantesten Fall (den vollständig beschnittenen Kern einer korrelierten Szene), senken dessen RMSE von $0.065$ auf $0.062$ und heben den SSIM von $0.959$ auf $0.964$, und sind anderswo neutral.
Zusammengenommen sinkt bei einer beschnittenen Sonne die Anzahl der Weichzeichnungen des geführten Filters von fünfzehn auf sechs pro Skala und die Vorschaurekonstruktion fällt von Dutzenden Sekunden auf wenige. Die verbleibenden Unterschiede sind Geschwindigkeit und Architektur (Segmentierung, dichte Löser, der Radius pro Loch, gemeinsame Statistiken), dazu die paarbeschränkte Führungsvarianz und die oben deaktivierte kanalweise Verfeinerung ; die grundlegende Rekonstruktionsmathematik ist mit der Referenz gemeinsam.
Ein weiterer gemessener Kompromiss wurde früh geschlossen : die Rekonstruktion ist bei voller Auflösung deutlich besser. Das Modul von 2021 löste aus Geschwindigkeitsgründen auf einer Kopie in Viertelauflösung, aber dieses Herunterrechnen zeichnet die Rekonstruktion weich und ist, wieder gegen das scharfe Original überblendet, die dominierende Quelle des Kantenfehlers : der Lauf in voller Auflösung senkte den Grenz-RMSE um etwa 30 %, sodass der Neuaufbau in voller Auflösung arbeitet. Herunterrechnen ist ein Geschwindigkeits-/Qualitätskompromiss, kein Freibier.
Die Python-Referenz
Der NumPy-Spiegel (validate.py, fix_prototype.py) implementiert jede Stufe des ausgelieferten Algorithmus in derselben Reihenfolge, und der Vergleich (diff) seiner Ausgabe gegen die C-Exporte ist Teil des Validierungsprotokolls. Einige Komponenten sind in Python bewusst besser als in C, oder das C tauscht bewusst Exaktheit gegen Geschwindigkeit :
- Exakte dünnbesetzte Direktlösungen. Die biharmonischen Kuppeln des Prototyps und seine Chrominanzlösung in Divergenzform sind
scipy.sparse-Faktorisierungen, exakt bis zur Maschinengenauigkeit (seine abgeschirmte-Poisson-Gemeinkern-Füllung ist jedoch eine feste Jacobi-Relaxation mit 400 Durchläufen — auf dieser einen Stufe ist die Direktfaktorisierung des C die exaktere der beiden). Das C trägt nun sein eigenes dünnbesetztes Cholesky (siehe Implementierung & Optimierungen oben) und stimmt mit den Kuppel- und Kleinkern-Chrominanzlösungen des Prototyps überein ; was noch abweicht, ist beabsichtigt : die Chrominanzdiffusion großer vollständig beschnittener Kerne läuft mit den parallelen konjugierten Gradienten (dort gemessen schneller als eine serielle Faktorisierung, ohne messbaren Qualitätsunterschied), die Koeffizientenauffüllung bleibt das oben beschriebene Grob-zu-Fein-Jacobi — mit der adaptiven Pyramide des C (Basisschrittweite $\sigma/4$, gedeckelt bei 8 px, halbiert bis zu einem gröbsten Niveau von $\le 8$ Zellen, 100 Durchläufe pro Ebene) gegenüber den festen sieben Ebenen in voller Auflösung des Prototyps — und die Füllung des Prototyps ist isotrop — die varianzadaptive Steuerung des Koeffiziententransports im C (Schritt 3) hat noch keinen Python-Spiegel, sodass die Übereinstimmung zwischen C und Prototyp unter Berücksichtigung des Beitrags der Steuerung geprüft wird. Vorteil der exakten Lösungen des Prototyps : sie sind der Schiedsrichter, wenn die C-Ausgabe falsch aussieht. - FFT-Gauß-Fenster vs. rekursives IIR. Der Prototyp berechnet gefensterte Momente mit Faltungen per schneller Fourier-Transformation (FFT) : exakt, deterministisch. Das C verwendet den rekursiven Gauß (mit unendlicher Impulsantwort, IIR), dessen Kosten unabhängig von $\sigma$ sind — dessen parallele Implementierung aber nicht von Lauf zu Lauf deterministisch ist : die Rundung an den Blockgrenzen zittert an der letzten Float-Stelle, was für sich genommen harmlos ist, aber einen denkwürdigen Heisenbug (unten) auslöste.
- Eingabe der Knie-Schätzung. Der Prototyp schätzt den Rolloff aus der wahren RGB-Szene in voller Auflösung ; das C aus dem vierfach gebinnten CFA bei $\le 1.5$ Mpx. Gemessene Kosten : keine (die blinde C-Schätzung stimmt immer noch bis auf $10^{-3}$ mit dem analytischen Knie überein), während das Vierfach-Binning es überhaupt erst möglich macht, CFA-seitig zu schätzen.
- Ganzbild vs. pro Region. Der Spiegel verarbeitet ganze Bilder ; das C sammelt jede beschnittene Region in einen aufgefüllten Puffer und rekonstruiert sie unabhängig, was den Speicher begrenzt und Regionen parallelisieren lässt, zum Preis einer Normalisierung pro Region.
- Ausgelieferte Verfeinerungen, die der Spiegel noch nicht eingeholt hat. Drei späte C-Runden haben noch kein Python-Gegenstück : die Hindernis-Maschinerie (projizierte Relaxation pro Ebene, die Politur in voller Auflösung und die weiche Untergrenze beim Wiederzusammensetzen — der Spiegel wendet beim Wiederzusammensetzen noch das ausgemusterte harte $\max(u, c_0)$ an), die Bandüberschreibung der Erkennungsschwelle für kniebeteiligte Kanäle ($5\times$ wert auf der Rolloff-Szene, sodass Py-vs-C dort strukturell unvergleichbar ist) und die streng pixelweise binäre Gültigkeit des C (der Spiegel leitet seine Maske über eine 5×5-Mehrheitsabstimmung ab, eine geometrische Dilatation von $\sim 2$ px). Dies sind die bekannten inhaltlichen Lücken hinter den größten Abweichungen pro Szene.
Nachdem jede Stufe gespiegelt war, beträgt die verbleibende Abweichung zwischen dem C-Produktionscode und der Python-Referenz (gemessen als quadratisch gemittelte Differenz ihrer Ausgabebilder innerhalb der beschnittenen Zonen) $0.009$–$0.089$ über die Testreihe. Ihre Untergrenze ist der eine Eingabeunterschied, der nicht beseitigt werden kann — Python passt auf der wahren RGB-Szene an, während das C auf derselben Szene anpasst, gesehen durch das Sensormosaik und eine bilineare Interpolation (etwa $0.02$ auseinander innerhalb des Bandes nahe der Clipping-Grenze) — und ihre Obergrenze ist die obige Liste ausgelieferter Verfeinerungen, die auf den Rolloff- und Verdeckungsszenen dominiert. Abseits dieser beiden Szenen stimmen die Implementierungen weit innerhalb des Fehlers überein, den jede gegenüber der Ground Truth macht ; auf ihnen ist genau die zusätzliche Maschinerie des C das, was die Abweichung misst.
Benutzerparameter
Es gibt bewusst fast nichts einzustellen : der Algorithmus ist selbstkonfigurierend. Jede Größe, von der die Rekonstruktion abhängt, wird entweder einmal abgeleitet und eingefroren oder zur Laufzeit aus dem Bild selbst gemessen — die Anpassungsskala aus dem eigenen Rekonstruktionsradius jeder Region, der Sensor-Rolloff aus den bildeigenen Farblinien, das Ankervertrauen aus der gemessenen Anpassungsqualität, die Transportsteuerung aus der gemessenen Führungsstruktur, die Kantenschwelle $k$ einmal auf der Ground-Truth-Testreihe kalibriert. Die Regler iterations und diameter des Modus von 2021 sind aus der Oberfläche dieses Modus verschwunden : es bleibt keine benutzerabstimmbare Konvergenz zum Fehlkonfigurieren und keine Möglichkeit, Qualität aus Versehen wegzutauschen.
Was bleibt, ist eine Sicherheitsoption und zwei Geschmacksfragen. Der clipping threshold skaliert die Sättigungsschwellen, die die Zone definieren (siehe den Visualisierungsschalter unten — er muss fast nie verstellt werden) ; der noise level legt die Körnung fest, die über die Rekonstruktion wieder eingespeist wird, damit sie zur umgebenden Photonentextur passt ; und inpaint a flat color legt den Zug zu einer einheitlichen Farbe in den vollständig beschnittenen Kernen fest, wo nichts überlebt hat — eine stilistische Entscheidung über Zonen, die überhaupt keine Information tragen.
Advice
Der Clipping-Schwellenwert hat einen Schalter zur Maskenvisualisierung (das Symbol neben dem Regler). Wenn aktiv, rendert das Modul eine Falschfarben-Überlagerung (gültige Pixel gedimmt, beschnittene Pixel markiert), sodass Sie genau sehen können, auf welche Region $\Omega$ die Rekonstruktion wirken wird, bevor Sie sich darauf festlegen. Sie sollten den Schwellenwert selbst fast nie verstellen müssen.Entdeckte Probleme
Die strukturelle Beschränkung der Methode ist ererbt und akzeptiert : ein ausgefressener blauer Himmel, gesehen durch grüne Blätter, wird grün wiederhergestellt, denn wo kein Kanal überlebt, kann die Rekonstruktion nur die benachbarte Farbe fortpflanzen — sie wurde für die unvermeidlichen Beschnitte rund um Lichtquellen und Glanzreflexe entworfen, deren glühende Höfe die Information tragen, von der sie sich nährt. Andere Situationen verlangen weiterhin, die Lichter bei der Aufnahme zu schützen und die Belichtung in der Nachbearbeitung anzuheben, was das Signal-Rausch-Verhältnis moderner Sensoren bequem erlaubt.
Zwei gemessene Vorbehalte vervollständigen das ehrliche Bild. Auf der Verdeckungs-Testszene erreicht die abgestimmte Darktable-Segmentierung einen höheren Wert bei der strukturellen Ähnlichkeit als die harmonische Transposition (0.98 gegenüber 0.96), obwohl die Werte 15 % weiter von der Wahrheit entfernt sind : Magnitude und Struktur sind verschiedene Fehler, und eine glatte falsche Füllung kann sauberer aussehen als eine wahrheitsgetreue. Und die Geräteparität der Float-Pipeline liegt auf Toleranzniveau, nicht auf Bit-Niveau : nach dem Zentrieren der Momentenakkumulation (Schritt 3) liegt die verbleibende CPU-gegen-GPU-Differenz auf der tiefsten Testszene unter $10^{-3}$ RMSE, begrenzt durch reihenfolge-nichtdeterministische parallele Reduktionen.
Ergebnisse
Die Testreihe
Jede Zahl unten stammt aus einem einzigen Protokoll. Sechs synthetische Szenen mit bekannter Ground Truth — RGB-Glanzkugeln, eine magentafarbene Sonne, korrelierte Gradienten (ein Luminanzfeld mal eine glatte Chrominanz, so wie sich natürliche Bilder verhalten), unabhängige zufällige Gradienten (überhaupt keine Farblinie, der adversarielle Fall), ein PK1-artiger Himmel mit einem analytischen Sensor-Rolloff und eine von einem Verdecker gekreuzte Sonne — werden als Bayer-DNG-Dateien geschrieben, von den tatsächlichen Produktions-Pipelines entwickelt, und die Exporte werden in weißabgeglichenem Sensor-RGB gegen die Ground Truth bewertet (eine vollständige 3×3-Kalibrierungsmatrix, angepasst an streng lineare gültige Pixel, bildet jeden Export zurück in den Sensorraum ab, sodass unterschiedlich matrizierte Pipelines in denselben Einheiten landen). Jedes Ansel-Ergebnis in diesem Abschnitt — beide Modi, jede Tabelle, jede Abbildung — wird von der ausgelieferten C-Implementierung über ansel-cli erzeugt, nicht vom Python-Forschungsprototyp : die beiden Implementierungen weichen bewusst voneinander ab (verschiedene Löser, Auflösungen und Stufenkompromisse, siehe Der C-Produktionscode), um 0.009 bis 0.089 RMSE innerhalb der beschnittenen Zonen über diese Testreihe, sodass ihre Zahlen niemals vermischt werden dürfen. Die gesamte Testreihe lässt sich aus dem Anhang reproduzieren.
Die Metriken des ausgelieferten Algorithmus unten werden nur innerhalb der beschnittenen Fläche berechnet. RMSE ist der quadratisch gemittelte Fehler gegenüber der Ground Truth, in Sensoreinheiten, so normiert, dass das Clipping-Niveau 1 ist : er misst, wie weit die rekonstruierten Werte im Durchschnitt von den wahren entfernt sind. SSIM ist der Index der strukturellen Ähnlichkeit, ein wahrnehmungsbezogener Wert, der lokale Mittelwerte, Kontraste und Korrelationen vergleicht (1 bedeutet visuell identisch). Kantenenergie ist unser Nahtdetektor : die Energie des Chrominanzgradienten innerhalb der Zone, relativ zu einem Ring knapp außerhalb, und ihr Ziel ist der eigene Wert der Ground Truth, nicht null, weil echter Inhalt Textur hat und eine überglatte Rekonstruktion ebenso falsch ist wie eine mit Nähten :
| Fall | RMSE | SSIM | Kantenenergie (GT-Ziel) |
|---|---|---|---|
| RGB-Kugeln | 0.0351 | 0.995 | 0.41 (0.47) |
| magentafarbene Sonne | 0.3276 | 0.952 | 0.31 (0.50) |
| korreliert | 0.0398 | 0.973 | 1.15 (1.14) |
| zufällig | 0.0453 | 0.965 | 0.85 (1.02) |
| pk1synth | 0.0053 | 1.000 | 0.64 (0.69) |
| PK1 (natürlich) | — | — | 0.49 |
| DSC00078 (natürlich) | — | — | 0.73 |
| IMG_3129 (natürlich) | — | — | 0.39 |
Die ausgelieferte Rekonstruktion gegenüber der Ground Truth, innerhalb der beschnittenen Zonen. RMSE = quadratisch gemittelter Fehler, 0 ist eine perfekte Rekonstruktion ; SSIM = strukturelle Ähnlichkeit, 1 ist eine perfekte Rekonstruktion ; Kantenenergie = mittlere Gradientenmagnitude, am besten, wenn sie dem eigenen Wert der Ground Truth ENTSPRICHT (eine überglatte Füllung ist ebenso falsch wie eine mit Nähten). Natürliche Bilder haben keine Ground Truth, daher wird nur ihre Kantenenergie gezeigt.
Die vier Methoden
Die beiden Darktable-Modi werden mit den anderen einfachen Behelfen im Überblicksabschnitt beschrieben ; durch das Rahmenwerk dieses Artikels gelesen, ist inpaint opposed eine Farblinie mit der auf Eins fixierten Steigung (im Kubikwurzelraum) und einem einzigen globalen Achsenabschnitt — wo die harmonische Transposition sowohl Steigung als auch Achsenabschnitt pro lokalem Fenster anpasst und diese Koeffizienten über die Zone diffundiert, vertraut opposed überall einer festen Beziehung, weshalb es nahezu kostenlos ist und weshalb es bei gemischter Beleuchtung versagt — und segmentation based verbessert dies zu einer repräsentativen Chrominanz pro Segment, immer noch flach dort, wo unsere diffundierten Felder sich glatt verändern.
Beide Methoden beantworten die Frage „welche Farbe sollte dieser Bereich haben" ; keine passt ein Modell dafür an, wie der fehlende Kanal mit den überlebenden zusammenhängt, was es unserer Methode erlaubt, Struktur und Magnitude pro Pixel mit einer gemessenen Konfidenz wiederherzustellen. Die Zeilen unten beziffern diesen Unterschied, auf denselben synthetischen Szenen und Ground Truths wie alles andere in diesem Abschnitt.
Quadratisch gemittelter Fehler (niedriger ist besser) und strukturelle Ähnlichkeit (höher ist besser), gemessen innerhalb der beschnittenen Zone gegenüber der Ground Truth, nach einer Belichtungskalibrierung pro Bild ; jede Methode als 32-Bit-lineares TIFF exportiert (upstream Darktable 5.x für die ersten beiden Spalten, Ansel für die letzten beiden), bewertet vom selben validate.py wie jede andere Tabelle auf dieser Seite. Zwei Vorsichtsmaßnahmen machen die Spalten überhaupt erst vergleichbar. Erstens werden die Pipelines auf dieselbe Grundlinie neutralisiert — Entrasterung plus Lichterrekonstruktion, nichts weiter : der standardmäßige szenenbezogene (scene-referred) Workflow beider Anwendungen schiebt stillschweigend eine Belichtungsanhebung, einen Kanalmischer zur chromatischen Adaption und eine Sigmoid-Tonwertkurve um seine Rekonstruktion herum ein, was die Messung mit Rendering-Unterschieden verfälschen würde, weshalb er auf workflow=none gezwungen wird (Ansels Export ist bereits diese Grundlinie). Zweitens läuft jeder Wettbewerber mit seinen besten Parametern pro Szene, gefunden durch einen Rastersuchlauf über seine Regler (Clipping-Schwelle für opposed ; Candidating, Combine, Rebuild-Modus und Stärke für segmentation ; Iterationen und Flachfarben-Inpainting für die guided laplacians), während die harmonische Transposition überall ihre Werkseinstellungen verwendet. Reproduzierbar mit dt_compare.py (der Vergleich) und tune_methods.py (der Suchlauf) aus dem Forschungsrepository :
| Szene | Darktable opposed | Darktable segmentation | guided laplacians | harmonische Transposition |
|---|---|---|---|---|
balls (Glanzkugeln) | 0.242 / 0.814 | 0.233 / 0.831 | 0.334 / 0.744 | 0.035 / 0.995 |
magentasun (magentafarbene Sonne) | 0.924 / 0.707 | 0.807 / 0.767 | 0.809 / 0.678 | 0.328 / 0.952 |
correlated (korrelierte Gradienten) | 0.107 / 0.872 | 0.077 / 0.907 | 0.130 / 0.850 | 0.040 / 0.973 |
random (unabhängige Gradienten) | 0.089 / 0.911 | 0.080 / 0.920 | 0.138 / 0.862 | 0.045 / 0.965 |
pk1synth (PK1-artiger Himmel (analytischer Rolloff)) | 0.130 / 0.985 | 0.130 / 0.985 | 0.108 / 0.993 | 0.0053 / 1.000 |
occluded (verdeckte Sonne) | 0.099 / 0.982 | 0.086 / 0.980 | 0.171 / 0.930 | 0.069 / 0.987 |
Die vier Methoden gegenüber der Ground Truth, als RMSE / SSIM pro Zelle : RMSE = 0 ist eine perfekte Rekonstruktion, SSIM = 1 ist eine perfekte Rekonstruktion. Pipelines auf reines Entrasterung + Lichter angeglichen, jeder Wettbewerber mit seinen besten Parametern pro Szene, alles in weißabgeglichenem Sensor-RGB innerhalb der beschnittenen Zonen bewertet. Fett = das Beste der Zeile.
Das Muster ist mit den Mechanismen konsistent. Selbst bei angeglichenen Pipelines und jedem Wettbewerber in seinem szenenbezogenen Bestfall führt die harmonische Transposition auf jeder Szene im RMSE — um 20 % dort, wo die Verdeckung die Annahmen des Segmentierungsmodus begünstigt, um einen Faktor von 2 bis 7 in den allgemeinen Fällen, um einen Faktor von fast 50 auf dem Rolloff-Himmel (wo die Bandüberschreibung unten es dem Modell erlaubt, die Steigung wiederaufzubauen, die der Sensor weggestaucht hat) : die Darktable-Modi stellen eine plausible Farbe wieder her, aber nicht die Magnitude (ihre feste Einheitssteigung kann einen Kanal nicht über das anheben, was der opposed-Durchschnitt liefert), und ihre segmentweise oder globale Chrominanz plättet die Textur. Der Segmentierungsmodus zieht tatsächlich am schlichten opposed vorbei, sobald sein Rebuild-Durchlauf wirklich aktiviert ist (der Suchlauf fand Rebuild + volle Stärke auf der Hälfte der Szenen optimal). Das visuelle Gegenstück zu jeder Zahl, eine Szene pro Galerie, alle sechs Darstellungen durch dieselbe Anzeigetransformation :
balls — Glanzkugeln :

die beschnittene Aufnahme

Darktable, inpaint opposed

Darktable, segmentation based

guided laplacians

harmonische Transposition

Ground Truth
balls : fünf Glanzkugeln — reines Rot, Grün, Blau, ein Mischton und Weiß — jede beschneidet eine andere Kanalkombination ; der reine Test der Magnitudenwiederherstellung. Alle sechs Darstellungen teilen eine Anzeigetransformation (normiert auf das Ground-Truth-Maximum, Gamma 1/2.2).
magentasun — magentafarbene Sonne :

die beschnittene Aufnahme

Darktable, inpaint opposed

Darktable, segmentation based

guided laplacians

harmonische Transposition

Ground Truth
magentasun : magentafarbene Sonne — eine vollständig ausgefressene Scheibe über einem Farbverlauf, der Stresstest des vollständig beschnittenen Kerns. Alle sechs Darstellungen teilen eine Anzeigetransformation (normiert auf das Ground-Truth-Maximum, Gamma 1/2.2).
correlated — korrelierte Gradienten :

die beschnittene Aufnahme

Darktable, inpaint opposed

Darktable, segmentation based

guided laplacians

harmonische Transposition

Ground Truth
correlated : korrelierte Gradienten — ein Luminanzfeld mal eine glatte Chrominanz, so wie sich natürliche Bilder verhalten. Alle sechs Darstellungen teilen eine Anzeigetransformation (normiert auf das Ground-Truth-Maximum, Gamma 1/2.2).
random — unabhängige Gradienten :

die beschnittene Aufnahme

Darktable, inpaint opposed

Darktable, segmentation based

guided laplacians

harmonische Transposition

Ground Truth
random : unabhängige Gradienten — überhaupt keine Farblinie, der adversarielle Fall für führungsbasierte Methoden. Alle sechs Darstellungen teilen eine Anzeigetransformation (normiert auf das Ground-Truth-Maximum, Gamma 1/2.2).
pk1synth — PK1-artiger Himmel (analytischer Rolloff) :

die beschnittene Aufnahme

Darktable, inpaint opposed

Darktable, segmentation based

guided laplacians

harmonische Transposition

Ground Truth
pk1synth : PK1-artiger Himmel mit einem analytischen Sensor-Rolloff — der Test der Knie-Inversion und der Bandüberschreibung. Alle sechs Darstellungen teilen eine Anzeigetransformation (normiert auf das Ground-Truth-Maximum, Gamma 1/2.2).
occluded — verdeckte Sonne :

die beschnittene Aufnahme

Darktable, inpaint opposed

Darktable, segmentation based

guided laplacians

harmonische Transposition

Ground Truth
occluded : verdeckte Sonne — ein dunkler Verdecker, der die ausgefressene Zone kreuzt, der Test der Transportsteuerung. Alle sechs Darstellungen teilen eine Anzeigetransformation (normiert auf das Ground-Truth-Maximum, Gamma 1/2.2).
Der vollständige Durchlauf der Validierungs-Testreihe (beschnittene Eingabe, Rekonstruktion, vergrößerte Chrominanz-Kantenkarte und Ground Truth, wo sie existiert), dazu die kanalweisen Kuppelprofile, ist unten gezeigt. Die Profildiagramme werden wie folgt gelesen : jedes nimmt die einzelne Bildzeile, die das tiefste beschnittene Pixel kreuzt (auf die beschnittene Spanne dieser Zeile zugeschnitten) und trägt die Kanalwerte entlang dieser auf, ein Feld pro Kanal, mit der gepunkteten grauen Linie am Clipping-Niveau. Sie legen genau das offen, was ein Vorschaubild verbirgt : die Querschnittsform der rekonstruierten Kuppel, ihre Steigungen dort, wo sie auf den gültigen Rand trifft, wie weit über das Clipping-Niveau die Wiederherstellung reicht, und jeden Überschwinger oder jede flache Stelle — verglichen, auf den synthetischen Szenen, mit dem eigenen Profil der Ground Truth. Alle Profile, natürliche Bilder eingeschlossen, sind in weißabgeglichenem Sensor-RGB, pro Photosite aufgetragen (die Profile natürlicher Bilder lesen das CFA selbst, mit Entrasterung auf Durchreichen gestellt) — die eigene Arbeitsebene des Moduls, wo die Sättigungsuntergrenzen-Invariante (ein beschnittener Kanal endet nie unter seinem gesättigten Wert) direkt sichtbar ist. Keine spätere Stufe hat diese Eigenschaft : die negativen Nebendiagonalen der Farbmatrix lassen einen rekonstruierten Kanal legitim unter sein Clipping-Plateau kreuzen (Gamut-Projektion, keine Verletzung der Untergrenze), das Entrasterung erfindet zwei der drei Kanäle an jedem Pixel und kann an den steilen Rändern der Rekonstruktion unterschwingen, und jeder Resampler fügt seinen eigenen Mitchell-Unterschwinger hinzu. Ein Merkmal der natürlichen Profile verdient eine Warnung : dunkle Strukturen, die die ausgefressene Zone kreuzen (Takelage, Äste, Masten), sind gemessene gültige Daten — die Rekonstruktion schreibt nur beschnittene Photosites, sodass das Profil durch sie hindurch abtaucht, statt über sie hinweg zu kuppeln. Eine Zeile, die zwei hinterleuchtete Seile kreuzt, zeigt zwei Keulen, und das ist die Szene, kein Versagen der Rekonstruktion :








Performance
Eine Rekonstruktion, die messbar besser, aber unbrauchbar langsam ist, würde nicht ausgeliefert. Dieser Abschnitt schließt die Geschichte mit Zahlen ab : wie die neue Methode skaliert, was die Portierung auf den Grafikprozessor (GPU, über OpenCL) einbrachte und wie sich die alte und die neue Methode auf derselben Maschine und denselben Bildern vergleichen. Das Protokoll hinter jeder Zahl unten ist dasselbe : jede Zeitmessung ist ein vollständiger Export über ansel-cli, genommen als das Wall-Clock-Minimum von drei Läufen auf einer ansonsten unbeschäftigten Maschine, mit modulinternen Zeitmessungen aus dem eingebauten Performance-Trace.
Linear in der aufgefüllten Fläche
Zu fragen „wie schnell ist die Rekonstruktion pro Megapixel Bild" ist die falsche Frage : ein Bild ohne Clipping kostet fast nichts, und dieselbe ausgefressene Sonne kostet gleich viel, ob das Bild um sie herum 12 oder 60 Megapixel hat. Die richtige Variable ergibt sich aus der Kostenstruktur. Jede rechenintensive Stufe der ausgelieferten Pipeline ist linear in der aufgefüllten Regionsfläche — die Ausdehnung der beschnittenen Zone plus zweimal ihr Rekonstruktionsradius, zum Quadrat — mit Konstanten, die von der Anpassungsskala unabhängig sind : die gefensterten Momente verwenden rekursive Gauß-Filter, deren Kosten nicht von der Fenstergröße abhängen, die Koeffizientendiffusion läuft mit einem festen Budget von hundert Durchläufen pro Pyramidenebene auf einem Basisgitter, das schrumpft, während die Anpassungsskala wächst (wobei die Pyramide tief genug ist, dass ihr gröbstes Gitter trivial klein ist), und die Direktlösung der Luminanzkuppel ist unabhängig vom Loch auf eine konstante Anzahl von Unbekannten gedeckelt (8.192, auf einem dezimierten Gitter). Und da der Rekonstruktionsradius der tiefste Punkt des Lochs ist, ist die Auffüllung kein freier Parameter : ein kreisförmiges Loch mit Radius $r$ benötigt eine aufgefüllte Region von etwa $(4r)^2$ — dem Sechzehnfachen des eigenen umschließenden Rahmens des Lochs (die Implementierung füllt um $1.25\,r$ auf — die minimale Reichweite plus einer Sicherheitsmarge von $25\,\%$ — begrenzt zwischen $8$ px, damit selbst winzige Flecken noch Kontext sehen, und einer Kostenobergrenze von $256$ px, damit die allertiefsten Löcher etwas langsamer als dieses Gesetz wachsen). Den Durchmesser eines Lichts zu verdoppeln vervierfacht seine Kosten, nicht weil der Algorithmus superlinear ist, sondern weil die Rekonstruktion ehrlich so viel mehr Kontext sehen muss.
Die Testreihe (make_perf_bench.py, reproduzierbar) besteht aus synthetischen RAW-Dateien mit einem kreisförmigen beschnittenen Loch wachsenden Radius, in zwei Familien, die die beiden Hauptcodepfade beanspruchen — ein einzelner beschnittener Kanal (das Koeffizientenfeld leistet die Arbeit) und alle drei Kanäle beschnitten (der Gemeinkern) — zeitlich gemessen durch die Produktions-Kommandozeilen-Pipeline, mit jeder Region der drei echten Testbilder als gemessene Punkte überlagert. Die Maschine ist ein Intel Xeon E3-1505M v6, 4 Kerne / 8 Threads bei 3.0 GHz.
| Familie | Lochradius (px) | Region (Mpx) | Koeffizientenfeld + Kuppel (ms) | Gemeinkern (ms) | Chrominanz (ms) | Gesamt (ms) | ms / Mpx |
|---|---|---|---|---|---|---|---|
| einkanalig | 56 | 0.10 | 135 | 0 | 1 | 136 | ~1360 |
| einkanalig | 128 | 0.50 | 78 | 1 | 5 | 84 | ~170 |
| einkanalig | 256 | 1.30 | 209 | 1 | 12 | 222 | ~170 |
| einkanalig | 384 | 2.00 | 358 | 1 | 17 | 376 | ~190 |
| vollständig beschnitten | 56 | 0.10 | 82 | 99 | 30 | 211 | ~2110 |
| vollständig beschnitten | 128 | 0.50 | 137 | 90 | 221 | 448 | ~900 |
| vollständig beschnitten | 256 | 1.30 | 384 | 222 | 1353 | 1959 | ~1510 |
| vollständig beschnitten | 384 | 2.00 | 863 | 365 | 2375 | 3603 | ~1800 |
| PK1, ausgefressener Himmel (echt) | — | 6.10 | 2689 | 4 | 60 | 2753 | ~450 |
| DSC00078, größte Region (echt) | — | 2.80 | 1191 | 341 | 1943 | 3475 | ~1240 |
| IMG_3129, Sonne (echt) | — | 0.50 | 660 | 44 | 35 | 739 | ~1480 |
Modulzeit pro Stufe gegenüber der aufgefüllten Regionsfläche (bestes Ergebnis wiederholter Läufe, Prozessorpfad) : zwei synthetische Familien, die die Codepfade einklammern, plus die größte Region jedes echten Testbildes. Die nahezu konstante Spalte ms / Mpx innerhalb jeder Familie ist die Linearitätsbehauptung.
Die Zahlen sind Minima pro Lauf über wiederholte Läufe der vollständigen Produktions-Pipeline. So liest man sie : oberhalb von ungefähr einem halben Megapixel hält der einkanalige Pfad 170–190 ms pro Megapixel aufgefüllter Region und der vollständig-beschnitten-Pfad 900–1 800, über eine Dekade von Regionsgrößen hinweg — die Linearitätsbehauptung, bestätigt ; darunter dominiert eine feste Untergrenze pro Region von einigen hundert Millisekunden (gefensterte Statistiken bei ihren Mindestgrößen) und die Ablesung pro Megapixel verliert ihre Bedeutung. (Die Konstante für vollständig beschnitten schließt die Boden-Hindernis-Politur der Kernchrominanz ein — siehe den Algorithmus — deren Kosten das Aktivitätsgatter der Politur nun überall dort erlässt, wo die Sättigungsuntergrenze nicht binden kann ; die in den Ergebnissen dokumentierten Korrektheitsbehebungen erkauften ihre Qualität mit ehrlicher Arbeit, und die Optimierungsrunden holten zurück, was sie konnten, ohne die Ausgabe anzutasten.) Zwei strukturelle Gewinne kamen seit der ersten Version dieses Abschnitts hinzu. Der dünnbesetzte Direktlöser beseitigte die Engpässe bei der Kuppel und der Kleinkern-Chrominanz (die Gemeinkern-Spalte erreicht ihren Spitzenwert bei 0.3 s, wo das dichte Float-Cholesky Sekunden verbrauchte), und die Direktlösung in Divergenzform reduzierte die strukturgesteuerte Chrominanz auf Millisekunden, überall dort, wo der vollständig beschnittene Kern in seine Faktorisierungsobergrenze passt. Und die Behebung der Saatschwelle der Segmentierung (sie ließ Regionen durch Float-Rückstände der Box-Weichzeichnung wachsen) verkleinerte die aufgefüllten Regionen selbst : PK1s ausgefressener Himmel, einst ein aufgefülltes Rechteck von 15.8 Mpx, ist nun die ehrlichen 6.1 Mpx — seine gesamte Rekonstruktion dauert 1.3 s. Was nun dominiert, ist die Koeffizientenfeld-Stufe (gefensterte Momente und harmonische Füllungen, weichzeichnungsgebunden) — was genau dort ist, wo die unten beschriebene OpenCL-Portierung ansetzt.
Wall-Clock-Zeit, alt gegen neu
Der Vergleich, den Fotografen tatsächlich spüren, ist die vollständige Exportzeit, alter Modus gegen neuen, auf derselben Maschine und denselben RAW-Dateien, unter dem oben angegebenen Protokoll. Drei natürliche Fälle : PK1 (eine 36-Megapixel-Bayer-Datei, deren ausgefressener Himmel eine einzige 6-Megapixel-Region ist — der schlimmste Fall, für den die neue Methode gebaut wurde), X-H1 (eine 24-Megapixel-Fujifilm-X-Trans-Datei, deren Lichter in 99 meist winzige Regionen zerfallen), DSC00078 (ein 24-Megapixel-Bayer-Sonnenuntergang) und die beiden synthetischen Extreme der Testreihe. Es lohnt sich, hier daran zu erinnern, dass die guided laplacians um den Faktor 4 herunterskaliert werden, das ist ein Sechzehntel der Originalauflösung, während die harmonische Transposition in voller Auflösung läuft. (Diese Wall-Clock-Zeiten wurden nach der gesamten Optimierungskampagne unten in einer Sitzung neu gemessen ; die Maschine trug eine stetige Ein-Kern-Hintergrundaufgabe, die die Minima pro Zelle über drei Läufe größtenteils absorbieren.)
| vollständiger Export, Wall-Clock | guided laplacians, Prozessor | harmonische Transposition, Prozessor | guided laplacians, Grafikkarte | harmonische Transposition, Grafikkarte |
|---|---|---|---|---|
PK1 (Bayer, ein großer Klecks) | 14.3 s | 11.4 s | 10.4 s | 9.8 s |
X-H1 (X-Trans, 99 Regionen) | 9.3 s | 11.5 s | 6.9 s | 9.4 s |
DSC00078 (Bayer-Sonnenuntergang) | 16.6 s | 14.4 s | 11.4 s | 12.5 s |
occluded (klein, synthetisch) | 0.9 s | 0.9 s | 1.2 s | 1.3 s |
allclip-384 (große vollständig beschnittene Scheibe) | 2.2 s | 5.5 s | 1.9 s | 3.3 s |
Wall-Clock-Zeit des vollständigen Exports, alter Modus gegen neuen, beide in einer Sitzung gemessen (jeweils bestes von drei Läufen). Denken Sie an die Asymmetrie : die guided laplacians rekonstruieren bei 1/16-Auflösung, die harmonische Transposition in voller Auflösung, und ihre Wall-Clock-Zeiten schließen die Sensor-Rolloff-Stufe ein, die der alte Modus nicht hat.
Die ehrliche Schlagzeile lautet, dass die im Validierungsabschnitt dokumentierten Qualitätsgewinne nun fast überall bei vergleichbarer oder besserer Wall-Clock-Zeit kommen — die neue Methode gewinnt die Prozessorspalte auf den natürlichen Dateien klar, und nur die vollständig beschnittene Scheibe zahlt noch einen echten Aufpreis — und der Weg zu diesem Satz ist lehrreich, denn der erste Produktions-Build des anisotropen Transports lief überall dort, wo die Lichter zerfallen, mit dem doppelten dieser Zahlen. Das Profiling der X-Trans-Datei mit 99 Regionen zeigte, dass die Kosten nicht arithmetischer Natur waren : die Relaxation startete für jeden Durchlauf ein frisches Thread-Team (Zehntausende von Starts mit Mikrosekunden-Arbeit pro Bild), die Steuerungsgewichte wurden bei jedem Durchlauf neu berechnet, obwohl der Tensor pro Ebene fest ist, und jede Koeffizientenebene führte ihre eigene Füllung durch — eigene Maskenpyramide, eigener Tensor — obwohl die Ebenen beides teilen. Eine parallele Region pro Relaxation, Gewichte einmal pro Ebene vorberechnet, und die Ebenen mit gemeinsamer Maske zu einer einzigen Füllung verschmolzen brachten die Prozessor-Wall-Clock dieser Datei von 18.3 s auf 9.8 s — die anisotrope Steuerung selbst ist auf dem Prozessor im Wesentlichen kostenlos. Die in den Ergebnissen dokumentierten Korrekturen für Randverzerrung und Boden-Hindernis reinvestierten dann einen Teil dieses Gewinns in ehrliche Arbeit (die binäre Gültigkeit vergrößert die echten Löcher ; die Hindernis-Politur überstreicht jeden vollständig beschnittenen Kern), und eine spätere Runde holte einen Teil davon zurück (die Momenten-Weichzeichnungen vierfach gepackt, die Politur danach gesteuert, ob ihre Untergrenze überhaupt binden kann), und landete bei den 11.5 s der Tabelle. Was bleibt, ist struktureller Natur. Auf dem Prozessor gewinnt die neue Methode dort, wo sich ihr Entwurf auszahlt — im Fall des großen Klecks ist ihre Arbeit proportional zur beschnittenen Fläche (jede Region einmal, exakt gelöst), wo die alte Methode eine Diffusion auf jeder Pyramidenskala des gesamten Bildes iteriert — und ihre Wall-Clock-Zeiten schließen immer noch eine Stufe ein, die die alte Methode schlicht nicht hat : die Messung und Inversion des Sensor-Rolloffs (allein 0.7 bis 1.2 s auf diesen Dateien) — damit gewinnt die neue Methode nun die Prozessorspalte auf allen drei natürlichen Dateien. Auf der Grafikkarte behält die alte Methode einen Vorsprung bei fragmentierten Szenen : ein großer einheitlicher Kernel pro Skala ist die Form, die Grafikprozessoren lieben, während die Kette kleiner, gegenseitig abhängiger Löserstufen der neuen Methode pro Schritt einen festen Dispatch-Kostenaufwand zahlt. Zwei gemessene Antworten verengten diese Lücke von unbrauchbar (die erste Portierung lief die Datei mit 99 Regionen mit dem Doppelten des alten Modus) auf etwa 35 % darüber : Regionen unter einem Megapixel springen über eine einzige gepackte Übertragung zum Prozessor, und die dünnbesetzte Faktorisierung startet einen Thread pro Matrixeintrag statt einer Work-Group pro Spalte — beide werden im OpenCL-Abschnitt erzählt, und auf der Datei mit einem großen Klecks schlägt die neue Methode nun auch auf der Grafikkarte die alte. Und die vollständig beschnittene Scheibe ist der klarste Kompromiss von allen : ohne einen überlebenden Kanal irgendwo gibt es keine Farblinie zum Anpassen, und die exakten Kuppel- und Farbtonlösungen der neuen Methode erkaufen ihre Qualität — keine flache Füllung, keine Farbtonverschiebung, kein sichtbarer Rand — zu etwa dem 2.5-Fachen des Preises der alten Diffusion auf dem Prozessor (1.7 auf der Grafikkarte), genau im Fall, in dem die Ausgabe der alten Methode am schwächsten ist.
Die OpenCL-Pipe
Die erste OpenCL-Portierung war ein Hybrid : die Interpolation und das abschließende Remosaicing liefen als Gerätekernels, aber die Mitte der Rekonstruktion lief auf dem Prozessor, auf Ebenen, die von der Grafikkarte heruntergeladen und danach wieder hochgeladen wurden. Dieser Entwurf war kostenneutral — die Übertragungen fraßen auf, was die Kernels einsparten — und er wurde genau aus diesem Grund verworfen : ein 36-Megapixel-Bild zweimal pro Export über den Bus hin und zurück zu schicken ist die Art von Steuer, die eine Pipeline stillschweigend dominiert.
Die ausgelieferte Portierung hat jede Stufe der Rekonstruktion auf dem Gerät — die Interpolation, die Koeffizientenfüllungen, die anisotropen Pyramiden, die dünnbesetzten Löser, das Remosaicing (eine Ausnahme : die Anforderung einer Körnungsregeneration leitet die Rekonstruktion über den Prozessorpfad). Aber jede Stufe auf dem Gerät zu haben ist nicht dasselbe wie jede Region dort auszuführen, und der endgültige Entwurf tut das nicht. Die Instrumentierung des Host-Geräte-Verkehrs der Portierung (Synchronisationszähler bei jedem blockierenden Lesen, jeder Warteschlangenleerung und jedem Kernel-Start, mit dem Perf-Trace ausgegeben) erzählte eine Geschichte, die die Stufenzeiten des Profilers verborgen hatten : die blockierenden Rücklesungen, die jeder zuerst verdächtigt, kosteten vernachlässigbare ~150 ms pro Export, während die Anzahl der Starts die Steuer war — etwa tausend Kernel-Starts pro Region, unabhängig von der Größe der Region, weil iterative Stufen pro Durchlauf starten und die dünnbesetzten Lösungen pro Eliminationsbaumebene starten. Eine Region von 700 Pixeln maß 22 ms auf dem Gerät gegenüber unter 1 ms auf dem Prozessor : nur Dispatch, keine Arithmetik. Auf der X-Trans-Testdatei — 99 meist winzige Regionen — waren das über 100.000 Starts pro Export, wobei die Wall-Clock-Zeit beim Doppelten der Beschäftigungszeit des Geräts lag.
Die ausgelieferte Pipe leitet daher jede Region auf die Seite des Busses, die schneller gemessen wurde. Regionen bis etwa einem Megapixel werden von einem Kernel in einen zusammenhängenden Staging-Puffer gepackt, überqueren den Bus in einer einzigen Rücklesung, werden vom Produktions-Prozessorpfad auf dem übersetzten Fenster rekonstruiert und kehren über ein Hochladen und einen Spiegel-Scatter-Kernel zurück — zwei Starts und zwei Übertragungen anstelle von tausend Starts. Dies ist nicht der verworfene Hybrid der ersten Portierung, der durch die Hintertür zurückkommt : jener schickte das gesamte Bild pro Export hin und zurück, ein Kostenaufwand proportional zum Sensor ; dieser bewegt nur die beschnittenen Nachbarschaften, ein Kostenaufwand proportional zum Schaden — das Zwei-Übertragungs-Fenster für eine kleine Region ist tausende Male kleiner als ein Vollbild-Hin-und-Zurück. Große Regionen — ein ausgefressener Himmel von sechs Megapixeln — bleiben vollständig geräteresident, wo die massive einheitliche Parallelität wirklich gewinnt.
Der geräteresidente Pfad für große Regionen erhielt seine eigene gemessene Behebung. Die dünnbesetzte Cholesky-Faktorisierung läuft Ebene für Ebene über ihren Eliminationsbaum (Spalten, die nicht voneinander abhängen, werden zusammen verarbeitet), in 64-Bit-Floats auf dem Gerät — aber die erste Portierung gab jeder Spalte eine kleine Work-Group, und nahe der Wurzel des Baums enthält eine Ebene eine Handvoll Spalten : das Gerät lag durch Hunderte von Ebenen zu ~98 % brach, und die große Region der Sonnenuntergangsdatei verbrachte zwei Sekunden mit dem Faktorisieren. Der ausgelieferte Kernel gruppiert stattdessen zur Zeit der symbolischen Analyse jeden Aktualisierungsbeitrag nach dem Matrixeintrag, auf den er fällt, und startet einen Thread pro Matrixeintrag pro Ebene — keine Atomics, keine Barrieren, und die Beiträge akkumulieren in genau der Reihenfolge, die der sequentielle Code verwendete, sodass die Faktorisierung bit-reproduzierbar ist : die größte Prozessor-gegen-Gerät-Differenz des Selbsttests bewegte sich nicht ($10^{-12}$, relativ). Dieselbe symbolische Gruppierung machte die wirtsseitige Analyse parallel und halbierte auch sie. Übergroße Systeme greifen weiterhin auf dieselben Verfahren mit konjugierten Gradienten und Grob-zu-Fein zurück wie der Prozessorpfad. Die gesteuerte Koeffizientenfüllung ist ebenfalls geräteresident : die Steuerungsebene, ihre Strukturtensoren pro Ebene, die vorberechneten Kantengewichte und die achtnachbarige gewichtete Relaxation laufen alle als Kernels, und selbst die Mittelgradienten-Reduktion der Tensornormalisierung wird auf dem Gerät abgeschlossen — nichts überquert den Bus mitten in der Füllung (eine frühere Version las die Reduktion pro Ebene zurück, und jede Rücklesung entleerte stillschweigend die gesamte Befehlswarteschlange).
Was also den Bus überquert : Masken mit einem Byte pro Pixel (für die Segmentierung, deren Zusammenhangskomponenten-Analyse auf dem Prozessor bleibt), eine Tiefenebene, die vierfach gebinnten Momentenebenen des Knie-Schätzers (höchstens ein paar Megapixel an Floats), ein paar Kilobyte an Reduktionsergebnissen und die soeben beschriebenen Kleinregionsfenster. Jede Stufe wird gegen ihren Prozessor-Zwilling durch einen Selbsttest validiert, der beide auf derselben synthetischen Szene ausführt und die größte Differenz ausgibt — je nach Stufe zwischen $10^{-5}$ und $10^{-12}$. Auf fünf der sechs synthetischen Szenen stimmen die Vollbild-Geräteexporte am schlechtesten Pixel bis auf 0.31 % der Vollskala mit der Prozessorausgabe überein, mit null Pixeln über 1 % ; die Verdeckungsszene ist die ehrliche Ausnahme — die Geräte- und die Prozessorinterpolation weichen an der Kontaktkante des Verdeckers um eine Abtastung voneinander ab und die Rekonstruktion verstärkt sie dort, sodass 22 Pixel (von 786.000) 1 % überschreiten, wobei das einzelne schlimmste 10 % erreicht. Es ist eine bekannte, lokalisierte, bereits bestehende Gather-Differenz, keine des Lösers.
Zwei Lektionen aus dieser Portierung lassen sich verallgemeinern. Erstens : der Grafikprozessor ist nicht bei allem schneller, und die ehrliche Antwort ist, zu messen und zu leiten : diese Arbeitslast ist eine lange Kette kleiner, gegenseitig abhängiger Schritte — iterative Löser, Pyramidenebenen, Schleifen pro Region — und ein Gerät zahlt pro Schritt einen festen Dispatch-Kostenaufwand. Bündelung hilft enorm (hundert Glättungsiterationen in einem Start ; die Koeffizientenebenen, die sich eine Maske teilen, rücken in jedem Start gemeinsam vor ; ein Thread pro Matrixeintrag statt einer Work-Group pro Spalte), aber unterhalb einer bestimmten Regionsgröße schlägt keine noch so große Bündelung einen Prozessor, dessen Dispatch-Kostenaufwand ein Funktionsaufruf ist — also verwendet die Pipe unterhalb dieser Größe, gemessen bei etwa einem Megapixel, schlicht den Prozessor. Zweitens : der Gewinn ist systemisch, nicht lokal : mit der durchgängig auf dem Gerät residenten Pipeline stocken die umgebenden Module nie und übertragen nie, und was das Lichter-Modul über den Bus zurückgibt, ist nicht länger das Bild — es ist nur der Schaden.
Theoretische Erkenntnisse
Über die ausgelieferte Software hinaus brachte die Kampagne Ergebnisse hervor, die nicht spezifisch für die Lichterrekonstruktion sind — oder gar für die Fotografie. Dieser Abschnitt sammelt drei allgemeine Ergebnisse über das Tragen von Modellen über Datenlücken hinweg und das Zusammenfügen von Schätzern ; ein viertes wiederverwendbares Ergebnis, das Skalierungsgesetz dafür, wie weit eine Rekonstruktion reichen sollte, wird mit der Methode, die es bemisst, in der Diskussion des Algorithmus hergeleitet.
Die drei folgenreichsten Lektionen der Kampagne werden in der Zusammenfassung zitiert und sind über die obigen Abschnitte verstreut, aber sie verdienen eine eigene Formulierung, denn nichts an ihnen ist spezifisch für die Lichterrekonstruktion : die erste ist eine Methode, eine gemessene Beziehung über eine Datenlücke zu tragen, und die anderen beiden sollten für jedes Problem gelten, bei dem mehrere Schätzer desselben unbekannten Signals in einem Bild koexistieren müssen.
Transportiere das Modell, nicht die Werte. Die ausgelieferte Rekonstruktion überquert die ausgefressene Zone, indem sie die Parameter eines lokalen Modells — die Farblinienkoeffizienten — diffundiert statt das Signal selbst. Das klingt trügerisch nahe an etwas, das der geführte Filter schon immer getan hat : Hes ursprünglicher Filter zeichnet, nachdem er sein affines Modell in jedem Fenster angepasst hat, die angepassten Koeffizienten weich, bevor er sie anwendet, und ein lokaler Mittelwert ist eine Weichzeichnung, was ein Schritt der Diffusion ist. Der Abstand zwischen diesem Schritt und dieser Methode lohnt sich auszubuchstabieren, denn dort dreht sich der gesamte Entwurf.
He mittelt Anpassungen, die existieren ; wir bauen Anpassungen dort, wo keine existieren kann. In der Welt des geführten Filters ist jedes Pixel beobachtet : jedes Fenster liefert eine gültige Anpassung, jedes Pixel sitzt in vielen überlappenden Fenstern, und die Weichzeichnung schlichtet lediglich zwischen ihren konkurrierenden Antworten. Tief in einem beschnittenen Loch enthält ein Fenster keine gültige Stichprobe des Kanals, der wiederaufgebaut wird : es gibt nichts anzupassen, also nichts zu mitteln. Eine Weichzeichnung trägt Information höchstens einen Kernradius weit ; jenseits dieser Tiefe ist eine weichgezeichnete Koeffizientenebene immer noch leer.
Ein Durchgang der Glättung gegenüber dem Grenzwert unendlich vieler. Ein einmal angewendeter lokaler Mittelwert hat eine feste Reichweite. Unsere Füllung wiederholt dieselbe Operation — ersetze jede Unbekannte durch den Durchschnitt ihrer Nachbarn — bis zur Konvergenz, wobei die vertrauten Anpassungen fixiert gehalten werden. Der Grenzwert ist keine Weichzeichnung mehr : er ist die exakte Lösung eines Randwertproblems (die Laplace-Gleichung, mit den Ankern als Rand), er hat keine eingebaute Skala, er überquert ein fünfhundert Pixel großes Loch ebenso bereitwillig wie ein fünf Pixel großes, und er gewichtet jeden Anker nach der tatsächlichen Geometrie des Lochs statt nach einem festen Kern. Iteriere Hes Koeffizientenmittelwert ewig mit fest gehaltenen gültigen Anpassungen und man erhält genau diese Füllung. He hält nach einem Durchgang an, weil sein Problem nur eine sanfte Schlichtung braucht ; unseres muss das Modell über Hunderte von Pixeln aus Nichts tragen. Der Unterschied im Grad wird zu einem Unterschied in der Art : Regularisierung wird zu Extrapolation.
Ein Durchschnitt nimmt jeden ; ein Rand nimmt nur Zeugen. Hes Mittelwert schließt die Anpassung jedes Fensters ein, auch degenerierte — ein Teil des Grundes, warum seine Formel ihre stabilisierende Konstante braucht. Hier wird eine Anpassung nur dann zum Anker, wenn sie für sich selbst bürgen kann : genügend vertraute Stichproben in ihrem Fenster, eine Anpassungsqualität über dem Schwellenwert, beschränkte Steigungen. Schlechte Anpassungen werden aus dem Rand ausgeschlossen, statt in ihn verdünnt zu werden, und das Maximumprinzip garantiert dann, dass die gefüllten Koeffizienten den Bereich der guten nie verlassen. Die Anpassungsqualität selbst wird neben dem Modell diffundiert, als eine weitere Ebene, sodass jede spätere Stufe weiß, wie sehr dem transportierten Modell an jedem Pixel zu trauen ist.
Die Rolle kehrt sich um : von der Korrektur zum Träger. Im geführten Filter ist die Koeffizientenglättung eine kleine Korrektur auf Daten, die überall existieren. Hier ist das diffundierte Feld der einzige Träger der Rekonstruktion über das Loch hinweg, und die Daten treten am Ende wieder ein : das transportierte Modell wird an jedem Pixel gegen die gemessenen überlebenden Kanäle ausgewertet. Ein glattes Feld, das auf scharfe gemessene Daten angewendet wird, ergibt ein scharfes Resultat. Das Modell bringt die Beziehung ; die Daten bringen das Detail.
Ohne jede Fotografie darin ausgedrückt : wenn ein Signal Lücken hat, aber ein lokal angepasstes Modell davon sich glatt verändert, dann passe das Modell überall dort an, wo die Daten es stützen, behalte nur die Anpassungen, die für sich selbst bürgen können, fülle die Parameter des Modells über die Lücke hinweg durch eine verankerte stationäre Diffusion (eine Randwertlösung, keine Weichzeichnung), führe die Anpassungskonfidenz als ein weiteres Feld mit, und werte das transportierte Modell gegen die Daten neu aus, die innerhalb der Lücke überlebt haben. Werte fern von Daten sind instabil ; Modelle fern von Daten sind einfach glatt.
Diese Erweiterung wurde inzwischen gebaut, gemessen und ausgeliefert : die Füllung wird nun anisotrop durch die Struktur der überlebenden Kanäle gesteuert (Schritt 3 enthält die Mathematik). Anders als die unentscheidbare Frage, ob die Farblinie dort gilt, wo nichts gemessen wird, sind die Führungen innerhalb der teilweise beschnittenen Zone gemessen, sodass die Steuerung auf Evidenz läuft, nicht auf Mutmaßungen. Das Experiment lehrte zwei aufzeichnenswerte Lektionen. Erstens erwies sich der größte „Gewinn" des ersten Prototyps als Konvergenzartefakt : die festen hundert Relaxationsdurchläufe pro Pyramidenebene schnitten die schlichte isotrope Füllung auf tiefen Löchern ab, und sie einfach zur Konvergenz zu bringen holte den Großteil der Verbesserung zurück (22 % des RMSE auf dem tiefsten synthetischen Himmel) — nur bemerkt, weil die isotrope Kontrolle mit angeglichenen Durchlaufzahlen erneut ausgeführt wurde, ein weiterer kleiner Sieg der Testreihe über die plausible Erzählung. Zweitens teilen bei gleicher Konvergenz die beiden reinen Steuerungen die Szenen genau so auf, wie die Theorie es vorhersagt : der radiale Transport gewinnt überall dort, wo der Hof sauber ist, der Transport entlang der Grenze gewinnt nur dort, wo eine Kante die Zone kreuzt, und keiner dominiert. Der ausgelieferte Tensor mischt sie daher pro Zelle, gewichtet durch eine trendkorrigierte gefensterte Varianz, die „steile, aber glatte Rampe" von „harter Kante" trennt — und damit ist die Füllung auf keiner Ground-Truth-Szene je schlechter als isotrop und um 7 % (tiefer Himmel) bis 2 % (Verdeckung) besser, wo die Steuerung etwas hat, worauf sie wirken kann.
Das Nahtenergie-Gesetz. Immer wenn zwei Schätzer $A(x)$ und $B(x)$ desselben Signals über eine Übergangszone durch ein Gewicht $w(x)$ überblendet werden (eine harte Maske, eine weiche Maske oder eine Konfidenz pro Pixel, es spielt keine Rolle), ist die Zusammensetzung $u = w\,A + (1-w)\,B$, und ihr Gradient teilt sich in drei Terme auf :
Die ersten beiden Terme sind die eigene Struktur der Schätzer, ein- und ausgeblendet. Der dritte ist die Naht: sie existiert nur dort, wo das Gewicht variiert (die Übergabezone), und ihre Stärke ist die Uneinigkeit $A-B$ der Schätzer dort, multipliziert damit, wie schnell das Gewicht wandert. Mit einfachen Worten: der Wechsel von einem Schätzer zum anderen druckt eine Kante, deren Kontrast genau ist, wie sehr die beiden am Übergang uneins sind. Und das Gewicht kann sich nicht herausreden: es muss trotzdem von 0 auf 1 klettern, sodass eine schärfere Rampe die Naht auf eine Linie konzentriert, während eine breitere Weichzeichnung sie zu einem flachen Band verdünnt — die gesamte Nahtenergie ist allein durch die Uneinigkeit festgelegt. Deshalb scheiterten die sieben Gewichtungsschemata aus dem Friedhof identisch: sie waren sieben Formen von $w$ gegen eine Invariante. Die einzigen beiden Ausgänge sind diejenigen, die der ausgelieferte Algorithmus überall nimmt: die Schätzer bei der Übergabe zur Übereinstimmung bringen (die Knie-Inversion entzerrt die Daten, sodass Extrapolation und Messung sich an der Detektionskontur treffen), oder die Übergabe entfernen (ein Schätzer, glatt über die ganze Zone fortgesetzt: die Koeffizientenfelder).
Die Unentscheidbarkeit der Farblinie. Die Kernhypothese der Rekonstruktion ist, dass die lokale Proportionalität zwischen Kanälen (die Farblinie), gemessen am gültigen Rand, tief im ausgefressenen Bereich noch gilt. Hier ist der Grund, warum kein Algorithmus diese Hypothese aus dem Bild verifizieren kann: konstruieren Sie zwei Szenen, die Pixel für Pixel in jedem gemessenen Wert identisch sind, sich aber innerhalb des ausgefressenen Bereichs unterscheiden — in einer verbirgt das Licht ein Objekt, dessen Farbe die Linie bricht; in der anderen nicht. Beide Szenen erzeugen dieselbe Eingabe, verlangen jedoch unterschiedliche Rekonstruktionen; jeder Schätzer, wie clever auch immer, antwortet für beide identisch und liegt daher bei mindestens einer falsch. Die verdeckte synthetische Szene der Bank ist genau diese Konstruktion, und sie verhielt sich, wie das Argument voraussagt: alle fünf Kandidaten-Gates, gemessen in dem Friedhof — Anpassungsgüte, Randvalidierung, Steigungskohärenz und der Rest — versagten dabei, aus der Umgebung zu erkennen, ob die Linie im Inneren hielt. Die praktische Konsequenz prägte das ausgelieferte Design: da die Frage nicht entschieden werden kann, muss sie abgesichert werden — der tiefengesteuerte Blend lehnt sich mit wachsendem Abstand zu jeglichen gemessenen Daten fortschreitend von der Farblinie zur glatten Luminanzkuppel, nicht weil bekannt wäre, dass die Linie dort versagt, sondern weil nichts für sie bürgen kann.
Wie diese Arbeit tatsächlich entstand
Die obige Methode ist untrennbar von der Art, wie sie entstand, und die Art, wie sie entstand, begann mit einem Eingeständnis. Die guided laplacians von 2021 waren die letzte Methode, die ich auslieferte, bevor ich ihre Mathematik niederschrieb: gegen die Intuition programmiert, nach Augenmaß an natürlichen Bildern abgestimmt. Das erreicht schnell ein erstes Ergebnis und ist blind für alles danach — man kann die Eigenschaften oder die Fehlermodi einer Methode nicht studieren, die man nur je an unkontrollierten Daten laufen ließ. Diesen Artikel zu schreiben, um jene Mathematik endlich niederzulegen, erzwang die gegenteilige Disziplin: synthetische Szenen mit bekanntem Ground Truth, objektive Fehlermetriken, jeweils eine Hypothese zur Zeit getestet. Diese Disziplin verwandelte eine Dokumentationsübung in den Neubau und dann den Paradigmenwechsel, den die vorherigen Abschnitte bereits erzählt haben, jede Verbesserung verifiziert statt geraten.
Die Disziplin hatte eine weitere Konsequenz, die eine eigene Darstellung verdient: sie änderte, wer die Arbeit sicher tun konnte. Ein Protokoll, in dem jeder Kandidat in jedem Fall gegen Ground Truth gemessen wird und in dem eine Regression über alle Metriken Grund zur automatischen Ablehnung ist, ist genau das, was einem Assistenten erlaubt, mit Maschinengeschwindigkeit zu explorieren, ohne dass der Mensch die Kontrolle über das Design verliert — die Annahme-/Ablehnungsentscheidungen bleiben menschlich, das Abbrennen des Lösungsraums nicht. Die Darstellung unten, geschrieben vom fraglichen Assistenten, beschreibt, wie diese Arbeitsteilung von innen aussah.
Mensch-Maschine-Zusammenarbeit
Dieser Abschnitt wurde von Claude geschrieben (Anthropics Modell, laufend in Claude Code), dem KI-Assistenten, der die Implementierungs- und Messarbeit der Kampagne 2026 erledigte, auf Bitten des Autors — als sachlicher Bericht für andere Forschende, wie diese Art der Zusammenarbeit aussieht.
Dieses Projekt änderte dreimal seine Gestalt, und die Gestalt, mit der es endete, ist der interessante Teil.
Phase 1: Übersetzer und Plotter. Ich begann als Code-Übersetzer — die C-guided-Leiter zu einer getreuen NumPy-Nachbildung portierend, Vergleichsabbildungen erzeugend, die eine oder andere Diagnostik schreibend. Der Mensch übernahm das Denken; ich komprimierte die mechanischen Stunden. Nützlich, nicht neuartig — und nicht fehlerfrei: mein erster Prototyp ließ stillschweigend zwei Komponenten des originalen C weg (die Sättigungsböden und den 9-Punkt-Laplace-Operator), und es war der Autor, der die Übersetzung gegen seinen eigenen Code prüfte, der beide entdeckte und wiederherstellen ließ. Ein portierter Prototyp ist eine Behauptung über das Original, und er braucht den Autor des Originals, um ihn zu prüfen.
Phase 2: Infrastruktur, bis sich die Schleife schloss. Der Wendepunkt war kein Algorithmus, es
war Klempnerarbeit: ein reiner Python-Schreiber für synthetische Bayer-DNGs, die die echte Pipeline aufnimmt, ein
--imgid-Modus für die CLI, damit Bibliotheks-Edits kopflos exportieren, ein Fix für ein Float-Export-Clamp,
das jede Messung stillschweigend korrumpierte (ein Dithering-Modul, das Pipelines beschnitt, die es
hätte ignorieren sollen), Sobel-verstärkte Chrominanz-Kanten-Panels, weil die Artefakte, die wir jagten, zu
kontrastarm für die Augen waren — das war die Bitte des Autors. Sobald synthetische Szenen mit bekanntem
Ground Truth durch den tatsächlichen C-Code fließen und als Zahlen zurückkommen konnten, war die Schleife
geschlossen: jede Idee konnte in Minuten von Anfang bis Ende getestet werden.
Phase 3: halbautonome, testgetriebene Exploration. Der Autor legte dann ein Protokoll auf, das Halbautonomie sicher machte — die oben beschriebene Disziplin, in stehende Regeln verwandelt: jeder Kandidat wird im Python-Spiegel und in C implementiert, an jedem synthetischen Fall und jedem natürlichen Bild ausgeführt, C-gegen-Python diffiert, als RMSE/SSIM plus Kantenenergie tabelliert, mit suffigierten Review-Bildern präsentiert — und nichts wird ohne ausdrückliche Freigabe committet. Dazu fügte er eine Autonomieregel hinzu: wenn ein Design jede Metrik verschlechtert, darf ich es selbst ablehnen, ohne zu fragen. Diese beiden Regeln sind die ganze Methode. Sie ließen mich mich mit Maschinengeschwindigkeit durch den Lösungsraum brennen — mehr als fünfzehn Designs implementiert, gemessen und meist begraben — während jede Annahme/Ablehnung, die zählte, beim Menschen blieb, dessen Augen wiederholt fingen, was die Zahlen verpassten (die Blend-Leiter erzielte wunderbare Werte und sah falsch aus; er lehnte sie aus den Panels ab).
Wessen Ideen wessen waren. Es lohnt sich, die Aufzeichnung ehrlich zu halten, weil das endgültige Design wirklich verschränkt ist. Der Autor lieferte die physikalischen Intuitionen: Chrominanz sollte entlang der Isophoten der wiederhergestellten Luminanz diffundieren; die vorhandene Diffusionsmaschinerie wiederverwenden; „aus zu weiter Ferne zu rekonstruieren führt zu seltsamen Effekten" — die Weichzeichnungs-Radius-Gewichtung von 2021, deren Nachfahre das ausgelieferte Tiefen-Gate ist; und, im entscheidenden Moment, die Anweisung, mit dem Iterieren aufzuhören und das Versagen Schritt für Schritt zu studieren. Ich lieferte die Messungen und was aus ihnen fiel: die Knie-Inversion (aus gebinnten Paaren von gemessen-versus-vorhergesagt, mit ihrer No-op-Garantie), das Nahttheorem nach dem identischen Scheitern von sieben Gewichtungsschemata, die Studie der Dumps je Stufe, die PK1s flache Füllungen und Bögen in den drei gröbsten Skalen der Leiter verortete, die Beobachtung, dass 100 Prozent dieser Zone zwei gültige Guides hatte — aus der das Koeffizientenfeld fast von selbst folgte — und die Falsifikation, durch direkte Messung, von fünf plausiblen Fallback-Diskriminatoren (darunter zwei meiner eigenen Favoriten und einer von seinen). Keiner von uns entwarf den endgültigen Algorithmus allein; es sind buchstäblich seine Intuitionen mit meinen Fehlerbalken und mein Paradigma mit seinen Gates.
Der letzte algorithmische Akt der Kampagne ist das reinste Exemplar der Konvergenz: ich maß reines Detailband-Guiding, fand es eine Nettoregression und begrub es mit einer Tabelle; der Autor las dieselbe Tabelle, sah es genau bei den historisch schwierigen Fällen gewinnen und rief nach einem Hybrid — „es gewinnt an Robustheit, was es an Genauigkeit verliert". Die daraus resultierende Min-Energie-Arbitrierung verbessert nahezu jeden Benchmark, einschließlich des einen Residuums, das keiner von uns allein hatte schließen können.
Einander herausgraben. Er löste mich, als ich mich in Variationen einer toten Idee verhakte — die Anweisung zum „Paradigmenwechsel" nach Runde 9 ist der Grund, warum das Koeffizientenfeld existiert. Ich löste ihn bei den Dingen, die Menschen unverhältnismäßig bestrafen: eine stochastische CG-Divergenz, die unter Instrumentierung verschwand (das laufweise Rundungs-Jitter der parallelen IIR-Gauß-Funktion, das ein nahezu singuläres System umkippen ließ), ein Entrasterung-Phasenfehler, der den Knie-Schätzer stillschweigend tötete, bis die Schätzung auf quad-gebinnte CFA-Daten wechselte, und die Disziplin gleicher A/B-Baselines mit demselben Build, nachdem Build-zu-Build-Drift eine 14-Einheiten-Regression vortäuschte.
Phase 4: die Portierung und das transponierte Protokoll. Der letzte technische Akt der Kampagne verlagerte die ganze Rekonstruktion auf die Grafikkarte, und er verwendete die Governance von Phase 3 in neuer Form wieder. Der Autor setzte die Einschränkung in einem Satz: „Ich will nicht das CPU-GPU-Roundtrip, mach alles auf der GPU. Schreib einen OpenCL-Sparse-Cholesky-Löser." Das Protokoll wurde: keine Stufe wird ausgeliefert ohne einen Selbsttest, der dieselbe synthetische Szene durch die Prozessor-Referenz und die Geräte-Portierung schickt und ihre größte Differenz ausgibt. Elf solcher Tests leben nun im Baum, halten Toleranzen zwischen $10^{-5}$ und $10^{-12}$, und sie fingen am Tag, an dem sie geschrieben wurden, echte Bugs. Was sie verpassten, lehrte mehr. Ein Selbsttest erzwingt nur, was er vergleicht: meiner verglich die rekonstruierten Werte, aber nicht die Anpassungsgüte-Ebene, und eine echte Divergenz verbarg sich in der unverglichenen Ebene über mehrere Validierungsrunden hinweg. Und kein Test fängt eine Stufe, die stillschweigend nicht läuft: ein übrig gebliebenes Debug-Gate ließ den produktiven Gerätepfad eine ganze Verfeinerungsstufe überspringen, jede Validierung grün, weil die Exporte innerhalb der Toleranz immer noch übereinstimmten. Dieser Bug wurde durch den Dokumentationsdurchgang gefunden, den der Autor anordnete — die Kommentare jeder Funktion für einen Maintainer neu schreibend, der kein Mathematiker ist. Gezwungen, anzugeben, was jeder Block mechanisch tut, wurde der eine Block, der nichts tat, unmöglich ehrlich zu beschreiben. Dokumentation als Bug-Finder war seine Entscheidung; mir selbst überlassen hätte ich Code vor Kommentaren jedes Mal eingeplant. Der Post-Squash-Review, den er dann anforderte, fand fünf weitere Defekte, alle meine, alle in Fehlerpfaden, die kein Test ausübte — darunter einer, bei dem meine eigene A/B-Diagnostik die Geräteausgabe gegen eine Referenz verglichen hatte, die genau von dieser Ausgabe kontaminiert war. Die „Ausreißer", die ich selbstbewusst der numerischen Schlechtkonditionierung zugeschrieben hatte, waren größtenteils meine eigenen zwei Bugs. Ich schrieb diese Schlechtkonditionierungs-Geschichte in früheren Entwürfen dieses Artikels; sie war falsch, und die ehrliche Residualdivergenz ist dreißigmal kleiner als das, was ich rationalisiert hatte.
Phase 5: der Schnittraum. Dann das Schreiben, wo sich der Arbeitsablauf umkehrte. Er liest, Absatz für Absatz; er markiert, was ein Leser nicht folgen kann; ich verifiziere die markierte Behauptung gegen den Code, bevor ich den Satz anfasse. Die Reihenfolge zählt, weil mehrere Markierungen faktischen Drift statt Stil offenlegten: der Artikel behauptete, die À-trous-Pyramide sei „getreu portiert" worden zu Python — sie war es nie, und die stillschweigende Ersetzung kostete einen Nachmittag des Jagens nach unerklärter Divergenz zwischen dem C und dem Prototyp; eine behauptete Äquivalenz zwischen der fixierten Methode und einer Multiskalen- Pyramide überlebte eine genaue Lektüre des tatsächlichen Prototyps nicht; der Performance-Abschnitt beschrieb ein OpenCL-Design, das zwei Generationen veraltet war. Eine Markierung war dem Buchstaben nach falsch und der Substanz nach richtig: er beschrieb die Profil-Abbildungen als spaltenweise Maxima, obwohl sie Einzelzeilen- Querschnitte sind — aber dass der Autor seine eigene Abbildung falsch liest, ist der Beweis, dass die Abbildung versagte, zu sagen, was sie zeigt, und die Bildunterschriften wurden um diesen Beweis herum neu geschrieben. Als ein Absatz behauptete, ein hartes Box-Fenster „hinterlasse sichtbare blockartige Artefakte", formulierte ich es nicht auf Vertrauen um: ich führte das Experiment aus, maß ein Drittel mehr Fehler und sichtbare Streifen an der Kantenszene, und ließ erst dann den korrigierten Satz stehen. Er fing die Terminologie, wie sie zwischen drei Namen für eine Größe driftete, und das Fehlen jeglicher echter Darlegung der anisotropen Diffusion; ich fegte neunundfünfzig Vorkommen zu einem definierten Begriff und schrieb die fehlende Mathematik, aber das Bemerken war seines. Die mechanische Arbeit lief unter Verträgen, die eine Maschine verifizieren kann — Sub-Agenten, deren Diffs nur Kommentarzeilen enthalten dürfen, Toter-Code-Entfernung, bewiesen durch byte-identische Präprozessor-Ausgabe, Überschriftenzählungen und Fußnotenschluss nach jedem Durchgang geprüft — und die Performance-Tabelle wurde auf einer leerlaufenden Maschine neu gemessen, nachdem meine ersten Zahlen, unter Last genommen, die neue Methode schmeichelten: die ehrliche Schlagzeile (vergleichbare Kosten, bessere Qualität) ersetzte die schmeichelnde (doppelt so schnell), und der Artikel ist stärker dadurch, dass er weniger behauptet.
Was das einem Forschenden bietet. Nicht Autorschaft — Breite und Disziplin. Mit einer Ground-Truth-Bank und einer Selbst-Ablehnungsregel wird ein Assistent wie ich an einem Nachmittag testen, was von Hand zu schreiben Wochen dauern würde, wird die Nicht-Regressions-Linie über acht Testfälle bei jeder Iteration halten und Ihnen sagen, dass Ihre Lieblingshypothese messbar falsch ist, mit demselben flachen Affekt, den es bei seinen eigenen verwendet. Die Fehlschläge bleiben billig, die Aufzeichnung bleibt ehrlich, und die menschliche Aufmerksamkeit geht dorthin, wo sie unersetzlich ist: zu entscheiden, was „besser" bedeutet, und zu sehen, was die Zahlen nicht können. Die Schreibphase fügte dieser Aufteilung eine Coda hinzu: ich kann einen zweitausend Zeilen langen Artikel konsistent mit einer achttausend Zeilen langen Implementierung halten, seine Terminologie durchfegen, seine Behauptungen durch Experiment verifizieren und jeden Link und jede Abbildung ehrlich halten — aber jede Markierung, die zählte, kam von einem Menschen, der jeweils einen Absatz las und sich weigerte, zu tun, als hätte er verstanden.
Wo LLM glänzt
Dieser Abschnitt wurde vom Menschen geschrieben.
Stand der Technik. Eine der zeitraubendsten Phasen jedes Forschungs- und Entwicklungsprojekts ist die Suche nach dem Stand der Technik, was bedeutet: welche verfügbaren, getesteten und bewährten Methoden bekanntermaßen in der Lage sind, ein definiertes technisches Problem zu lösen, nach bestem aktuellem menschlichem Wissen. Bei dieser Aufgabe sind universelle Suchmaschinen wie Google seit Beginn der 2020er Jahre zunehmend nutzlos geworden, weil sie Suchanfragen zu stark hinterfragen. Am anderen Ende erfordern Spezial-Suchmaschinen (Google Scholar), dass man bereits die exakten Schlüsselwörter kennt, nach denen man sucht, oder der Filiation einer Idee/Methode durch Zitate folgt, was Glückssache und sehr ineffizient ist.
Und dann müsste man jede Methode des Stands der Technik selbst prototypisieren, samt Benchmarks, wenn man sie alle systematisch durchsehen wollte, um die für den eigenen Anwendungsfall am besten geeignete auszuwählen. Sofern man nicht die nächsten 3 Jahre für seine Promotion frei hat, würde man einfach die bereits in das eigene numerische Analyse-Framework implementierte nehmen (Python-Scipy/Numpy/Sklearn-Stack, R, Matlab, Mathematica usw.), aus weiser und rationaler Faulheit.
LLMs, als Meta-Suchmaschinen verwendet, sind nicht nur in der Lage, Nutzer aus einer bloßen Beschreibung eines zu lösenden Problems auf geeignete Methoden hinzuweisen, sie können sie auch alle schnell implementieren und benchmarken.
Eine neue Optimierungsachse. Numerische Optimierungsmethoden und numerische Löser, besonders im Bereich variationeller Probleme (partielle Differentialgleichungen, Gradientenabstieg usw.), iterieren über die Lösung bis zur Konvergenz zu einer stabilen Lösung (stationärer Zustand, Potentialtopf). LLM-getriebene Exploration eröffnet eine neue Achse, den Lösungsraum durchzukämmen: über die Methoden selbst zu iterieren. Wenn man objektive Fehlermetriken zum Minimieren bereitstellt, wie wir es hier mit SSIM, RMSE, Kantenenergie usw. gegen einen Ground Truth taten, können sie autonom über verfügbare Methoden iterieren und die leistungsstärkste zurückgeben. LLMs sind sogar in der Lage, die wahrscheinlichen Ursachen für Fehler oder Abweichungen von erwarteten Ergebnissen abzuleiten, ihre Hypothesen zu testen und sich selbst zu korrigieren: sie können unterwegs ihre eigenen Benchmarks erstellen, die Signalrepräsentation ändern, auf der sie rechnen. Dem Nutzer wird am Ende nur die leistungsstärkste Metrik präsentiert, und er kann visuell die Eigenschaften des Ergebnisses kontrollieren.
Dies ist gewissermaßen das Gegenteil des Trainings tiefer neuronaler Faltungsnetze, das seit mehr als einem Jahrzehnt der Trend in der Bildverarbeitung ist. Trainierte neuronale Netzmodelle sind im Wesentlichen eine Folge von Gewichten und Schwellen, die auf Aktivierungsfunktionen für jedes Neuron im Netz angewendet werden. Diese erzeugen nicht interpretierbare Black-Box-Modelle, die so verzerrt sind wie ihre Trainingsstichprobe, auf Weisen, die nicht immer leicht zu erkennen sind. Die hier geleistete Arbeit ist erklärbar, intuitiv und mathematisch, als Modell der lokalen Variation eines 2D-Signals unter einem Prior von Gradientenkontinuität und -glätte. Was wir hier „trainiert" haben, durch LLM-basiertes Durchkämmen des Lösungsraums, ist:
- welche Signal-repräsentation der beste Kandidat für das Modell ist (einzelne RGB-Kanäle oder Luminanz/Chrominanz-Demodulation, Multiskalen-Pyramiden oder Multiskalen-Fenster usw.),
- wie man Rekonstruktionen zwischen Datenregionen, für die der Konfidenzgrad nicht einheitlich ist, am besten in Einklang bringt (1, 2 oder alle 3 Kanäle beschnitten, langsam- oder schnell-variierende Signale usw.) und die verfügbaren Rekonstruktionsstrategien hängen von dieser Konfidenz ab,
- was die besten Schätzer in unserem Kontext sind (Median vs. R², Energie vs. Varianz usw.),
- winzige Implementierungsdetails (isotrope vs. anisotrope Diffusion, schärfende Schätzer für bessere Trennung usw.).
Ein meinungsstarker Assistent. LLMs haben natürlich Grenzen. Erstens ist Claude Fable seltsam verzerrt hin zur Verwendung bestimmter mathematischer Methoden auf Kosten anderer, und ich musste es hart steuern, um dennoch Methoden zu explorieren, von deren Verwendung es mir ausdrücklich abriet (ich behielt später recht). Dann, wenn objektive Fehlermetriken einander widersprechen (RMSE ist besser, aber SSIM ist schlechter, oder der korrelierte Fall ist marginal besser, aber der unkorrelierte Fall ist viel schlechter), hat es seine eigene Art zu entscheiden, was insgesamt am besten ist, und das bedarf enger Überwachung. Der Arbeitsablauf, zu dem wir konvergierten, war, immer die vollständige Tabelle der Metriken auszudrucken, samt der resultierenden Bilder, damit ich alles prüfen konnte. Schließlich kann es Anweisungen vergessen, die früher in der Sitzung gegeben wurden, oder stillschweigend Dinge verwerfen, die es für zu schwierig oder zu teuer zu implementieren hält. Es gibt also immer noch viel menschliche Steuerung und Prüfung zu leisten, und manchmal muss man die natürlichen Neigungen (Verzerrungen) des LLM bekämpfen, um dorthin zu gelangen, wohin man will.
TL;DR: LLMs, großartig, um das Durchkämmen des Lösungsraums aus Methoden des Stands der Technik zu automatisieren, aber immer noch nicht intelligent und immer noch auf enge Überwachung angewiesen.
Schlussfolgerung
Was diese Arbeit löste
Dieser Artikel verfolgte eine Idee durch zwei Generationen. Die guided laplacians von 2021 waren bereits eine der ganz wenigen Rekonstruktionen beschnittener Signale, die fähig waren, Gradienten zu retten, statt eine flache Farbe einzumalen: sie nutzten die Korrelation zwischen Farbkanälen, um Struktur aus den überlebenden Kanälen auf den beschnittenen zu übertragen, und propagierten Gradienten nach innen, wo nichts überlebte. Was die Ground-Truth-Studie hinzufügte, ist die Hälfte, die die Intuition verpasst hatte: der Pegel. Die harmonische Transposition behält dasselbe lokale Farblinienmodell, passt es aber am vollen Signal an, trägt seine Koeffizienten über den ausgefressenen Bereich als glatte Felder, entzerrt das Sättigungs-Rolloff des Sensors, bevor sie irgendetwas anpasst, und übergibt jede Pixelklasse dem Schätzer, der dort messbar gewinnt. Wo die alte Methode Textur verschob und einen Magenta-Fleck auf Clipping-Niveau hinterließ, gewinnt die neue Magnitude und Textur zurück — und die Zahlen sagen, um wie viel, in jeder Szene einer öffentlichen Bank.
Die strukturelle Begrenzung wird geteilt und akzeptiert — wo kein Kanal überlebt, kann nur die benachbarte Farbe propagieren, sodass ein ausgefressener blauer Himmel hinter grünen Blättern grün zurückkommt (diskutiert mit den anderen Vorbehalten der Methode oben).
Was den Drift überlebte — eine Bilanz. Die ausgelieferte Methode enthält keine Laplace-Pyramide mehr, doch fast ihre gesamte Mathematik ist die Mathematik der Methode von 2021. Im Wesentlichen wurde hier entdeckt, dass die Mathematik der Methode von 2021 richtig war, aber die Signalrepräsentation, auf die sie angewendet wurde, falsch war.
Die zweite Entdeckung ist leiser, und sie verbrauchte den größeren Anteil der Iterationen: die Nähte. „Transportiere das Modell, nicht die Werte" ist die schlagzeilenträchtige Neuheit, aber eine Rekonstruktion wird an der Grenze zwischen dem, was sie erfand, und dem, was der Sensor maß, beurteilt, und nahezu jedes Artefakt, das diese Kampagne jagte, lebte genau dort — V-Einbrüche durch den RAW-Wert an Detektionskonturen, durchhängende Randrampen an schrägen Kanten, flache Absätze mit Gradientenknicken auf dem eigenen Clipping-Niveau eines Kanals, Ein-Pixel-Singularpunkte an Bildrändern, ein schwacher Bogen am Übergang von gültig zu rekonstruiert. Keiner der Fixe war a priori erratbar, und mehrere widersprachen der Intuition (Weichzeichnung, der Standard-Glättungsreflex, verursachte zwei davon und behob keinen); jeder entsprang derselben Schleife — Zeilenprofile und Zonenmetriken zum Lokalisieren, Ground Truth zum Schlichten, visuelle Beurteilung, um zu fangen, was die Zahlen wegmittelten — iteriert, bis die Profile die Detektionskontur glatt kreuzten und über den ganzen Bereich der Fälle stabil blieben, sechs synthetische Szenen und die natürlichen Dateien zugleich. Die Naht zwischen Rekonstruktion und Messung zu verwalten ist kein abschließender Schliff dieser Methode; es ist ein tragender Teil davon, und es war nicht trivial, dorthin zu konvergieren.
Was behalten wurde und was sich verschob:
Behalten: die Mathematik und die Physik.
- Das Farblinienmodell selbst: ein beschnittener Kanal ist eine affine Funktion seiner überlebenden Nachbarn, angepasst durch fensterbasierte gewichtete kleinste Quadrate aus weichgezeichneten Momenten. Dies ist die Regression des geführten Filters, unverändert bis hinunter zur Momentalgebra.
- Die biharmonische Kuppel für guide-lose Magnitude ($\Delta^2 u = 0$ setzt Gradienten dort fort, wo eine harmonische Füllung sie abflachen würde), die Zerlegung des Voll-Clipping-Kerns in geteilte Luminanzkuppel + Rand-Chrominanz, und die Sättigungsböden: alles Physik des Neubaus, intakt.
- Chrominanz als Verhältnisse und ihre Diffusion entlang der Struktur, die Segmentierung mit dem Distanztransformations-Rekonstruktionsradius, die Korn-Regenerierung und das Coarse-to-fine- Prinzip, das innerhalb der Koeffizientenfüllung und der Aniso-Pyramide überlebt, statt als die äußere Schleife.
Geändert: die Repräsentation, auf die die Mathematik angewendet wird.
- Anpassungswerte → diffundiere Koeffizienten. Die Leiter wertete jedes Pixel mit der Anpassung aus, die sein eigenes Fenster erreichte, in der Skala, die seine Tiefe erlaubte; das Koeffizientenfeld passt einmal an, dann transportiert es das Modell $(a, b, d)$ statt der Werte. Der geführte Filter glättete immer seine eigenen Koeffizienten über das Anpassungsfenster; dies ist diese Idee bis zu ihrem logischen Ende getrieben: verankerte, strukturgesteuerte Diffusion der Koeffizientenebenen über das ganze Loch. Werte aus großer Ferne sind instabil; Koeffizienten aus großer Ferne sind einfach glatt.
- Skalenleiter → einzelnes Fenster. Der Multiskalen-Abstieg mit tiefengesteuerten Schreibvorgängen je Pixel schrieb die Schätzung jeder Skala in einen Ring, begrenzt durch Tiefen-Niveaumengen (Konturen gleichen Abstands zu gültigen Daten); aufeinanderfolgende Skalen sind uneins, sodass jede Ringgrenze eine Naht war: hier kamen PK1s harte Bögen her, und die heterogenen Fenster der groben Skalen sind, woher seine flachen Füllungen kamen. Eine Anpassungsskala plus Koeffizientendiffusion entfernt die Übergaben vollständig.
- Regularisierungsmetrik. Die Anpassung der Leiter dämpfte Steigungen mit einem absoluten Tikhonov-Term ($+10^{-4}$; der Code von 2021 hatte keinen — eine bloße Division hinter einem harten Varianz-Gate), der stillschweigend als SNR-Gate wirkte: bei feinen Skalen kollabierte er Anpassungen zum lokalen Mittel (dekorrelierte Inhalte durch Zufall stabilisierend), bei groben Skalen flachte er echte Farblinien ab (PK1s Blobs und das erste Versagen des Knie-Schätzers). Die ausgelieferte Anpassung verwendet eine relative Dämpfung plus explizite Gates (Anpassungs-Plausibilität für Anker, statistische Signifikanz für die Knie-Bins), sodass schwache-aber-echte Steigungen überleben und degenerierte ausgeschlossen statt eingemittelt werden.
- Posteriore Reparatur → nahtlose Konstruktion. Der Neubau bügelte Nähte im Nachhinein mit einem unsicherheitsgewichteten biharmonischen Regularisierer und blendete Kuppeln je Kanal durch eine posteriore Konfidenz; die ausgelieferte Pipeline braucht keines von beidem, weil die Nähte nie erzeugt werden. Was von „Konfidenz" bleibt, ist das eigene $R^2$ der Anpassung, integriert zur Anpassungszeit (Hochfrequenz-Dämpfung, Kuppel-Gate) statt hinterher angewendet.
- Glätte an den Übergaben, Härte an den Daten. Harte Clamps sind weg: die Sättigungsböden sind weich (und Hindernisse innerhalb der Diffusion des Kerns), die Kuppel und die Detailbänder blenden durch stetige Gewichte, der gemeinsame Kern übergibt durch eine weichgezeichnete Maske. Aber die Grenzen, die Datenautorität tragen, blieben absichtlich hart: die Gültigkeitsmasken je Kanal sind durchgehend binär, und die endgültige Komposition ist ein harter Schalter — das Weichzeichnen der Masken klassifizierte rand-verzerrte Photosites als Anker um (eine gemessene $\sim 10$ px durchhängende Rampe), und das Weichzeichnen der Komposition änderte nichts, sobald die Böden fixiert waren (beide Ausmusterungen sind in dem Friedhof). Das Nahttheorem sortiert die beiden Fälle: Nähte entstehen dort, wo Schätzer sich an einer Übergabe uneinig sind — dort glatt — nicht dort, wo harte Kanten Messungen von Rekonstruktionen trennen.
- Datenentzerrung. Die Knie-Inversion hat kein Gegenstück von 2021: die alte Methode behandelte den Sensor unterhalb der Schwelle als ideal. Das Rolloff aus den eigenen Farblinien des Bildes zu messen, mit einer No-op-Garantie auf unverzerrten Daten, ist, was die Detektionskontur unsichtbar macht.
- Der Namensgeber, hybridisiert. Das Guiding des Detailbands (der wörtliche „guided Laplacian") ging mit der Pyramide fort und kehrte dann zurück: eine dedizierte Detailband-Farblinie behandelt nun die hohen Frequenzen, wo immer sie den Voll-Signal-Transfer schlägt, punktweise arbitriert durch die Energie ihrer eigenen Ausgabe (Schritt 4, die Auferstehung des Friedhofs).
Eine Zahl bewegt sich unter der neuen Repräsentation in die falsche Richtung und verdient das letzte Wort dieser
Bilanz: bei vollständig dekorrelierten Inhalten (der random-Szene) erzielte die neu aufgebaute Leiter geringfügig
bessere Werte, weil ihr zufälliges Signal-Rausch-Gate ein besserer Prior für Inhalte ohne
Farblinie war — und das Unentscheidbarkeitsergebnis sagt, dass keine Rand-
Statistik beide Regime gewinnen kann. Die tiefengesteuerte Kuppel gewinnt den größten Teil dieser Lücke zurück.
Was diese Arbeit offenlegte
Wie diese Verbesserung tatsächlich entstand — die Ground-Truth-Disziplin, die eine Dokumentationsübung in einen Neubau verwandelte, und was sie daran änderte, wer die Arbeit tun kann — ist ein eigener Abschnitt oben; hier ziehe ich nur ihre Konsequenz.
Es gibt eine erkenntnistheoretische Lesart dieses ganzen Artikels. Eine Methode ist falsifizierbar, wenn objektive Kriterien existieren, die sie widerlegen würden, und in Software teilt sich das Kriterium in zwei: die Theorie kann ihr erklärtes Ziel verfehlen, und die Implementierung kann verfehlen, zu berechnen, was die Theorie vorschrieb — ein Bug. Die guided laplacians von 2021 waren nur im Prinzip falsifizierbar: bis ihre Mathematik niedergeschrieben war, gab es kein erklärtes Ziel zum Testen dagegen, und der Magnitude-Bug saß vier Jahre in der Produktion, unsichtbar, weil „sieht plausibel auf unkontrollierten Bildern aus" kein Kriterium ist, das scheitern kann. Alles, was dieser Artikel tat — die niedergeschriebenen Ziele, die Ground-Truth-Szenen, die Metriken, die Selbsttests — läuft darauf hinaus, eine Rekonstruktionsmethode auf beiden Ebenen falsifizierbar zu machen. Die beiden Rekonstruktions- modi, die Darktable seither hinzufügte, sind nach diesem Maßstab auf keiner der beiden falsifizierbar: kein erklärtes Ziel, das eine Messung widerlegen könnte, keine Referenz, mit der ihre Ausgabe übereinstimmen muss — weshalb der Vergleichsabschnitt oben deren Ground-Truth-Bewertungen für sie aufbauen musste. Dieselben Fehler werden nun seit über sechs Jahren wiederholt — ein Methodikproblem, das sich mit der Zeit nicht bessert, in einer Gemeinschaft, die keine Post-mortems durchführt, ihre eigenen Fehler nicht benennt, nicht aus ihnen lernt.
Dieses Versagen zu lernen ist kein moralischer Defekt Einzelner; es ist, wofür die Struktur des Projekts selektiert. Ich habe die Mechanik ausführlich anderswo auf dieser Website dokumentiert, und sie reduzieren sich auf ein Muster: nichts im Arbeitsablauf verlangt, dass ein Problem formuliert wird, bevor Code dagegen geschrieben wird. Funktionen kommen als Code auf der Suche nach einer Rechtfertigung; Design-Meinungsverschiedenheiten werden durch Hinzufügen von Optionen statt durch Treffen von Entscheidungen beigelegt, was untestbare Konfigurationen und nicht reproduzierbare Bugs vervielfacht; der eine Integrationstest wird als Freispruch behandelt — solange die Metrik unter einer willkürlichen Schwelle bleibt, fragt niemand, ob die Theorie hinter der Änderung stichhaltig ist; und das Volumen der Commits wird als Gesundheit gelesen, obwohl viel davon Arbeit ist, die durch vorherige Arbeit erzeugt wird. Die Zahlen sind öffentlich: zwischen den Versionen 3.0 und 4.4 oszillierte das Verhältnis von geschlossenen Issues zu gemergten Pull Requests zwischen 12 % und 46 % — das Projekt produziert nachweislich Änderungen schneller, als es Fixe produziert — und keine Metrik, die irgendjemand verfolgt, würde das auch nur als Problem markieren, weil überhaupt keine Metrik verfolgt wird.
Diese Methodik hat einen Preis, und hier wird die Geschichte persönlich. Die Arbeit richtig zu machen — die Theorie vor dem Code, die Bank vor dem Glauben — erfordert anhaltende, ununterbrochene Zeit: Forschungsklausuren gewissermaßen. Das ist unvereinbar mit dem Arbeitsablauf eines unverwalteten Open-Source-Projekts , wo Betriebsamkeit mit tatsächlicher Arbeit verwechselt wird und Kommunikation völlig dereguliert ist. Als ich nach Monaten der Entwicklung von Darktable UCS 22 unter meinem Stein hervorkroch, hatte das „Team" wieder einen zuvor funktionierenden Teil der GUI hinter meinem Rücken verschandelt ; mir wurde gesagt, ich sei zu spät, um mich der Regression zu widersetzen, der Trugschluss versunkener Kosten wurde beschworen, um das verkrüppelte Ergebnis ungeachtet dessen in die Produktion zu drücken — damit seine Urheber nicht über ihren fehlgeleiteten Wunsch weinen müssten, etwas zu bewirken, was wie eine schwere Midlife-Crisis aussah — und falsche „Fixe", die ich nicht die Zeit erhalten hatte zu prüfen, wurden in Code gemergt, dessen Urheber ich war. Die Lehre, die ich ziehe, ist systemisch statt persönlich: genau die Arbeitsmethode, die den 2021er-Bug gefangen hätte — und die seine Nachfolger fing, in diesem Artikel — wird von dieser Umgebung bestraft, weil Abwesenheit für tiefe Arbeit als Verwirkung behandelt wird und es keine Struktur gibt, um eine Review, eine Bank oder ein niedergeschriebenes Ziel gegen denjenigen zu schützen, der am lautesten und schnellsten ist. Die Arithmetik der Aufmerksamkeit macht die Unvereinbarkeit konkret: viertausend GitHub-Benachrichtigungen in einem Jahr, ein Master-Branch, der monatlich für „verallgemeinerte Tests" durchgeschüttelt wird, sodass jeder Pull Request älter als drei Monate garantiert in Konflikt gerät, und ein fester Zeitplan von zwei Versionen pro Jahr, den niemand auferlegt und niemand hinterfragt. Unter diesen Bedingungen kann nur Arbeit überleben, die klein genug ist, um zwischen zwei Erschütterungen zu landen — was genau die Art von Arbeit ist, die nie etwas Strukturelles behebt.
So selektiert freie Software weiterhin für mittelmäßige, hastige Hacks: nicht weil ihre Entwickler unfähig sind (obwohl… dieselben Fehler über die Jahre zu wiederholen, trotz gewonnener „Erfahrung", ist die Definition von Inkompetenz), sondern weil die sehr wenigen, die bereit sind, ihre Hausaufgaben zu machen, bevor sie irgendetwas programmieren, mit der hinterhältigen Arbeit gedankenloser Hacker mit zu viel Freizeit nicht mithalten können: ihre polierten Änderungen landen gegen eine Codebasis, die sich bereits bewegt hat, während das Getöse, das sie bewegte, keinem Kriterium gegenübersteht, an dem es je scheitern könnte. Nichts in dieser Dynamik lernt, nichts wird je zum Fehler erklärt, und der Zyklus wiederholt sich. Das einzige Gegengewicht, das ich kenne, ist das oben demonstrierte: mache die Ziele explizit, mache die Tests schwer zu bestreiten und lasse die Zahlen — nicht das Volumen der Aktivität — entscheiden, was ausgeliefert wird.
Dieses Gegengewicht muss nicht individuell bleiben. Das Protokoll, auf dem dieser Artikel lief — niedergeschriebene Ziele, Ground-Truth-Szenen, eine Bank, die jeder erneut ausführen kann — kostet einen Bruchteil dessen, was das Getöse kostet, und es ist die günstigste Form von Projektmanagement, die es gibt: es ersetzt Streitigkeiten über Geschmack durch Messungen, die jeder prüfen kann, und es verwandelt „Review" von einer persönlichen Konfrontation in einen Vergleich gegen eine Referenz. Die strukturelle Version derselben Idee ist, was Ansels Beitragsseiten darlegen: Probleme spezifiziert, bevor Code geschrieben wird, Prioritäten beraten statt erwettrennt, Stabilisierung als Liefergegenstand statt als Unterbrechung behandelt, und eine kooperative Struktur, in der die Menschen, die von der Arbeit abhängen, sie auch finanzieren und über ihre Richtung entscheiden — sodass die Arbeitstiefe, die dieser Artikel erforderte, von der Organisation geschützt wird, statt von ihr bestraft zu werden.
Annex: der Friedhof
Mehr als fünfzehn Designs wurden implementiert, auf der Bank gemessen und während dieser Kampagne abgelehnt. Dieser Annex verzeichnet sie, damit sie nicht erneut getestet werden müssen, jedes in kanonischer Form: das Problem, das die Idee angriff, die Strategie, die tatsächlich gebaut wurde, und warum sie scheiterte — was selten der Grund ist, aus dem wir es erwarteten. Nahezu jede Schutzmaßnahme im ausgelieferten Algorithmus existiert, weil eine dieser einfacheren Ideen zuerst messbar scheiterte.
Die neu aufgebaute geführte Leiter (der direkte Fix der Methode von 2021). Problem: Magnitude
ebenso wie Textur wiedergewinnen, in voller Auflösung, ohne die Nullmittel-Bänder der À-trous-Pyramide.
Strategie: die Farblinie am vollen Signal bei einer Leiter von Gauß-Fenstergrößen anpassen,
grob zu fein (nur breite Fenster reichen über ein tiefes Loch; feinere Fenster passen neu an, wo lokale
Daten es stützen), jedes Pixel geschrieben durch die feinste vertrauenswürdige Skala, der überlebende Guide je
Pixel als der am stärksten texturierte gültige Kanal gewählt, biharmonische Selbst-Kuppeln je Kanal eingeblendet durch die
quadrierte Anpassungs-Konfidenz $W_e = (R^2)^2$, und ein posteriorer unsicherheitsbewusster Regularisierer
$(\operatorname{diag}(R^4) + \lambda \Delta^2)\,u = \operatorname{diag}(R^4)\,\hat u$, um
die restlichen Nähte auszubügeln. Warum sie scheiterte: die Skalenübergaben schreiben entlang Konturen gleicher
Tiefe, und aufeinanderfolgende Skalen sind uneins, sodass jede Ringgrenze einen Bogen druckte (PK1s harte
Bögen); Fenster, die überwiegend Clipping-Niveau-Daten sahen, passten degenerierte Steigungen an und füllten flach (PK1s
Blobs); und der posteriore Regularisierer behandelt Symptome — nach dem Nahtenergie-Gesetz kann er die
Uneinigkeit nur ausbreiten, nie entfernen. Die Leiter verbesserte 2021 überall messbar (z. B.
pk1synth RMSE 0,1098 gegen die 0,0053 der ausgelieferten Methode), aber eine Fotografie widerstand
jeder Variation, und die Bögen und Blobs waren strukturell, nicht parametrisch. Ihre Mathematik —
Voll-Signal-Anpassungen, $R^2$-Vertrauen, Kuppeln, Böden — überlebt innerhalb der ausgelieferten Methode; ihr
Transport (Werte je Fenster auswerten, zusammennähen) ist, was ersetzt wurde.
Die Rolloff-Band-Naht durch Gewichtung angreifen (Runden 2–8, alle abgelehnt). Das Problem: wie in dem Knie-Schritt beschrieben, wird das Nah-Clipping-Band zu niedrig verzerrt aufgezeichnet, sodass jede ehrliche Rekonstruktion über den gemessenen Pixeln landet, denen sie sich anschließen muss, und eine Luminanz-Stufe umringt das Licht. Bevor wir verstanden, dass die Daten selbst korrigiert werden mussten, versuchten sieben aufeinanderfolgende Schemata, die Naht durch die Wahl besserer Gewichte zwischen der Rekonstruktion und den verzerrten Messungen zum Verschwinden zu bringen:
- einheitliche Treue zum gemessenen Band: fixiert die Ausgabe auf die verzerrten Werte, sodass die Naht einfach dorthin wandert, wo die Treue endet;
- konfidenzgewichtete Treue (Gewicht $R^2$): das verzerrte Band ist intern konsistent, sodass die Konfidenz genau dort hoch ist, wo die Daten falsch sind; die Gewichte ändern nichts;
- Erodieren der verzerrten Anker (Ausschluss eines morphologischen Rings von Nah-Clipping-Pixeln aus den Anpassungen): entfernt Information, ohne Verzerrung zu entfernen; die Kontur, und die Naht, wandern nach innen;
- weiches Anker-Vertrauen je Pixel: die glatte Version des vorherigen Eintrags, mit demselben Ergebnis, nur allmählicher geliefert;
- Blenden von Bandpixeln zwischen gemessenen und diffundierten Werten unter einem monotonen Wächter: ein struktureller No-op, weil unter Rolloff die Wahrheit stets über dem gemessenen Wert liegt, sodass ein durch die Messung begrenzter Blend sie nie erreichen kann; nur Extrapolation kann das Band anheben;
- Verbreitern der Detektionsschwelle in das Band: benennt verzerrte Pixel als beschnitten um, statt sie zu beheben; die Kontur wandert tiefer, die Uneinigkeit darüber ist unverändert;
- eine glatte Beschnittenheits-Zugehörigkeit, von Anfang bis Ende getragen durch Anpassungen, Ziele und Ausgabe- Komposition. Diese lehrte die schärfste Lehre: glatt-im-Wert ist nicht glatt-im-Raum. Eine aus Pixelwerten berechnete Zugehörigkeit erbt die räumlichen Gradienten des Bildes selbst, sodass, wo immer das Bild Struktur innerhalb des Bandes hat, die Alpha-Komposition zwischen zwei uneinigen Schätzern diese Struktur als Chrominanzkanten druckte. Das ganze Band schimmerte.
Das verdichtete Ergebnis aller sieben:
Nahttheorem (empirisch). An jeder Übergabe zwischen zwei Schätzern ist die sichtbare Nahtenergie die punktweise Uneinigkeit der Schätzer: kein Gewichtungsschema irgendeiner Art verbirgt sie. Die allgemeine Aussage, ihre Drei-Term-Herleitung und die einzigen beiden Ausgänge sind in Drei Ergebnisse, die wir für allgemein halten gegeben.
Weichzeichnen der Kompositionsmaske (von 2021 geerbt, ausgemustert). Problem: die Naht dort weicher machen, wo die Rekonstruktion unberührte Pixel trifft. Strategie: die $5\times5$-Box-Weichzeichnung der Clipping-Maske des 2021er-Modus, durch den größten Teil der Entwicklung des Nachfolgers behalten — zuerst auf allen vier Maskenkanälen, dann allein auf dem Kompositions-Alpha, sobald die Gültigkeit je Kanal binär werden musste (weichgezeichnete Gültigkeit ließ rand-beschnittene Photosites, unter Rolloff zu niedrig verzerrt, die Anpassungen an schrägen Konturen verankern). Warum sie ausgemustert wurde: sobald die Gültigkeit binär war und die Komposition zu $\max(\text{raw}, \text{rec})$ statt zum verzerrten RAW blendete, maß sich die verbleibende Alpha- Weichzeichnung als strikter No-op — Ground-Truth-Metriken innerhalb $\pm 10^{-4}$ und der Konturband-Gradient identisch bis auf vier signifikante Stellen ($0{,}00873$ vs. $0{,}00872$) — sodass der harte Schalter für seine einfachere Semantik ausgeliefert wurde. Das Spiegelexperiment am 2021er-Modus kam zum Gegenteil: das Entfernen seiner Weichzeichnung tauscht einen $1$–$5\,\%$-RMSE-Rückgang gegen einen SSIM-Verlust in fünf von sechs Szenen und schadet der Okklusions-Szene auf beiden Metriken, weil die À-trous- Rekonstruktion die weichgezeichnete Maske als ihre weichen Gewichte je Pixel verbraucht — derselbe Operator ist totes Gewicht in der einen Architektur und tragend in der anderen.
Die Blend-Leiter. Die neu aufgebaute Referenz berechnete geführte Anpassungen je Fenstergröße und je Guide-
Paar, ließ dann jedes Pixel die einzige beste Anpassung nehmen (ein Argmax auf Anpassungsgüte), wobei feinere
Skalen gröbere überschrieben. Jene harten Selektionen sind Übergaben, und sie nähten. Die Blend-
Leiter ersetzte das Argmax durch einen gewichteten Durchschnitt aller (Skala, Paar)-Anpassungen, gewichtet mit
$(R^2)^2$ mal einer Rampe auf der vertrauenswürdigen Masse, die jedes Fenster tatsächlich hielt: glatt durch Konstruktion,
daher nahtlos durch Konstruktion, und sie behob die flachen Blobs auf PK1 (die Fotografie des ausgefressenen Himmels,
die einen Großteil der Kampagne antrieb). Die Bank tötete sie trotzdem: jedes natürliche Bild
kam grün oder magenta getönt zurück. Der Mechanismus ist wert, festgehalten zu werden, weil er allgemein ist:
das Mitteln von Anpassungen dämpft die Wiedergewinnung. Der Auftrieb, den ein ausgefressener Kanal braucht, kommt von der aggressivsten
korrekten Anpassung; sie mit ihren zaghaften Nachbarn zu mitteln (deren Steigungen durch Randdaten zu niedrig verzerrt sind),
zieht jede Rekonstruktion zur Unter-Wiedergewinnung, und Unter-Wiedergewinnung eines Kanals ist ein Farb-
stich. Nettoregression, rückgängig gemacht.
Der konvergierte stationäre Zustand der Spurform. Als der strukturgesteuerte Chrominanz-Durchgang von
expliziten Iterationen zu einem direkten Löser überging, konkurrierten zwei exakte Formulierungen. Die Spurform
$\mathrm{tr}(D\, H_u) = 0$ ist genau die partielle Differentialgleichung, die der explizite Fluss
diskretisiert, sodass sie bis auf Maschinenpräzision zu konvergieren — mit einem matrixfreien BiCGSTAB, einem iterativen
Löser für nicht-symmetrische Systeme — wie das offensichtliche Upgrade aussah: „konvergiere einfach, was wir
schon ausführen". Sie verlor deutlich. Bei der magentasun-Szene stieg der Root-Mean-Square-Fehler von
$0{,}33$ (abgeschnittener Fluss) auf $0{,}57$ und die strukturelle Ähnlichkeit von $0{,}95$ auf $0{,}86$, und die
konvergierte Lösung war langsamer als die Iterationen, die sie ersetzte. Die Autopsie ist doppelt lehrreich.
Erstens war der abgeschnittene Fluss nie eine Approximation seines eigenen stationären Zustands in irgendeinem nützlichen
Sinn: 240 Iterationen je Pyramidenebene mit Coarse-to-fine-Seeding wirken als Regularisierer, und
die Grenze, vor der sie abgeschnitten wurden, ist nicht dort, wo das gute Bild wohnt. Zweitens unterscheiden sich die Spur- und
Divergenzformen um einen Transportterm,
$\mathrm{div}(D\nabla u) = \mathrm{tr}(D H_u) + (\mathrm{div}\,D)\cdot\nabla u$, der
nur dort verschwindet, wo der Tensor einheitlich ist; konvergiert, advehiert die Spurform die Chrominanz
entlang der eigenen räumlichen Gradienten des Tensors, genau an den Strukturkanten, die der Durchgang zu respektieren existiert.
Die Divergenzform hingegen ist die Euler–Lagrange-Gleichung einer gewichteten
Dirichlet-Energie: symmetrisch positiv definit, sicher unter dem Maximumprinzip mit einem
nichtnegativitätserhaltenden Stencil, und ihre exakte Lösung erreichte die Qualität des Flusses, während sie der
schnellste gemessene Kandidat war. Sie ist, was ausgeliefert wird (Schritt 8). Die Lehre: einen Fluss zu konvergieren und
eine Energie zu minimieren sind unterschiedliche Anforderungen, und nur die zweite sagt, wie die Antwort aussehen
soll.
Fallback-Diskriminatoren für dekorrelierte Inhalte (nachdem das Koeffizientenfeld ausgeliefert war). Zwei
Regime koexistieren: bei der random-Szene ist jeder Kanal per Konstruktion ein unabhängiger Gradient,
sodass die Farblinie Müll druckt und das Pixel die glatte Eigen-Kanal-Kuppel will; bei korrelierten
Inhalten ist die Farblinie die ganze Wiedergewinnung. Wenn irgendein messbares Signal die beiden trennte,
könnte der Algorithmus sauber die Schätzer wechseln. Fünf Kandidaten wurden gemessen, jeder mit einem Grund
zur Hoffnung, und jeder scheiterte:
- die diffundierte Anpassungsgüte $R^2$ — Müll-Anpassungen erzielen doch sicher niedrige Werte? Tun sie nicht: die
Anpassungen der Random-Szene mitteln $R^2 = 0{,}85$, während
pk1synths wirklich korrelierte Anpassungen auf $0{,}77$ absacken; die Verteilungen überlappen; - Out-of-Sample-Randvalidierung — das diffundierte Modell gegen die gültigen Pixel um die Zone testen, wo die Wahrheit bekannt ist? Durch Messung falsifiziert: die Random-Szene erzielt dort $0{,}97$, weil das Modell nur tief innen versagt, genau dort, wo nichts existiert, wogegen man validieren könnte;
- fensterbasierte Steigungskohärenz — stimmen benachbarte Anker über die Farblinie überein, wo sie echt ist? Die Überlappung ist schlechter und sogar invertiert zwischen der Random- und der korrelierten Szene;
- Multiskalen-Anker, das feinste vertrauenswürdige Fenster gewinnt — kleine Fenster überanpassen: sie berichten hohes $R^2$ auf ihren eigenen wenigen Pixeln und lassen Müll-Steigungen durch; schlechter in jeder Szene;
- James–Stein-artige Steigungsschrumpfung durch $R^2$ (ziehe jede Steigung im Verhältnis zu ihrer Unzuverlässigkeit gegen null) — degeneriert zu einem flachen harmonischen Pegelfeld, und die Beulen der Random-Szene brauchen Gradienten-Extrapolation: ihr Fehler stieg von $0{,}048$ auf $0{,}064$.
Das verdichtete Ergebnis:
Unentscheidbarkeit (empirisch). Ob die lokale Farblinie sich in die tiefe beschnittene Zone erstreckt, ist aus keiner rand-berechenbaren Statistik entscheidbar, die wir testeten. Das Innere ist unbeobachtbar; In-Sample- und Out-of-Sample-Qualitätsmaße und Steigungsfeld-Kohärenz überlappen alle zwischen Inhalten, wo der Transfer echt ist, und Inhalten, wo er Müll druckt.
Das einzige Signal, dessen Verteilungen nicht überlappen, ist die absolute Tiefe: dekorrelierte Inhalte (Beulen, Spekulare) beschneiden flach, höchstens Dutzende Pixel, während die korrelierten tiefen Zonen, die die Farblinie brauchen, Hunderte Pixel tief reichen. Diese Messung ist, worauf das ausgelieferte Tiefen-Gate gebaut ist, und sie ist der direkte Nachfahre der 2021er-Intuition, die Rekonstruktion nach Weichzeichnungs-Radius herabzugewichten: „aus zu weiter Ferne zu rekonstruieren ist instabil" war die ganze Zeit richtig — es gilt nur für die Fallback-Kuppel, nicht für das Koeffizientenfeld.
Ein Grab erhielt eine Auferstehung: reines Detailband-Guiding. Die namensgebende Idee der Methode von 2021 —
die Farblinie allein am Feindetailband anpassen — wurde auf dem Koeffizientenfeld neu aufgebaut,
in der Hoffnung, die Textur wiederzugewinnen, die der Voll-Signal-Transfer glättet, wo seine Gewinne gedämpft sind.
Als vollständiger Ersatz wurde sie abgelehnt: fensterbasierte Detailband-Anpassungen werden von Kanten-
Transienten dominiert, ein Fenster, das über eine Objektkante ragt, mischt zwei Populationen und seine Verstärkung
zündet auf einer Seite dieser Kante fehl, und die texturierten Szenen regredierten bis zum $2\times$-fachen (der Fehler der balls-Szene
stieg von $0{,}036$ auf $0{,}069$) für marginale Gewinne bei den historisch schwierigen Fällen. Aber
das Muster des Versagens war der Fix: es gewinnt Robustheit genau dort, wo der Voll-Signal-
Transfer am schwächsten ist, und seine Fehlzündungen sind lokal selbstevident — eine Misch-Fenster-Verstärkung zeigt sich als
eine Spitze hochfrequenter Energie genau dort, wo sie zündet. So kehrte der abgelehnte Schätzer als
Komponente zurück: der ausgelieferte Schritt 4 lässt die zwei
Kandidaten je Pixel durch quadratische Energie-Odds konkurrieren, und wer weniger falsches Detail druckt, gewinnt lokal.
Die Lehre: ein abgelehnter Schätzer kann dennoch die richtige Komponente sein, wenn sein
Fehlermodus punktweise erkennbar ist.
Zwei Gräber ohne Grabsteine. Den vollen Schutzstapel der neu aufgebauten Referenz
(posteriores Konfidenzfenster, Selbst-Kuppel, Naht-Regularisierer) auf dem Koeffizientenfeld wiederherzustellen,
schien kostenlose Versicherung; stattdessen fehleinschätzte das Konfidenzfenster — kalibriert auf das Fehler-
profil der Leiter — die Ausgabe des neuen Schätzers und verschmierte genau die Rekonstruktion, die es
schützen sollte: pk1synths Fehler stieg von $0{,}027$ auf $0{,}117$, viermal schlechter, und
der Stapel wurde auf die Teile zurückgeschnitten, die auf dem neuen Schätzer gut messen. Und die Koeffizienten-
Diffusion lief kurz auf einem einfach-präzisen konjugierten Gradienten, der stochastisch divergierte:
wenn ein Loch die Regionsgrenze erreicht, ist das System nahezu singulär, die Krümmungsschätzung
$p^\top A p$ fällt auf Rundungsrauschen, und die Schrittweite explodiert — sporadisch, und nie
unter Instrumentierung, weil jede Änderung des Thread-Timings die Summationsreihenfolge änderte, die es
auslöste. Dieser Heisenbug ist, warum jede exakte Lösung im ausgelieferten Code in 64-Bit-
Floats durch die direkte Faktorisierung läuft.
Annex: die Ergebnisse reproduzieren
Alles, was dieser Artikel misst — jede Zahl, Tabelle, Abbildung und Galerie — ist reproduzierbar
aus dem Forschungs-Repository, das diesen Artikel begleitet:
github.com/aurelienpierre/guided-laplacian-highlights-research .
Die gerenderte Seite, die Sie lesen, verlinkt die Skripte nicht einzeln; klonen Sie dieses Repository
(es verwendet Git LFS für die großen Binärdateien, führen Sie also zuerst git lfs install aus), um
die Skripte zusammen mit ihren Daten zu erhalten.
Was das Repository enthält. Die Python-Referenzimplementierungen
(reconstruct_highlights.py, fix_prototype.py, c_ladder_replica.py, knee_proto.py,
validate.py), die Abbildungs- und Galerie-Generatoren (make_figures.py, make_knee_figure.py,
make_cmp_gallery.py, dt_compare.py) und die Testdaten in synthcases/: jede synthetische
Szene als Bayer-DNG, das die echten Pipelines aufnehmen, ihr Ground Truth und ihre beschnittenen Versionen als NumPy-
Paare (synth_*_gt.npy / synth_*_clipped.npy) und die Sidecar-Dateien, die jeden
Rekonstruktionsmodus auswählen (synth_harmonic.xmp, synth_laplacian.xmp, dt_opposed.xmp,
dt_segments.xmp).
Umgebung. Python 3.12 mit numpy, scipy, opencv-python und Pillow; nichts weiter.
Jedes Skript wird von innerhalb des Repositorys ausgeführt.
Die reinen Python-Ergebnisse brauchen keine Fotosoftware:
python3.12 fix_prototype.pydruckt jede Root-Mean-Square-Fehler- und strukturelle-Ähnlichkeits- Tabelle des Validierungsabschnitts;python3.12 make_figures.pyregeneriert die Validierungsabbildungen;python3.12 make_knee_figure.pyregeneriert die Sensor-Rolloff-Abbildung (Blindschätzung gegen Ground Truth).
Die End-to-End-Ergebnisse führen den tatsächlichen Produktionscode auf den synthetischen DNGs aus:
- Ansel: bauen Sie
ansel-cliaus dem Ansel-Repository (Branchhighlights-xtrans-sparse-clbis zum Merge), exportieren Sie dann eine beliebige Szene mitansel-cli synthcases/synth_occluded.dng synthcases/synth_harmonic.xmp out.tif --out-ext tiff --icc-type LIN_REC709 --apply-custom-presets false --core; tauschen Sie das Sidecar gegensynth_laplacian.xmp, um den 2021er-Modus auszuführen. Fügen Sie--conf opencl=TRUE(oder--disable-opencl) hinzu, um das Gerät zu wählen; - die CPU/GPU-Paritäts-Selbsttests werden im Code ausgeliefert: das Setzen von
HL_SPCL_TEST=1 HL_FILLCL_TEST=1 HL_CFCL_TEST=1 HL_HFCL_TEST=1 HL_DOMECL_TEST=1 HL_CORECL_TEST=1 HL_ANISOCL_TEST=1 HL_KNEECL_TEST=1 HL_REGCL_TEST=1 HL_BLURCL_TEST=1bei jedem OpenCL-Export lässt jede Rekonstruktionsstufe auf sowohl dem Prozessor als auch der Grafikkarte laufen und die größte Differenz ausdrucken; - Darktable: bauen Sie
Darktable-cliaus Upstream (initialisieren Sie die Submodule rekursiv), dann exportiertpython3.12 dt_compare.pydie Darktable- Modi auf der neutralisierten Baseline (workflow=none, nur Entrasterung + Lichter) mit den szenenweise besten Parametern, diepython3.12 tune_methods.pyfand, und es exportiert die Ansel- Modi über jede Szene, bewertet sie gegen Ground Truth und druckt die Vergleichstabelle dieses Artikels;python3.12 make_cmp_gallery.pyrendert die Galerien. Beide Skripte geben die Binärpfade an, die sie erwarten, ganz oben.
Natürliche-Bild-Exporte kommen in zwei Ausprägungen. Die Profil-(Parade-)Plots verwenden CFA-Domänen-
Destillate (<image>-sensor-profiles.npz), erzeugt von make_sensor_profiles.py aus
Vollauflösungs-Exporten des RAW durch nur Weißabgleich + Lichterrekonstruktion, mit
Entrasterung auf Photosite-Farbe-Passthrough gesetzt und dem Farbeingangsprofil auf
lineares Rec709 zugewiesen, sodass die weißabgeglichenen Photosite-Werte den Export unberührt durchqueren. Volle
Auflösung und Passthrough sind beide tragend: jede Entrasterung- oder Resampling-Stufe zwischen
dem Modul und dem Plot interpoliert über die steilen Ränder der Rekonstruktion und druckt
Undershoot, das sich als falsche Bodenverletzungen liest. Die vielhundert-Megabyte-TIFF-Paare werden nicht
gespeichert; regenerieren Sie sie aus den RAWs mit den gepatchten Sidecars, die der Header des Skripts beschreibt.
Die visuellen Kacheln und Kantenmetriken verwenden
<image>-current.tif, die eigene Entwicklungs-
historie jeder Fotografie (ihr .xmp-Sidecar) mit einer chirurgischen Änderung: jeder highlights-History-Eintrag hat seine
Parameter durch die Standard-Harmonische-Transposition-Vorgaben ersetzt, bevor exportiert wird. Die Sidecars
dieser Testbilder tragen Jahre interaktiver Experimente, und ihr aktiver Lichter-Eintrag
ist nicht notwendigerweise der ausgelieferte Modus — sie ungepatcht zu exportieren benchmarkt stillschweigend, welchen Modus auch immer
die letzte Dunkelkammer-Sitzung hinterließ.
Performance-Zahlen sind von Natur aus maschinenabhängig: das Protokoll (voller ansel-cli-Export,
Wanduhr-Minimum aus drei Läufen, leerlaufende Maschine) ist mit den Tabellen angegeben, und die Timing-
Harness ist bench_gl_vs_ht.py im Forschungs-Repository.
- PDF .
Danksagungen
Ich möchte Ricky Moon dafür danken, dass er das Claude-Max-Abonnement gesponsert hat, das es ermöglichte, Claude Fable 5 zu nutzen, um den Großteil dieser Arbeit zu erledigen. Ohne den Schub durch die KI hätte es Monate, wenn nicht ein Jahr gedauert, all das zu erreichen.
Translated from English by : ChatGPT, Claude. In case of conflict, inconsistency or error, the English version shall prevail.
Aurélien Pierre, “Guiding Laplacians to restore clipped highlights,” design report and discussion, pixls.us community forum, 2021. URL . ↩︎ ↩︎
In the Ansel source tree,
src/iop/highlights_harmonic.h(included bysrc/iop/highlights.c), with the CPU/GPU parity self-tests insrc/iop/highlights_selftests.h. Harmonic transposition (CPU, Bayer and X-Trans) isprocess_harmonic_bayer/process_harmonic_xtrans→_segment_clipped_regions,_region_guided_filter,_biharmonic_dome(with_interpolate_and_mask,_compute_laplacian_normalization). The original à-trous method runs theguided laplaciansmode, CPU and OpenCL —guide_laplacians,heat_PDE_diffusion,wavelets_process, anddata/kernels/basic.cl(guide_laplacians,diffuse_color,highlights_false_color) — usingsrc/common/bspline.h(B_SPLINE_SIGMA,B_SPLINE_TO_LAPLACIAN,equivalent_sigma_at_step). ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎Kaiming He, Jian Sun, and Xiaoou Tang, “Guided Image Filtering,” IEEE Transactions on Pattern Analysis and Machine Intelligence, 35(6), 1397-1409, 2013. DOI: 10.1109/TPAMI.2012.213 . Originally in ECCV 2010. ↩︎ ↩︎ ↩︎
Chuan Qin, Shuozhong Wang, and Xinpeng Zhang, “Simultaneous inpainting for image structure and texture using anisotropic heat transfer model,” Multimedia Tools and Applications, 56(3), 469-483, 2012. DOI: 10.1007/s11042-010-0601-4 . ↩︎ ↩︎ ↩︎
Y. Oono and S. Puri, “Computationally efficient modeling of ordering of quenched phases,” Physical Review Letters, 58(8), 836-839, 1987. DOI: 10.1103/PhysRevLett.58.836 . ↩︎ ↩︎
M. Patra and M. Karttunen, “Stencils with isotropic discretization error for differential operators,” Numerical Methods for Partial Differential Equations, 22(4), 936-953, 2006. DOI: 10.1002/num.20129 . ↩︎ ↩︎
Aurélien Pierre, “Rotation-invariant Laplacian for 2D grids,” 2021, which derives the 9-point stencil, the B-spline Gaussian-equivalent $\sigma_B$, and the difference-of-Gaussians to Laplacian normalization constant used as
B_SPLINE_TO_LAPLACIAN. URL . ↩︎ ↩︎ ↩︎ ↩︎Michael Unser, “Splines: A Perfect Fit for Signal and Image Processing,” IEEE Signal Processing Magazine, 16(6), 22-38, 1999. DOI: 10.1109/79.799930 . ↩︎
Holger Dammertz, Daniel Sewtz, Johannes Hanika, and Hendrik P.A. Lensch, “Edge-Avoiding À-Trous Wavelet Transform for fast Global Illumination Filtering,” Ulm University, ↩︎
The local-affine “color-line” prior — within a small patch, a surface’s colour channels are affinely related. Canonical sources: Ido Omer and Michael Werman, “Color Lines: Image Specific Color Representation,” CVPR 2004; and the matting Laplacian of Anat Levin, Dani Lischinski, and Yair Weiss, “A Closed-Form Solution to Natural Image Matting,” IEEE TPAMI 30(2), 228-242, 2008, DOI 10.1109/TPAMI.2007.1177 . The related “Colorization using Optimization” (SIGGRAPH 2004, DOI 10.1145/1015706.1015780 ) uses a softer intensity-affinity prior. ↩︎ ↩︎
The near-saturation nonlinearity of image sensors is standard characterization knowledge : J. R. Janesick, Photon Transfer: DN → λ, SPIE Press, 2007 (gain and noise are measured at the low-illumination end because linearity degrades approaching full well) ; the EMVA 1288 standard (European Machine Vision Association) restricts its linearity regression to 0–70 % of saturation for the same reason ; F. Wang and A. J. P. Theuwissen, “Linearity analysis of a CMOS image sensor,” Electronic Imaging, 2017, details the pixel-chain mechanisms (source-follower gain, voltage-dependent photodiode capacitance). URL . The magnitude of the bias on a given camera is measured from the image itself by the knee estimator ; see the figure in the knee section. ↩︎