Změřeno, ne slíbeno
Výkon
Každé číslo na této stránce pochází ze skutečných fotek na běžném notebooku (Apple M3, 16 GB) a skripty, které je vytvořily, jsou v repozitáři, takže je kdokoli může spustit znovu. Pod každým grafem je, co znamená pro tvoje tisky, a na konci slova, která stojí za čísly.
Proč je Fotollection rychlý
Žádná magie. Pár rozhodnutí udělaných před prvním řádkem kódu, každé z nich změřené.
Nativní kód na každém jádře
Práce Fotollection běží v Rustu, zkompilovaném pro tvůj procesor a rozloženém na všechna jeho jádra, s vektorovými instrukcemi (SIMD), které procesory pro pixely nabízejí.1,2,3
23,5 / sexportovaných fotek s 16 MP
Jen to, co je potřeba
Otevření složky přečte EXIF každého souboru a jeho malý vložený náhled, nikdy celou fotku. Náhledy se ukládají do mezipaměti na disku.4
0,12 sna otevření 1 000 fotek
Nikdy víc pixelů než obrazovka
Náhled má nejvýš 1 600 px a vzniká z kopie o 2 048 px držené v paměti. Celá fotka se čte, až když přiblížíš, a to po částech.
17 msna překreslení náhledu
Připraveno dřív, než klikneš
Jakmile jsou hotové miniatury, připraví se na pozadí náhled každé fotky a uloží se na disk, zatímco čtvrtina paměti drží fotky kolem té, která je na obrazovce.
27 msna otevření kterékoli fotky
Nic dvakrát
Barevný posuvník mění jen barvu, nikdy velikost. Všechny barevné posuvníky se složí do jedné tabulky 33 × 33 × 33 barev, takže deset posuvníků stojí tolik co jeden.
2 mspro deset barevných posuvníků na náhledu
Paměť v rámci limitu
Fotollection zpracovává najednou jen tolik fotek v plné velikosti, kolik dovolí jeho paměťový limit, určený podle největší fotky v exportu.
1,45 GBšpička paměti s 5 035 fotkami
Kodéry vyladěné měřením
Soubory pro tisk vynechávají optimalizaci tabulek, která je zmenšovala o méně než 1 % a stála třetinu času kódování.
−33 %času kódování souborů pro tisk
Grafická karta při úpravách
Když se barevný posuvník hýbe, grafická karta kreslí z tabulky, kterou sestaví jádro. Exporty zůstávají na procesoru, takže tisk je na každém počítači stejný.
1–2 msna krok posuvníku, dřív 26 ms
Až 20× rychlejší. Nový způsob, jak využít paměť.
v0.11.0 nově promýšlí, jak Fotollection drží tvoje fotky. Náhled každé fotky se připraví na pozadí, jakmile je hotová její miniatura, a uloží se na disk, čtvrtina paměti tvého počítače drží fotky kolem té, kterou vidíš, a fotka na obrazovce má vždy přednost. Výsledek: kterákoli fotka, blízká nebo vzdálená, JPEG nebo RAW, se otevře za 27 milisekund. Otevření RAW je až 20krát rychlejší než ve v0.9.0, JPEGu 10krát rychlejší, změřeno na stejných 422 fotkách z jedné cesty.5,6
Dřív: každá fotka se dekódovala až po kliknutí
Až do v0.10.0 vznikal náhled teprve ve chvíli, kdy sis o něj řekl: soubor se načetl, fotka dekódovala (RAW vyvolal), otočila nastojato, zmenšila na 2 048 px a převedla do sRGB, pak se ořízla, obarvila, dostala datum a zakódovala pro obrazovku. U fotky s 20 MP z Lumixu GX9 to trvalo 274 až 278 ms u JPEG a 440 až 531 ms u RAW, pokaždé, když se otevřela fotka, která nebyla mezi posledními osmi. Pro jednu fotku dost rychlé; pro rychlé procházení cesty ne.
Standardní náhledy, jak je drží Lightroom
Od v0.11.0 se práce, na kterou uživatel čeká, udělá dřív, než si o ni řekne. Jakmile jsou miniatury složky hotové, Fotollection na pozadí vytvoří pro každou fotku kopii o 2 048 px, jednu fotku najednou na vlákno, a uloží ji na disk vedle miniatur jako JPEG o asi 0,66 MB (asi 280 MB pro celou cestu). Kliknutí na kteroukoli fotku, blízkou i vzdálenou, v tomto sezení i v příštím, začíná od této kopie: 27 ms pro JPEG i pro RAW. Zbývá jen vlastní práce náhledu (ořez, změna velikosti, barva, datum na fotce a kódování), stejných 27 ms jako z paměti. Náhled vytvořený z kopie na disku se od čerstvého liší v průměru o 1,35 úrovně z 255, příliš málo na to, aby to bylo vidět.8
Paměť využitá dobře, ne co nejméně
Prohlížeč fotek, který na notebooku s 16 GB drží v paměti osm fotek, notebook promrhá. Fotollection teď dává náhledům čtvrtinu paměti počítače (na Macu s 16 GB asi 190 fotek o 2 048 px, 20 vyvolaných RAW uchovaných pro jejich posuvníky a 600 MB pro zoom), počítanou v bajtech a uvolňovanou od nejstarší. Když je fotka na obrazovce, načtou se i další dvě ve směru, kterým se pohybuješ, a jedna za ní, takže šipky nikdy nečekají. Strop 2 GB pro exporty dál platí.
Fotka na obrazovce má přednost
Najednou se vyvolává jen jeden RAW, aby se dávka RAW fotek vešla do paměti. Dřív bylo pořadí ve frontě věcí náhody: připravovaný náhled, odhad velikosti exportu nebo export mohly nechat čekat fotku, na kterou jsi klikl. Teď každé vyvolání říká, kdo na něj čeká, a práce na pozadí ustoupí pokaždé, když ho potřebuje fotka na obrazovce. Stejná práce odhalila i dvě vzácná zaseknutí, která jsou teď pryč: jedno, kdy všechna vlákna čekala na vyvolání, na které už nezbylo žádné vlákno, a druhé, kdy obrazovka čekala na obrázek, o který si nikdy neřekla.
| Verze | JPEG p50 / p95 | RAW p50 / p95 | Jak |
|---|---|---|---|
| v0.9.0 | 274 / 286 ms | 531 / 550 ms | Dekódováno po kliknutí; RAW přes macOS |
| v0.10.0 | 278 / 293 ms | 440 / 471 ms | Dekódováno po kliknutí; RAW naším vlastním vyvoláním |
| v0.11.0 | 27 / 32 ms | 27 / 30 ms | Ze standardního náhledu na disku nebo z paměti |
Měřeno na majitelově cestě do Prahy (396 JPEG a 26 RAW, 20 MP) na Apple M3 pomocí measure_browse: v0.9.0 sestavená z vlastního tagu, v0.10.0 na kódu těsně před touto změnou.
Rychlost: tisíc fotek mrknutím oka
Otevření složky přečte EXIF každé fotky a její malý vložený náhled, ne celý obrázek, a změněné nastavení překreslí jen náhled. Nativní Rust navíc porazí webový prohlížeč, který dělá stejnou práci: stejná rychlost exportu, rychlejší náhled a o čtvrtinu méně paměti.9
Co se stane, když otevřeš složku
Složka fotek se nečte celá. Z každého souboru Fotollection přečte jeho data EXIF (datum, fotoaparát, místo) a malou miniaturu, kterou každý fotoaparát ukládá do souboru, a nic dalšího: 1 000 fotek zabere 0,12 s, proti rozpočtu 1 s stanovenému ještě před napsáním kódu. Ostřejší miniatury o 400 px pak vznikají na pozadí, na dvou vláknech, aby Fotollection zůstal svižný, a ukládají se do mezipaměti na disku, takže znovu otevřená složka je tu hned. U 5 035 fotek trval import 383 ms a vložené miniatury 236 ms.
Kam jde 17 ms náhledu
Změna nastavení překreslí náhled z kopie fotky o 2 048 px uložené v paměti, nikdy z celého souboru. Z 16,7 ms, které to trvá, zabere ořez a zmenšení Lanczosovým filtrem 9,7 ms, datum na fotce méně než 0,1 ms a kódování náhledu do JPEG pro obrazovku 7,0 ms. Tento kodér byl vyladěn měřením: s nastavením exportu (plné rozlišení barev a optimalizované tabulky) trval 16,2 ms; obrazovka je nepotřebuje, takže náhled používá poloviční rozlišení barev a obyčejné tabulky, zatímco exporty si nechávají plné barvy (4:4:4). Zkusil se i levnější filtr pro změnu velikosti a na tomto procesoru vyšel pomalejší (12,5 ms), takže Lanczos zůstal.
Nativní kód proti prohlížeči
Stejná úloha (dekódování, ořez na 2:3, datum na fotce, JPEG v kvalitě 95) běžela na stejných 95 fotkách ve Fotollection a v Chromiu s jedním workerem na jádro. Rychlost exportu vyšla stejně, 18,0 proti 17,9 fotky za sekundu, což vyvrátilo náš první odhad: prohlížeč pomalý není. Důvody pro nativní kód jsou jinde: Fotollection zapisuje soubory 4:4:4 v plném rozlišení barev, kde kodér prohlížeče barvy půlí, zachovává barevný profil každé fotky, zapisuje soubory přímo na disk a spotřeboval o čtvrtinu méně paměti (1,35 GB proti 1,78 GB). Od té doby se kodér pro tisk ještě zrychlil: 23,5 fotky za sekundu při 16 MP.
Grafická karta při úpravách, všechna jádra při exportu
Když táhneš barevným posuvníkem, grafická karta kreslí look ze stejné tabulky, kterou sestaví jádro Fotollection, a když pustíš, převezme to přesné vykreslení. Exporty zůstávají na procesoru, takže tisk vyjde na každém počítači stejně.
Deset posuvníků za cenu jednoho
Každý barevný posuvník (jas, kontrast, teplota, sytost, vyblednutí, tónování stínů a světel, černobílá) se složí do jediné tabulky 33 × 33 × 33 barev, 35 937 bodů, které říkají, kam se každá barva posune. Použít ji na fotku znamená najít pro každý pixel jeho buňku v tabulce a interpolovat mezi čtyřmi jejími rohy (tetraedrická interpolace), takže deset posuvníků stojí tolik co jeden. Sestavení tabulky se všemi posuvníky nastavenými trvá asi 2,6 ms; její použití na náhled o 1 600 px méně než 2,2 ms; na export s 24 MP asi 24 ms.
Proč se tažení pořád zdálo pomalé a co změnila grafická karta
Při měření krok po kroku stál jeden pohyb posuvníku asi 26 ms a samotná barva z toho byla jen 2 ms: zbytek zabralo kódování náhledu do JPEG (7 až 11 ms) a jeho opětovné dekódování v okně (9 až 15 ms). Grafická karta odstraní obojí. Když tažení začne, holý náhled a maska toho, kde je fotka (ne datum na fotce, rámeček ani okraj), jdou do grafické karty jednou; při každém kroku za nimi putuje už jen nová tabulka a malý program ve WebGL2 ji interpoluje přesně tak jako jádro: 1 ms na krok ve WebKitu na macOS, 2 ms v Chromiu. Když posuvník pustíš, nahradí ho přesný render jádra. Obojí se porovnalo na výrazném looku se všemi posuvníky posunutými: liší se v průměru o 0,13 ΔE2000 a o 0,77 na 99. percentilu, hluboko pod 1, kterou oko pozná při srovnání vedle sebe.
Žádný přepínač není potřeba. Při prvním tažení si to Fotollection ověří sám: pokud chybí WebGL2, renderer je softwarový nebo zkušební krok trvá 8 ms či déle, zůstane po celé sezení na cestě přes procesor. Softwarový renderer v testu potřeboval 16,5 ms na krok, takže zůstat tam na procesoru je správně.
Exporty na všech jádrech
Dekódování a kódování fotky běží každé na jednom jádru, takže export je rychlý, když se zpracovává několik fotek najednou. Kolik jich to je, záleží na paměti: u fotek s 24 až 26 MP dávaly 2 najednou 4,9 fotky za sekundu, 4 dávaly 9,4, 6 dávalo 11,5 a 8 dávalo 12,5, přičemž paměť rostla z 0,49 na 1,21 GB. Fotollection volí počet podle paměťového rozpočtu 1,6 GB a velikosti největší fotky a zastaví se na 6, protože na fotkách ze skutečné cesty nebylo 8 najednou o nic rychlejší a spotřebovalo o 0,2 GB víc. Exporty grafickou kartu nikdy nepoužívají: tisk musí vyjít stejně na každém počítači a závisí na tom i testy, které exporty porovnávají bajt po bajtu.
Skutečná cesta: 422 souborů z Prahy
Testovací sady mohou výsledky přikrášlit, proto tady je jedna složka přesně tak, jak vyšla z fotoaparátu Lumix GX9 po víkendu v Praze: 396 JPEGů s 20 MP, každý asi 11 MB, a vedle nich 26 souborů RAW, celkem 4,7 GB. Při otevření se EXIF všech souborů přečte za 0,23 sekundy. Náhled se překreslí za 19 ms, RAW se vyvolá za 0,35 sekundy a deset pohlednic se překreslí za 21 ms. Dne 2026-11-03 dvě čísla na těchto velkých souborech překročila svůj limit: export běžel rychlostí 7,6 fotky za sekundu a špička paměti dosáhla 2,14 GB. Příčina byla nalezena a opravena ve v0.9.7: JPEGy se teď exportují rychlostí 10,1 za sekundu a celý běh zůstane pod 1,31 GB.10,11
Dva nesplněné rozpočty a jejich příčina
Na těchto souborech s 20 MP první běh nesplnil dva rozpočty: export běžel rychlostí 7,6 fotky za sekundu a paměť vyvrcholila na 2,14 GB, nad stropem 2 GB. Měření každé fáze jedné fotky ukázalo, kam čas šel: dekódování asi 100 ms, ořez 2 ms a kódování tisku 203 ms. Kodér pro tisk optimalizoval své tabulky ve druhém průchodu, který držel v paměti každý koeficient obrazu, asi 160 MB na fotku, šest fotek najednou asi 1,5 GB, a to pro soubory jen o 0,9 % menší. Se standardními tabulkami zapisuje soubor po pruzích: 138 ms, stejná chyba vůči vykreslenému obrazu, o pár kilobajtů víc.
Část paměti vůbec nepatřila Fotollection. Benchmark vytvářel miniatury na všech jádrech, kde Fotollection používá dvě vlákna na pozadí, a během exportu držel naživu svá vlastní měření náhledů; změřeno tak, jak Fotollection skutečně pracuje, zbývá před začátkem exportu 0,35 až 0,39 GB. Od v0.9.7 se počet fotek zpracovávaných najednou řídí i největší fotkou exportu (u velmi velkých méně), takže vrchol zůstane pod stropem při jakékoli velikosti: 10,1 fotky za sekundu a 1,31 GB pro tuto složku.
Paměť: 5 035 fotek a drží se na stejné úrovni
Fotollection drží v paměti jen pár bajtů na fotku, zapisuje miniatury do mezipaměti na disku a zpracovává najednou jen tolik obrázků v plné velikosti, kolik se vejde do jeho paměťového limitu. Paměť se proto drží na stejné úrovni, i když cesta naroste na tisíce fotek.
Proč paměť neroste se složkou
Fotollection drží v knihovně jen pár bajtů na fotku (13 MB pro 5 035 fotek), miniatury zapisuje do mezipaměti na disku, místo aby je držel v paměti, v paměti uchovává omezený počet náhledů a v plné velikosti zpracovává najednou jen tolik fotek, kolik se vejde do jeho rozpočtu. Mřížka na obrazovce je virtuální: existují jen dlaždice, které vidíš. Pro test bylo stejných 95 fotek nalinkováno 53krát do složky s 5 035 soubory:
| 95 fotek | 5 035 fotek | |
|---|---|---|
| Import a EXIF | 5 ms, 7 MB | 383 ms, 13 MB |
| Miniatury 400 px do mezipaměti na disku | 47,8 fotky/s | 46,4 fotky/s |
| Export, 6 najednou | 18,0 fotky/s | 15,4 fotky/s, 0 selhalo |
| Nejvyšší spotřeba paměti za celý běh | 1,35 GB | 1,45 GB |
53krát víc fotek stojí o 0,1 GB víc. Dlouhý export je na fotku o něco pomalejší jen proto, že běžel přes pět minut, a procesor notebooku se při trvalé zátěži zpomalí.
Kvalita tisku: tisk vypadá jako fotka
Tisky z webového editoru často vypadají ploše: zahodí barevný profil, zmenší fotku na 2 000 px a uloží ji v kvalitě 80 s polovičními barvami. Fotollection profil zachová a exportuje v plném rozlišení ve 4:4:4.
Proč tisky z webového editoru vypadají ploše
Test exportuje 20 fotek z fotoaparátu a 5 verzí v Display P3 (širší barvy novějších telefonů a Maců) skutečným exportem Fotollection, pak oba soubory načte nezávislým dekodérem, převede je přes jejich barevné profily do CIELAB a porovná pixel po pixelu s originálem. Stejným porovnáním projde i typický export z webového editoru: profil zahozený, zmenšeno na 2 000 px a pro tisk zase zvětšeno, uloženo v kvalitě 80 s polovičním rozlišením barev (4:2:0).
| Medián | Fotollection, sRGB | Webový editor | Fotollection, Display P3 | Webový editor |
|---|---|---|---|---|
| ΔE2000 (barevná chyba, pod 1 je neviditelná) | 0,19 | 1,39 | 0,31 | 2,15 |
| PSNR | 52,6 dB | 37,9 dB | 50,8 dB | 37,0 dB |
| Zachovaná sytost | 100 % | 99,9 % | 99,9 % | 86,8 % |
| Zachované jemné detaily | 99,8 % | 13 % | 100 % | 18 % |
Plochý vzhled vysvětlují dvě příčiny. Zmenšení na 2 000 px a nové zvětšení pro fotolab zahodí 87 % jemných detailů, díky kterým tisk působí ostře. A zahození barevného profilu přečte fotku v Display P3, jako by byla v sRGB, což jí vezme 13 % sytosti. Fotollection profil zachová (25 z 25 souborů), exportuje v plném rozlišení fotky s plnými barvami (4:4:4) v kvalitě 95 (tehdy měřeno; od v0.13.0 je výchozí 90, stále pod viditelným rozdílem) a jeho větší chyby leží jen na ostrých hranách, kde se každý JPEG nadře nejvíc. Ještě přijde: skutečné soubory HEIC z iPhonu a tisky změřené spektrofotometrem.
RAW z fotoaparátu: otevři ho tak, jak je
Fotollection otevírá soubory RAW z devíti běžných fotoaparátů tak, jak jsou, bez převádění a na Windows a Linuxu i bez instalace čehokoli. Od v0.10.0 je celý obrázek vlastním vyvoláním Fotollection pro každý fotoaparát se snímačem Bayer, vytvořeným z vlastních dat fotoaparátu jako v RAW editoru, kdežto Adobe DNG Converter jen převede jeden soubor RAW na jiný.12,13,14,15
Co snímač doopravdy zaznamená
Snímač fotoaparátu je mřížka milionů drobných jamek, kterým se říká fotobuňky. Dokud je závěrka otevřená, každá z nich sbírá světlo, které na ni dopadne, a mění ho na elektrický náboj; když se zavře, převodník změní každý náboj na číslo. Vztah je lineární: dvakrát víc světla dá dvakrát větší číslo. Naše oči lineární vůbec nejsou, jas posuzují poměrově, a proto soubor RAW vypadá tmavě a ploše, dokud se nevyvolá.
Tu mřížku vyčítají dva druhy snímačů:
- CCD (charge-coupled device) posouvá náboj každé fotobuňky, řádek po řádku, k jednomu zesilovači na okraji čipu. Byl to snímač prvních digitálních fotoaparátů a mnoha raných digitálních stěn pro střední formát: čisté snímky, ale pomalé vyčítání a velká spotřeba energie.
- CMOS dává každé fotobuňce vlastní zesilovač a vyčítá jich mnoho najednou. Je rychlejší, spotřebuje méně energie a jeho výroba je levnější, takže ho dnes má téměř každý fotoaparát a telefon. Většina snímačů CMOS vyčítá řádky jeden po druhém, a proto se rychle se pohybující objekt na fotce pořízené elektronickou závěrkou může naklonit (rolling shutter) a proto se vrstvené snímače, které vyčítají mnohem rychleji, naklánějí méně.
Čísla mají mnohem víc stupňů než JPEG. Fotoaparát ukládá 12 nebo 14 bitů na fotobuňku, 4 096 nebo 16 384 úrovní, kde JPEG drží 8 bitů, 256 úrovní. Právě tyto úrovně navíc dovolí zvednout stín nebo stáhnout jasnou oblohu bez pruhování. A žádné světlo není nula: každý snímač přidává malý posun, úroveň černé, aby se šum kolem černé neořízl. Ve vzorku z Nikonu D750 je černá 600 a nejjasnější hodnota, kterou snímač udrží, úroveň bílé, je 15 520. Úplně první věc, kterou každý vyvolávač RAW udělá, je převést tato dvě čísla na 0 a 1, pro každou pozici barevného filtru, protože některé fotoaparáty dávají každé z nich vlastní úroveň černé.
Barva pochází z filtru nad každou fotobuňkou
Fotobuňka měří jen to, kolik světla dopadne, nikdy jeho barvu. Aby snímač viděl barvy, je pokrytý maticí barevných filtrů: nad každou fotobuňkou je drobný červený, zelený nebo modrý filtr, takže každá počítá jen část spektra.
- Bayer, kterou si v roce 1976 nechal patentovat Bryce Bayer z Kodaku, opakuje čtverec 2 × 2: jedna červená, dvě zelené, jedna modrá. Polovina fotobuněk je zelených, protože naše oči berou většinu vjemu detailu ze středu spektra, takže zelená nese většinu ostrosti. Tento vzor používá téměř každý fotoaparát, v jedné ze čtyř orientací (RGGB, BGGR, GRBG, GBRG), kterou musí soubor uvést.
- X-Trans, vzor Fujifilmu od roku 2012, opakuje čtverec 6 × 6 s červenou, zelenou a modrou v každém řádku i každém sloupci. Jeho nepravidelné rozložení snižuje pravděpodobnost barevného moaré na jemných opakujících se detailech, takže Fujifilm může vynechat rozmazávací filtr, který má mnoho snímačů, za cenu obtížnější rekonstrukce.
- Jiná řešení: monochromatické snímače nemají filtr vůbec, takže každá fotobuňka vidí plný detail (fotoaparáty Monochrom od Leicy); Foveon od Sigmy skládá na sebe tři vrstvy, které pohlcují barvy v různých hloubkách křemíku; mnoho telefonů seskupuje čtyři fotobuňky jedné barvy (Quad Bayer) a za šera je čte jako jednu.
Bayerův snímač s 24 MP tedy zaznamená 24 milionů čísel, každé pro jedinou barvu: dvě ze tří barev každého pixelu chybějí. Proměnit tuto mozaiku v obraz je úkol demozaikování, viz níže.
Co obsahuje soubor RAW
JPEG je hotový obrázek: fotoaparát už udělal všechna rozhodnutí. Soubor RAW drží čísla snímače z doby před těmito rozhodnutími, se vším, co je potřeba k tomu, aby se udělala později:
- samotné vzorky, jeden na fotobuňku, a pod jakou barvou filtru každý ležel;
- úrovně černé a bílé;
- aktivní oblast (fotobuňky, které viděly světlo; pár řádků a sloupců na okrajích je záměrně zakrytých, aby se změřila černá) a výchozí ořez fotoaparátu;
- vyvážení bílé, které fotoaparát zvolil při pořízení fotky;
- barevné matice, které říkají, jak se vlastní červená, zelená a modrá tohoto snímače vztahují k barvám, které vidí lidé;
- náhled, JPEG, který si fotoaparát udělal sám, s vlastní barvou a tónem, a k tomu data EXIF.
Každý výrobce má svůj formát, většinou postavený na TIFF a zčásti nezdokumentovaný: CR2 a CR3 (Canon), NEF (Nikon), ARW (Sony), RW2 (Panasonic), ORF (Olympus), RAF (Fujifilm). DNG je formát, který Adobe otevřeně publikuje (verze 1.7), používají ho Ricoh, Leica, Pentax a mnoho telefonů a právě podle jeho pravidel postupuje tato stránka.
Fotollection čte DNG vlastní čtečkou napsanou podle specifikace a ostatní formáty rozbaluje rawler, knihovna pod licencí LGPL zabudovaná do Fotollection. Miniatury v mřížce data snímače vůbec nepoužívají: pocházejí z náhledu uvnitř souboru, za 9 až 32 ms, a proto se složka souborů RAW otevře stejně rychle jako složka JPEG.
Demozaikování: dopočítání dvou chybějících barev
Rekonstrukci dvou chybějících barev každého pixelu z jeho sousedů se říká demozaikování a ta víc než kterýkoli jiný krok rozhoduje o tom, jak ostrá a čistá fotka z RAW bude. Každá metoda stojí před stejným dilematem: průměrovat sousedy je bezpečné v rovných plochách, ale přes hranu to smíchá dva různé povrchy, takže umění spočívá v tom poznat, kteří sousedé k sobě patří.
- Bilineární metoda prostě zprůměruje nejbližší fotobuňky každé barvy. Je to dno, podle kterého se měří každá metoda: měkké a s barevnými lemy podél každé ostré hrany, protože červená, zelená a modrá se průměrují přes trochu odlišná místa.
- Malvar–He–Cutler (2004) vychází z tohoto průměru a opravuje ho detailem barvy, kterou fotobuňka viděla, pomocí pevných filtrů 5 × 5. Je ostřejší a pořád velmi rychlá. Fotollection s ní vyvolával až do v0.10.0.
- PPG (patterned pixel grouping) nejdřív rozhodne, ve kterém směru se obraz mění nejméně, a interpoluje jen v tomto směru. Používá ji rawler a do v0.10.0 ji pro většinu formátů používaly i verze Fotollection pro Windows a Linux.
- RCD (ratio corrected demosaicing, od Luise Sanze Rodrígueze) pracuje s poměry mezi barvami místo rozdílů, což lépe drží ve světlých i tmavých oblastech, a je známá málem artefaktů na jemných detailech; nabízejí ji darktable a RawTherapee.
- Markesteijn, podle Franka Markesteijna, je metoda určená pro X-Trans, v jednom průchodu nebo, pomaleji a čistěji, ve třech.
- Demozaikování Fotollection od v0.10.0 přebírá od RCD způsob, jak rozhodnout o směru, pak odhadne zelenou z každé strany opravenou o vlastní barvu fotobuňky (jak to dělali Hamilton a Adams), váženou podle toho, jak moc se každá strana mění. Nejdřív jsme napsali vlastní poměrový krok RCD a na našich testovacích obrazcích dopadl hůř, takže v aplikaci je varianta, která zvítězila, pod vlastním jménem.
Když metoda odhadne špatně, projeví se to čtyřmi typickými způsoby:
- zip (zipper): řada střídavě světlých a tmavých pixelů podél ostré hrany, kde metoda vzala sousedy z obou stran;
- bludiště (maze): jemný červovitý vzor v rovných plochách, když dvě zelené Bayerova čtverce nečtou úplně stejně (leží na řádcích s jinými sousedy a na mnoha snímačích se liší o procento nebo dvě);
- falešné barvy: barevné tečky nebo lemy na detailu, který je ve skutečnosti šedý, jako látka, vlasy, cihlová zeď nebo vzdálený plot;
- moaré: barevné vlny přes velmi jemné opakující se vzory, jemnější, než dokáže barevný filtr navzorkovat.
Jak jednu hodnotíme. Naše oči snadno oklame výsledek, který vypadá ostřeji, takže každá metoda se hodnotí na obrázcích, jejichž pravda je přesně známá. Počítač nakreslí pět testovacích obrazců o 768 px: zónovou desku (kruhy, které se k okraji zjemňují až po nejjemnější detail, který udrží zelené fotobuňky), Siemensovu hvězdu se 72 paprsky, pruhy syté barvy na šedé ve třech směrech, plynulé barevné přechody a rovnou šedou se dvěma zelenými o 2 % od sebe. Každý se převede na to, co by zaznamenal Bayerův snímač, demozaikuje se a porovná s originálem. PSNR měří celkovou chybu v decibelech (víc je lépe; každých 6 dB ji půlí); falešná barva je průměrná barva, která se objeví na šedých obrazcích; chyba hran je průměrná chyba do 2 px od hrany.
| Obrazec (768 px) | Bilineární | Malvar (naše do v0.10.0) | Naše od v0.10.0 |
|---|---|---|---|
| Zónová deska: PSNR, víc je lépe | 13,0 dB | 17,3 dB | 16,5 dB |
| Zónová deska: falešná barva, méně je lépe | 65,9 | 43,0 | 18,7 |
| Siemensova hvězda: PSNR | 21,3 dB | 25,2 dB | 37,9 dB |
| Siemensova hvězda: falešná barva | 9,4 | 8,4 | 0,16 |
| Pruhy syté barvy: chyba podél hran, méně je lépe | 11,6 | 21,6 | 10,5 |
| Plynulé přechody: PSNR | 78,9 dB | 77,5 dB | 78,4 dB |
| Rovná šedá s rozdílem zelených: bludiště, méně je lépe | 0,38 | 0,38 | 0 |
| Textura s vadnými pixely: zbylé na 10 000, méně je lépe | 35,8 | 66,5 | 0 |
Malvar je na jemném šedém detailu asi o 4 dB lepší než bilineární metoda, jak slibuje jeho článek, ale horší podél hran mezi sytými barvami, protože jeho oprava si půjčuje detail jedné barvy pro ostatní a předpokládá, že se mění společně, což červená cedule na šedé zdi nedělá. Ani jedna neodstraní bludiště, které není problémem demozaikování, ale rozdílem mezi dvěma zelenými, který je třeba vyrovnat předem. To jsou mezery, které náš řetězec od v0.10.0 zavírá: vadné pixely a nerovnováha zelených se opraví, dokud každá fotobuňka drží jen to, co změřila, směrové demozaikování zrekonstruuje barvy a malý medián na barevných rozdílech odstraní zbylou falešnou barvu. Na testovacích obrazcích vítězí všude kromě celkového PSNR zónové desky, kde je o 0,8 dB pod Malvarem u nejjemnějšího detailu, kde aliasuje každá metoda; i tam se jeho falešná barva půlí. Na devíti skutečných souborech přiblíží vyvolání každého fotoaparátu s Bayerovým snímačem k vlastnímu JPEG fotoaparátu stejně nebo víc a na 24 MP stojí asi 180 ms proti Malvarovým 40: pár desetin sekundy navíc na fotku, za tisky s čistšími detaily.
Od barev fotoaparátu k tvým
Červená, zelená a modrá fotoaparátu nejsou ty z tvé obrazovky: filtry každého snímače používají vlastní barviva a překrývají se jinak než čípky našich očí. Barevné matice v souboru převedou barvy fotoaparátu do CIE XYZ, standardního modelu lidského barevného vidění definovaného v roce 1931, a odtud do sRGB, barevného prostoru většiny obrazovek a fotolabů.
- Vyvážení bílé přichází první: zisk na červené a na modré, aby něco bílého ve scéně vyšlo neutrálně. Fotoaparát zaznamená zisky, které zvolil, a Fotollection je použije před demozaikováním, aby barevné rozdíly, o které se výše uvedené metody opírají, zůstaly malé.
- DNG obvykle nese dvě matice, jednu změřenou pod teplým žárovkovým světlem a jednu za denního světla. Ta správná pro tvou fotku leží mezi nimi: vyvolávač z vyvážení bílé snímku zjistí jeho světlo jako barevnou teplotu a obě smíchá. Fotollection dělá totéž pro ostatní formáty, z matic, které rawler zná pro každý model fotoaparátu.
- To všechno se děje v lineárním světle, na vlastní stupnici snímače, před jakoukoli křivkou. Míchání, škálování a zmenšování barev v lineárním světle dává fyzikálně správné výsledky; po křivce to tmaví hrany a posouvá barvy.
Vzhled fotoaparátu. Vlastní JPEG fotoaparátu není neutrální: každý výrobce přidává svůj kontrast, své barvy a své pleťové tóny a tento vzhled je jedním z důvodů, proč si lidé vybírají značku. Od v0.10.0 se fotka RAW otevře v neutrálním podání, věrném matici snímače, se stíněním objektivu a expozicí, kterou zvolil fotoaparát; Like the camera’s JPEG je o jedno kliknutí dál v kartě RAW colour fotky RAW, pro jednu fotku nebo pro všechny RAW najednou. (Do v0.10.0 se každý RAW přizpůsoboval JPEG fotoaparátu; projekt uložený tehdy si tento vzhled ponechá.) Tato volba přizpůsobí JPEG fotoaparátu oběma způsoby, jednou křivkou a maticí nebo jednou křivkou na kanál, a ponechá ten, který je pro daný soubor blíž: na Nikonu D750 rozdíl půlí, z 2,26 na 1,16 v ΔE2000. Miniatury v mřížce si ponechávají vlastní náhled fotoaparátu, jako v Lightroomu.
Tón: od lineárních čísel k obrazu
Lineární čísla vypadají na obrazovce tmavě a mdle, protože zdvojnásobení světla, které snímač zaznamená jako dvojnásobné číslo, nám připadá jako jeden stupeň jasu. Tónová křivka promění stupnici snímače v obraz: umístí střední šedou, zvedne stíny, světla jemně zaoblí, místo aby je naráz ořízla, a dá obrazu kontrast. Obraz se pak uloží s křivkou sRGB (její „gamma“), která věnuje víc z 256 úrovní JPEG stínům, kde si naše oči kroků všimnou nejvíc.
Dvě opravy, které fotoaparát dělá ve svém JPEG, v datech RAW nejsou, a obě jsou pro tisk důležité:
- Stínění objektivu: každý objektiv je směrem do rohů tmavší. Fotollection změří, o kolik je fotoaparát zesvětlil, z jeho vlastního náhledu, jako radiální zisk. Když se naše vyvolání DNG poprvé porovnalo s JPEG fotoaparátu, střed byl asi o 4 L* příliš světlý a rohy o 1,5 příliš tmavé; radiální zisk snížil rozdíl z ΔE 3,8 na 2,67, přičemž každá oblast fotky byla v rozmezí ±0,5 L*.
- Zkreslení: mírný soudkovitý nebo poduškovitý tvar objektivu. Fotoaparáty Micro Four Thirds (Panasonic, Olympus) jsou navrženy tak, aby ho opravoval fotoaparát, a jejich soubory zaznamenávají jak. Na Macu tyto soubory vyvolává macOS, který opravu použije; oprava v našem vlastním vyvolání je v plánu (FR-085).
Jak Fotollection vyvolá RAW, krok za krokem
Pro plné vyvolání, to za náhledem tisku, zoomem a exportem:
- Rozpoznání formátu podle prvních bajtů souboru, nikdy podle názvu, takže i přejmenovaný soubor nebo RAW, který vypadá jako obyčejný TIFF, se přečte správně.
- Čtení čísel snímače: DNG naší vlastní čtečkou, ostatní formáty rozbalí rawler. Příliš velký nebo poškozený soubor se odmítne dřív, než se dekóduje jediný pixel, s kódem chyby.
- Úrovně: černá na 0 a bílá na 1, pro každou pozici barevného filtru, počítáno od rohu aktivní oblasti.
- Vyvážení bílé, pak demozaikování: nejdřív vadné pixely a vyvážení zelených, směrové demozaikování, medián proti falešné barvě (Markesteijn pro X-Trans přijde ve v0.15.0).
- Barva: matice fotoaparátu, smíchané podle světla snímku, v lineárním světle.
- Tón a vzhled, přizpůsobené náhledu fotoaparátu, s jeho stíněním objektivu.
- Od této chvíle je fotka RAW jako každá jiná: ořez, datum na fotce, rámeček, formát tisku a barevný profil, export v plném rozlišení ve 4:4:4 v kvalitě 95.
Po celou dobu platí několik pravidel. Najednou běží jen jedno vyvolání, rozložené na všechna jádra procesoru a nikdy ne na vlastním vlákně okna, takže Fotollection odpovídá, i když se vyvolává fotka s 30 MP. Exporty vždy běží na procesoru, takže tisk vyjde stejně na každém počítači; grafická karta jen zrychluje to, co vidíš při úpravách. A kód je náš vlastní, napsaný podle publikovaných specifikací a odborných článků, nezkopírovaný z jiných projektů, a pak ověřený: na syntetických obrazcích výše, na devíti souborech RAW z devíti fotoaparátů (CC0, z raw.pixls.us) a záměrným ořezáváním a poškozováním souborů, aby špatný soubor byl chybou, nikdy pádem.
Od v0.10.0: naše vlastní vyvolání pro každý fotoaparát s Bayerovým snímačem. rawler soubory jen rozbalí a zbytek je práce Fotollection. Plné vyvolání devíti vzorových souborů, medián ze 3, na stejném notebooku: naše vyvolání s čistším demozaikováním proti jednoduššímu z rawleru a proti macOS:
| Fotoaparát (formát) | Vlastní Fotollection | rawler | macOS |
|---|---|---|---|
| Panasonic GX9 (RW2, 20 MP) | 280 ms | 216 ms | 436 ms |
| Panasonic S5 (RW2, 24 MP) | 442 ms | 301 ms | 1 044 ms |
| Olympus E-M10 III (ORF, 16 MP) | 308 ms | 364 ms | 1 164 ms |
| Sony A7 III (ARW, 24 MP) | 372 ms | 241 ms | 488 ms |
| Canon R10 (CR3, 24 MP) | 494 ms | 360 ms | 1 647 ms |
| Ricoh GR III (DNG, 24 MP) | 523 ms | 650 ms | — |
| Nikon D750 (NEF, 24 MP) | 502 ms | 402 ms | 412 ms |
| Canon 5D Mark IV (CR2, 31 MP) | 691 ms | 565 ms | 418 ms |
| Fujifilm X-T3 (RAF, 26 MP, X-Trans) | na řadě | 524 ms | 1 339 ms |
To naše trvá o desetinu až čtvrtinu sekundy déle než to z rawleru, kvůli čistšímu demozaikování a přizpůsobeným barvám, a na většině fotoaparátů zůstává rychlejší než macOS; děje se jednou na fotku a posuvník pak dokončí uchovanou kopii znovu za 4 až 11 ms. Na Macu zůstávají soubory z Panasonicu a Olympusu u macOS kvůli jeho korekci objektivu, dokud naše vlastní vyvolání neopraví zkreslení. Šedá pole z S5 vycházejí neutrálněji než přes rawler (barevný nádech 1,42 proti 2,43, kde 0 je dokonale šedá). Fujifilm X-Trans přijde s Markesteijnem a po něm vyvolání na grafické kartě pro náhled, s výsledkem procesoru jako referencí.
Návrhy nejlepších snímků: ověřené proti volbě člověka
Ručně jsme roztřídili 95 skutečných fotek do 22 momentů a tam, kde byla jasně nejlepší fotka, jsme ji vybrali. Skupiny a návrhy Fotollection jsme pak ověřili proti této volbě.
Jak vznikají návrhy a jak se hodnotí
Nejdřív se najdou momenty. Fotky se seřadí podle času pořízení, na zlomky sekundy, a nový moment začíná, když je mezera delší než 2 sekundy nebo čtyřnásobek obvyklé mezery, když se změní fotoaparát nebo objektiv, nebo když se místo posune o víc než 30 m. Každá fotka navíc dostane malý vizuální podpis, rozložení světlých a tmavých ploch a směs barev, a snímek se k momentu připojí jen tehdy, když pořád vypadá jako snímky před ním, s tolerancí pro krok stranou nebo zoom, který vysvětlí ohnisková vzdálenost.
Pak se v rámci momentu každá fotka změří na zmenšené kopii: ostrost hlavního motivu, roztřesení, expozice (přepálená světla, slité stíny, jas), šum a tam, kde jsou obličeje, zda jsou oči otevřené a obličeje otočené k fotoaparátu. Každé měřítko se porovnává jen s ostatními snímky téhož momentu a má svou váhu (ostrost motivu 35 %, otevřené oči 20 %, roztřesení 15 %, expozice 15 %, přepálená světla 10 %, zbytek méně), s nejmenším krokem, aby nikdy nerozhodl rozdíl příliš malý na to, aby byl na tisku vidět. Návrh přichází i s důvodem, nic se nemaže a všechno běží na tvém počítači, 17 ms na fotku, 28 ms s obličeji.
Aby bylo hodnocení poctivé, 95 skutečných fotek bylo ručně roztříděno do 22 momentů, u 6 momentů s jasně nejlepším snímkem i s fotkou, kterou si nechat. Každé zlepšení se hodnotilo podle toho:
| Krok | Nalezené momenty (z 22) | Chybná sloučení | Přijatelné volby |
|---|---|---|---|
| Jen otisk obrazu | 3 | 0 | 2 ze 2 |
| Plus rozložení a barva | 13 | 0 | 3 ze 4 |
| Plus zoom z ohniskové vzdálenosti | 15 | 0 | 5 ze 6 |
| Plus spravedlivá ostrost a skryté obličeje | 15 | 0 | 6 ze 6 |
Dva různé momenty se nikdy nespojí do jedné skupiny; dvě skupiny navíc jsou dvojice, které byly ručně označeny jako nejasné. Momenty, které se zatím nenajdou, jsou ty, kde se hodně změní póza nebo kompozice, třeba jídlo vyfocené znovu z druhé strany.
Slova, která stojí za čísly
Žargon fotek a tisku, vysvětlený tak, jak bychom ho vysvětlili kamarádovi.
Co je ΔE (Delta E)?16
ΔE měří, jak daleko od sebe dvě barvy lidskému oku připadají, počítané v barevném prostoru vytvořeném tak, aby odpovídal tomu, jak vidíme (CIELAB, se vzorcem z roku 2000). 0 znamená shodné. Kolem 1 je nejmenší rozdíl, který cvičené oko pozná při porovnání vedle sebe; 2 až 3 vidí většina lidí; nad 5 vypadají barvy odlišně. Export Fotollection pro tisk má průměr 0,19.
Co je SSIM?17
SSIM, index strukturní podobnosti, porovnává tvary a textury dvou obrázků místo jednotlivých pixelů, což je blíž tomu, jak si všímáme rozmazání nebo kostičkovité komprese. 1 znamená shodné. Nad zhruba 0,98 většina lidí ty dva obrázky bez přiblížení nerozezná.
Kolik barev pojme JPEG?6,18
JPEG ukládá 8 bitů pro každou z červené, zelené a modré: po 256 úrovních, asi 16,7 milionu barev. Z toho tisknou i fotolaby. Soubory RAW z fotoaparátu mají 12 až 14 bitů a novější iPhony umí ukládat 10bitový HEIC, což pomáhá při úpravách; pro hotový tisk neukáže dobře udělaný 8bitový JPEG mezi tóny žádné schody.
JPG, nebo JPEG? A mám použít PNG?
JPG a JPEG jsou stejný formát: staré Windows dovolovaly jen třípísmenné přípony. PNG je bezeztrátový, takže se nic nezahodí, ale fotka uložená jako PNG je často třikrát až pětkrát větší a většina kiosků a fotolabů čeká JPEG. JPEG v kvalitě 90 nebo vyšší s plným barevným rozlišením (4:4:4), jak ho Fotollection exportuje pro tisk, je na papíře od originálu k nerozeznání.
Co znamenají 4:4:4 a 4:2:0?
Naše oči vidí detaily hlavně v jasu, méně v barvě, takže JPEG může ukládat barvu v nižším rozlišení. 4:4:4 zachová plné barevné rozlišení; 4:2:0 zachová jeho čtvrtinu, což zmenší soubory, ale změkčí barevné hrany, třeba červený text nebo modré nebe za listím. Tisky si zaslouží 4:4:4; sociální sítě stejně všechno znovu zkomprimují na 4:2:0.
sRGB, Display P3, Adobe RGB a barevné profily19,20,21
Barevný profil říká softwaru, co znamenají čísla v souboru. sRGB je klasický rozsah barev používaný na webu. Display P3, který používají iPhony a novější fotoaparáty, obsáhne asi o 25 % víc barev, hlavně červených a zelených. Když fotka v P3 ztratí profil, její čísla se čtou jako sRGB a vypadá vybledle: to je ta ztráta 13 % sytosti, kterou jsme naměřili. Adobe RGB, které některé fotoaparáty nabízejí pro tisk, je také širší než sRGB, hlavně v zelených a azurových. Fotollection pro tisk zachová jakýkoli profil, který fotka má, a pro sociální sítě ji správně převede do sRGB.
Jaké DPI tisk potřebuje?
DPI udává, kolik pixelů připadá na každý palec papíru. Při 300 DPI vypadá tisk ostře i zblízka; 150 až 200 DPI stačí na vzdálenost natažené paže. Tisk 10 × 15 cm při 300 DPI potřebuje 1 800 × 1 200 pixelů, takže stačí jakákoli fotka z telefonu nebo fotoaparátu; rada k velikosti v aplikaci ti řekne, jak velká každá fotka může být.
Proč fotky na Facebooku vypadají hůř?
Facebook zmenší každou fotku nejvýš na 2 048 px, znovu ji zkomprimuje v nižší kvalitě s polovičním barevným rozlišením a zahodí barevné profily. Fotka, která přijde moc velká, se zmenšuje dvakrát, jednou tebou a jednou Facebookem. Když ji pošleš rovnou ve 2 048 px, v sRGB a lehce doostřenou, Facebook ji zkomprimuje jen jednou a barvy už jsou správně.
Spusť měření sám
Všechno se dá zopakovat na tvých vlastních fotkách. Skripty nikdy žádnou fotku nenahrají ani nezkopírují; uchovávají se jen čísla. Celé tabulky se všemi běhy jsou v RESULT.md.
bench/run.sh ~/Pictures/some-folder 3
uv run bench/quality/audit.py ~/Pictures/some-folder /tmp/out
uv run bench/quality/share_audit.py ~/Pictures/some-folder /tmp/share