Kodėl fotografuoju į RAW? (II dalis)

Taigi - antra dalis užtruko. Daug daug ilgiau negu tikėjausi. Bet pagaliau turiu viską, ko reikia užbaigti pradėtą darbą, todėl tęsiam atsakymų paiešką: kiek galima išspausti iš "nenusisekusio" kadro  apie kurį rašiau pirmoje dalyje?

Pradžiai apie įrankius kuriuos naudojau. Kadangi fotografija nėra mano profesija, o tik hobis, tai mokėti rimtus pinigus už rimtas programas a la Adobe Photoshop kažkaip ranka nekyla. Nelegalus instaliaviamas arba vagystė palieka tokį pošlykštį diskomforto jausmą, todėl jau senokai tuom neužsiiminėju. Taip, dažniausiai naudoju GIMP'ą, bet šiuo atveju jį išmečiau iš galimų variantų dėl per mažo tikslumo - jo vidiniai algoritmai naudoja tik aštuonių bitų koduotę. Todėl vėl pasirinkau  nemokamų programų paketo ImageMagick šešiolikos bitų instaliaciją. To paties, kurį naudojau pirmoje dalyje skirtumui matuoti. Toks komandinės eilutės įrankio pasirinkimas turi netgi šiokį tokį privalumą - į komandinį failą (.cmd, .bat ar .sh - skonio reikalas) surašius komandų seką, dviem klavišų paspaudimais gauni pakoreguotą vaizdą ir iškart pamatavimą, kiek jis artimas etalonui. Bet čia manęs pasirodo laukė "spąstai", kurie prarijo visą pagrindinį laiką skirtą šiam įrašui: tuos komandinius failus teko sukti nežinau kiek šimtų kartų, kol išspaudžiau kažkokį maksimumą iš kiekvieno vaizdo.

Kol neperėjom prie konkrečių vaizdų, įspėjimas: nebandykite to kartoti namuose - užmušit labai daug laiko :) Reikia pripažinti, kad pagrindinis mano eksperimento rezultatas - iki maksimalaus panašumo etalonui išspaustas vaizdelis - mažai pritaikomas praktikoje. Nes jeigu turite galimybę palyginti - vadinasi turit gerą kadrą ir tą prastąjį galit mesti lauk - kam prie jo vargti? O jeigu turit tik nenusisekusį, tai vis tiek geriau jį taisyti su įprasta vaizdų redagavimo programa, kurioje galit iš kart pamatyti - patinka ar ne jums rezultatas.

Taigi, jeigu neatmušiau noro toliau skaityti, pradinis vaizdelis:

Prie viršutinio kadro bandysim pritempti tą paskutinį, patį tamsiausią. Būtent tai ir krinta į akis - jis per tamsus. Logiškas žingsnis - šviesinam. Kažkiek pasikankinęs, sustojau prie štai šios komandų rikiuotės:
  -gamma 0.41667 -contrast-stretch 0.5%
  -channel R -level 0%,84%
  -channel RGB -gamma 3.5 -normalize
su štai tokiu rezultatu:
  Channel distortion: PSNR
    red: 28.4126
    green: 29.9785
    blue: 29.5257
    all: 29.2547
Priminsiu: iš RAW daryto JPG PSNR metrika buvo... ~30,1dB - beveik pasiekėm iš RAW daryto JPG lygį! Trumpai paanalizuokim, kokiais veiksmais tą pasiekiau: neutralizavau JPG gammą korekciją, tada tiesiškai ištempiau reikšmes per visą diapazoną, nukirsdamas po 0.5% iš abiejų pusių, sumažinau raudonos spalvos lygį, vėl sukoregavau gamma, kad būtų panaši į etalono, ir dar kartą ištempiau spalvų reikšmes nuo 0 iki maksimumo. Pažiūrim pradinio, visos šitos abrakadabros rezultato ir etalono histogramas:

Per vidurį matom tipiškai po JPG šviesinimo gaunamą "ežiuką". Tarpai tarp "spygliukų" reiškia, kad nuotraukoje nėra pakankamai tarpinių reikšmių, todėl gradientuose gali pasimatyti pastebimi šuoliukai tarp skirtingų atspalvių. Beje, nors ir labai dantyta, bet koreguoto JPG histograma žaliame ir raudonuose kanaluose gavosi panaši į etaloninė nuotraukos histogramą apačioje. Tačiau mėlynas kanalas atrodė, kaip sakoma, nei į tvorą, nei į mietą. Šis faktas man ir pakišo mintį, kad reikia optimizuoti kiekvieną kanalą atskirai. Kuom ir užsiėmiau - išskaidyti nuotrauką į atskirų kanalų vaizdus, surasti optimalias reikšmes kiekvienam iš kanalų, o tada vėl rekonstruoti "tobuliausią" priartėjimą. Taip pasididinau sau darbą šešis kartus. Nes suoptimizavęs grynąjį JPG, nusprendžiau padaryti tą patį padaryti ir JPG'ui iš RAW. Kadangi bedarydamas mokaisi, tai man dar teko šiuos veiksmus pakartoti bent kokias tris iteracijas su įvairiomis komandų kombinacijomis. Taip nejučia prabėgo beveik visas mėnuo.

Žinoma, jums skaityti, kaip aš čia artėjau prie galutinių skaičių, bus visai neįdomu. Todėl, daug netempiant - rezultatai. Vėlgi, pradėsiu nuo komandų kurias naudojau galutiniam rezultatui pasiekti:
Komanda\Kanalas R JPG G JPG B JPG R RAW G RAW B RAW
-contrast-stretch 0x0.01% 0x0.01% 0x0.01% 0.3x0% 0.2x0% 1x0.004%
-gamma 1.2 1.2 1.3 1.04
0.98
-sigmoidal-contrast 3.9x4% 4x5% 2.7x5%

1.2x30%
+sigmoidal-contrast


1.1x41% 0.6x35%
+level 0,92% 0,95% 0,96% 0,99.4% 0,99% 0,97%
-selective-blur 5x9+4% 3x4+5% 6x4+7% 8x12+9% 4x7+5% 7x10+7%
-blur 0x0.9 0x0.8 0x0.9 0x0.9 0x0.7 0x0.9
-quality 98 98 98 98 97 98

Arba pažingsniui:
  1. Pradžioje ištempiame nuotraukos spalvų reikšmes taip, kad jos užimtų visą reikšmių diapazoną nuo 0 iki 255 (contrast-stretch). Gauname, kaip ir nuotraukos pašviesėjimą.
  2. JPG naudoja netiesinę sRGB spalvų erdvę, dėl ko tenka pritaikyti gama korekciją (gamma) - šiek tiek perskirstome pustonius.
  3. Šiek tiek padidinamas arba sumažinamas kontrastas - pritaikomas dar vienas netiesinis filtras (sigmoidal-contrast).
  4. Šiek tiek sumažinamos - patamsinamos - kanalo reikšmės, kadangi etaloninio kadro spalvų kanalai nepasiekia 100% (level).
  5. Pašviesinus nuotraukas išryškėja triukšmai - tarytum būčiau fotografavęs su užkelta ISO jautrumo reikšme. Todėl pritaikomi triukšmo valymo filtrai (selective-blur ir blur).
  6. Dalį triukšmų galima nufiltruoti tiesiog išsaugant JPG su žemesne kokybę (quality) - nusifiltruoja tie erdvinio signalo dažniai, kurių lygis yra labai žemas. Iš esmės ten tik triukšmas.
Dabar kanalų histogramos palyginimui su etalonu - tiek JPG, tiek RAW variantams (kliktelėje gausit didesnį paveikslėlį):
Legenda: kanalo spalva pažymėtas koreguotas variantas; balta spalva - kur sutapo koreguotas ir etaloninis; kitos spalvos - etalono histograma nesutampanti su koreguotu vaizdu.
Kas visų pirma krenta į akis - nebeliko "ežiuko" JPG variante. Tiek JPG, tiek RAW atveju, etalono histogramą tiksliausiai atkartoja žalios spalvos kanalas. Ir tai matyt neatsitiktinai, nes žalios spalvos pikselių matricoje yra du kart daugiau, negu kitų spalvų. O sunkiausiai, kažkodėl, teko dirbti su raudonos spalvos kanalu - JPG atveju matosi net labai ryškūs skirtumai.

Dabar jau galiu atskleisti ir kokį PSNR pavyko pasiekti kiekvieno kanalo atveju. Primenu - lyginau JPG su JPG variantu, o RAW su RAW etalonu:

R JPG G JPG B JPG R RAW G RAW B RAW
PSNR 32.6335 35.4521 33.8193 33.8543 39.0363 35.5384

Ir galutinis PSNR pamatavimas, sujungus atskirus kanalus į vieną vaizdelį:

JPG RAW
PSNR 33.7562 35.5939

Deja, bet skaitine prasme galutinis rezultatas mane šiek tiek nuvylė - jis visiškai neypatingas: skirtumas nepilni du decibelai arba kokie 26%. Tiesa, su RAW buvo pasiektas vis tiek geresnis rezultatas. Bet ar tikrai toks, kad pagrįstų RAW naudojimą? Paliksiu tai nuspręsti jums patiems. O, kad būtų lengviau tai padaryti, pridėsiu štai šiuos vaizdelius, kuriuose matyti visi kanalai iš galutinio rezultato:

Hint: išsididine iki 100% ieškokite matomų "dėmių", ten kur turėtų būti tolydus perėjimas (gradientas), pvz. tamsesniajame bliūdelio šone arba lentynos gilumoje.

Mano akimis - RAW liko nenugalėtas.

2 comments: