Utvalgt arbeid

Leica Look

Oversikt

Et kameras svart-hvitt-gjengivelse, målt fra referansebilder og bygget opp igjen for trykk.

Detaljer

At a glance

Type prosjekt
Bildepipeline og mørkerom i nettleseren
Min rolle
Målte uttrykket, tilpasset det, og skrev begge renderne og mørkerommet rundt dem.
Kategori
Produkter
Status
Prototype2026

Hva jeg gjorde

  • Tilpasset gjengivelsen fra matchede par av referanse- og kildebilder
  • Skrev den eksakte referanserenderen og den raske i nettleseren, og selen som holder dem sammen
  • Designet mørkerommet: to uttrykk, åtte justeringer, trykkstørrelse, korn og leseverktøyene
  • Skrev ned hva dataene ikke kunne støtte, ved siden av verdiene de kunne

Bygget med

  • Python: Den eksakte referanserenderen og tilpasningspipelinen
  • NumPy: Farge- og tonematematikken, i dobbel presisjon
  • WebGL2: Renderen i nettleseren brukeren faktisk tar på
  • ONNX Runtime: Ansiktsgjenkjenning for de valgfrie lokale maskene
  • pytest: Fargerundturer, kurvemonotoni og gjenfinning av kjente parametre

Neste prosjekt

Wisr
The Leica Look converter: a black-and-white photograph of a child at the shoreline fills a dark workspace, with panels for the look, the print size, the grain and a live histogram beside it

Behovet

En Leicas monokrome gjengivelse ser ikke ut som en telefons. Forskjellen er ikke et filter lagt over bildet. Det er et sett beslutninger om hvordan farge blir grått, hvor tonene ligger, og hvor mye lokal kontrast som får bygge seg opp, og de beslutningene er konsistente nok til at en fotograf kjenner dem igjen.

Spørsmålet var om den gjengivelsen kunne måles i stedet for å etterlignes, og deretter brukes på et vanlig telefonbilde godt nok til å trykkes i førtifem centimeter.

Å måle et uttrykk

Gjengivelsen ble tilpasset fra matchede par: den samme scenen slik kameraet gjenga den og slik den kom ut av telefonen. To uttrykk kom ut av det arbeidet, et mykere Classic tilpasset fra tretten par og et hardere Contrast tilpasset fra ni.

Det tilpasningen gir er en liten lesbar fil og ikke en svart boks: hvor mye av rød-, grønn- og blåkanalen som blir grått, en tonekurve på en visningsreferert akse, og et ledd for lokal kontrast. Å heve rødvekten gjør hud lysere og en blå himmel mørkere, og du ser det i tallet før du ser det i bildet.

Beslutning

Skriv ned det dataene ikke kunne bære

Bakgrunn
Et tilpasset uttrykk kan publiseres som én selvsikker oppskrift. Tre deler av dette er ikke godt underbygget: vignetten, fordi referansebildene er portretter med motivet midt i, og den målte lysavfallet egentlig er hvor motivet står; kornet, fordi de to bildesamlingene ligger på ulik sensoroppløsning og en tilpasset amplitude ville kodet den forskjellen som stil; og vekten på blåkanalen, der ti bilder vil ha én verdi og tre vil ha en annen.
Hva jeg bestemte
Hvert tilpasset felt bærer en oppføring om hvor godt dataene støtter det. De tre som ikke er underbygget står urørt og er lagt fram som kontroller du setter med øyet, og uenigheten om blåvekten er skrevet ned som et uavklart spørsmål i stedet for å bli gjennomsnittet bort.
Avveining
Produktet leveres med tre verdier brukeren må vurdere selv i stedet for å arve, og en README som sier rett ut hvor det er usikkert. Et verktøy som stille presenterte en gjetning som en måling ville vært lettere å selge og verdt mindre for alle som gjør alvorlig arbeid med det.

Mørkerommet

Rundt gjengivelsen ligger et sted å jobbe: to uttrykk, åtte justeringer, og leseverktøyene et trykk trenger. Et histogram med prosent utbrent og igjenkjørt. En klippevisning. Et sonekart som bytter ut tone med falske farger slik at hvert lysstyrkebånd kan vurderes for seg.

Justeringene er bygget etter en regel. Hver av dem er en eksakt identitet i utgangspunktet og beveger seg én vei gjennom hele sitt område, slik at ingenting kan omordne toner eller stille endre en bunke du ikke mente å røre. Shadows når midtgrått. Blacks når bare en kvarttone, slik at du kan plassere ekte svart uten å vaske ut midten.

The same photograph under the zone map: tones are replaced by false colour so each band of brightness can be read separately, with blown and blocked percentages reported under the histogram

Dimensjonert for papir, ikke for en skjerm

Korn er den delen de fleste verktøy tar feil. Det dimensjoneres vanligvis i piksler, som betyr at den samme innstillingen er grov på et postkort og usynlig på en plakat. Her dimensjoneres det i mikrometer ved trykkstørrelsen, slik at det lander på papiret slik det ble satt.

Trykkpanelet følger samme logikk. Å velge et papir passer bildet inn i arket og oppgir størrelsen det faktisk trykkes i, ikke arkets mål: et tre-mot-fire-bilde på A4 trykkes i tjueåtte centimeter, ikke tjueni komma sju, fordi kortsiden møter papiret først. Og når kilden er mindre enn det som er bestilt, oppskalerer verktøyet og sier fra, fordi oppskalering ikke legger til detaljer.

Beslutning

To rendere, holdt innenfor én piksel av hverandre

Bakgrunn
Nettleseren må være rask nok til å føles levende under en skyvekontroll. Trykkarbeid må være eksakt. Én motor kan ikke være begge deler, så det er to: en eksakt i dobbel presisjon, og en rask i halv presisjon i WebGL som er den brukeren faktisk tar på.
Hva jeg bestemte
En sele rendrer den samme tapsfrie filen gjennom begge og sammenligner dem piksel for piksel. Classic stemmer innenfor ett nivå av 255 på den verste pikselen; Contrast innenfor to. Grensen settes på den verste pikselen og ikke på gjennomsnittet, fordi en snittgrense hentet fra ett uttrykk ville underkjent et annet uten grunn.
Avveining
Hver endring i matematikken må gjøres to ganger og måles på nytt, ellers glir de to fra hverandre og ingen av dem kan stoles på. Feilen som blir igjen kan spores til ett kjent valg: den raske motoren underprøver filteret for lokal kontrast, med hensikt, slik at en telefon henger med.

Hvor det står

To uttrykk er i bruk. Kommandolinjen konverterer en mappe til sekstenbits filer i et vidt fargerom med profilen innebygd, og mørkerommet i nettleseren gjør det samme arbeidet direkte på ett bilde. Testene dekker fargerundturer, kurvens monotoni under vilkårlige inndata, gjenfinning av kjente parametre fra syntetiske transformasjoner, og korndimensjonering på tvers av trykkoppløsninger.

Det er et personlig verktøy mer enn et produkt, og den interessante delen var ikke koden. Den var å avgjøre hva som ærlig kunne påstås ut fra tretten par bilder, og så bygge et grensesnitt som sier sannheten om resten.