5.19. Tonske korekcije¶
Tonske korekcije mijenjaju kako su svjetlina i boja raspoređene u snimljenoj slici – to su ispravke koje aplikacija primjenjuje kada je sličica pretamna, presvijetla, preplošna ili nakošena prema pogrešnoj boji.
Korekcije pripadaju dvjema obiteljima: prilagodbama svjetline i kontrasta koje preraspodjeljuju svjetlinu te prilagodbama boje koje mijenjaju kojom se bojom svaki piksel očitava. Obje imaju svoje analogone u senzorovom ISP-u, koji ispravlja svaku sličicu pri njezinu ulasku; ovdje opisane metode primjenjuju se na već snimljenu Image, naknadno, za slučajeve kada sličica treba više korekcije nego što ju je ISP pružio.
5.19.1. Izjednačavanje histograma¶
Najjednostavnija operacija rastezanja kontrasta jest izjednačavanje histograma. Ideja je preslikati vrijednosti piksela tako da histogram izlaza bude što ravniji – da se svaka vrijednost pojavljuje približno jednako često. Vizualni je učinak da slika niskog kontrasta (ona čiji je histogram koncentriran u uskom pojasu) postaje slika visokog kontrasta čiji pikseli pokrivaju cijeli raspon 0 – 255.
histeq() pokreće izjednačavanje:
img.histeq()
Mehanizam je izravan. Izračuna se kumulativna funkcija distribucije (CDF) histograma izvora; svaka ulazna vrijednost piksela preslikava se na svoj položaj u CDF-u, skaliran na izlazni raspon. Tamo gdje su pikseli već bili ravnomjerno raspoređeni, preslikavanje je blisko identitetu; tamo gdje su pikseli bili nagomilani na jednoj svjetlini, preslikavanje ih razvlači rastezanjem te svjetline preko šireg raspona izlaznih vrijednosti.
Rezultat je dramatičan na scenama niskog kontrasta – razlika između tamne unutarnje fotografije i iste fotografije nakon histeq često je razlika između „nečitljivog” i „savršeno čitljivog”. Kompromis je u tome što operacija pojačava sve, uključujući šum senzora. Na sceni sa stvarnim detaljima niskog kontrasta koje treba povratiti, histeq je pravi odgovor; na čistoj, dobro eksponiranoj sceni kojoj to jednostavno nije potrebno, histeq unosi vidljiv šum.
5.19.2. CLAHE: prilagodljivo izjednačavanje¶
Izjednačavanje histograma je globalno: koristi jedan CDF izračunat iz cijele slike i primjenjuje ga posvuda. To djeluje na slikama čiji je raspon svjetline približno ujednačen, ali zakaže na scenama s lokaliziranim tamnim i svijetlim područjima – CDF se povlači prema strani koja ima više piksela, a suprotna strana biva prekomjerno ispravljena.
Prilagodljiva inačica jest kontrastom ograničeno prilagodljivo izjednačavanje histograma (Contrast Limited Adaptive Histogram Equalisation), uobičajeno nazivano CLAHE. Umjesto jednog globalnog CDF-a, CLAHE izračunava zaseban CDF za svaku malu pločicu slike, izjednačava svaku pločicu u odnosu na njezin vlastiti CDF te međusobno stapa granice pločica. Rezultat je da se prilagodbe svjetline događaju lokalno – zasjenjeni kut dobiva vlastito izjednačavanje, a da ga svijetli kut ne povlači u krivom smjeru.
Zastavica adaptive=True prebacuje histeq() u CLAHE način rada:
img.histeq(adaptive=True, clip_limit=10)
Parametar clip_limit dio je CLAHE-a na koji se odnosi „kontrastom ograničeno” iz naziva. Lokalno izjednačavanje može prekomjerno pojačati šum u plošnim područjima gdje CDF ima vrlo malo zasebnih vrijednosti; granica odsijecanja ograničava koliko se agresivno bilo koji pojedinačni razred može preraspodijeliti, što sprječava pojačavanje šuma uz istodobno dopuštanje rastezanja kontrasta tamo gdje je važno. Vrijednost oko 10 razumna je polazna točka; veće vrijednosti puštaju CLAHE da radi snažnije po cijenu vidljivijeg šuma, manje vrijednosti čine ga blažim.
CLAHE je skuplji od globalnog histeq, ali daje čišće rezultate na scenama gdje je svjetlina neravnomjerno raspoređena – a to je većina stvarnih scena.
5.19.3. Gama, kontrast i svjetlina¶
Izjednačavanje histograma je način preslikavanja svjetline vođen podacima. Podacima neovisan način jest primjena odabrane krivulje, parametrizirane s nekoliko lako podesivih gumba. gamma() pruža tri:
img.gamma(gamma=1.0, contrast=1.0, brightness=0.0)
Svaki parametar primjenjuje jednu određenu transformaciju na svaki piksel:
gamma provodi vrijednost svakog piksela kroz potencijsku funkciju output = input ** (1 / gamma). Standardno značenje: vrijednosti veće od 1.0 posvjetljuju sliku i podižu srednje tonove (klasična korekcija „monitorske game”); vrijednosti manje od 1.0 ju zatamnjuju. Parametar je nelinearan – čuva crnu i bijelu točku te samo preoblikuje raspodjelu između njih, što je pravo ponašanje kada je cilj povratiti detalje u sjeni ili u svijetlim područjima bez gnječenja postojećih ekstrema.
contrast provodi svaki piksel kroz izravno množenje oko točke srednje sive. Vrijednosti veće od 1.0 povećavaju kontrast (tamno postaje tamnije, svijetlo postaje svjetlije, srednja siva ostaje ista); vrijednosti manje od 1.0 smanjuju kontrast.
brightness dodaje konstantu svakoj vrijednosti piksela. Pozitivne vrijednosti posvjetljuju, negativne zatamnjuju. Pomak je jednolik – ništa se ne čuva – što je rijetko ono što aplikacija sama po sebi želi, ali se dobro slaže s prolazom kontrasta radi ponovnog centriranja rezultata.
Tri se parametra slažu zajedno: jedan poziv gamma() može primijeniti gama krivulju, zatim množenje kontrasta, pa pomak svjetline, sve u jednom prolazu. Redoslijed je prvo gama, zatim kontrast, pa svjetlina, što odgovara redoslijedu koji daje najintuitivnije rezultate kada su sva tri parametra različita od zadanih.
5.19.4. Automatska ravnoteža bijele¶
Obitelj tonskih korekcija za boju počinje s automatskom ravnotežom bijele. Isti mehanizam koji senzorov ISP pokreće kao dio cjevovoda obrade slike – prilagodba relativnih pojačanja na crvenom, zelenom i plavom kanalu tako da se prosječno sivo obojena površina očita kao stvarno siva – dostupan je i kao operacija nakon snimanja na gotovoj Image:
img.awb()
Zadano se koristi algoritam sivoga svijeta (gray-world): pretpostavlja se da je prosječna boja cijele slike neutralno siva, a pojačanja po kanalu prilagođavaju se kako bi tomu bilo tako. Alternativni oblik max=True koristi algoritam bijele površine (white-patch): pretpostavlja se da su najsvjetliji pikseli neutralno bijeli, a pojačanja se prilagođavaju kako bi tomu bilo tako. Oba rade na RGB565 i na sirovom Bayeru; nijedan ne radi na sivim tonovima (gdje nema boje koju treba uravnotežiti) niti na YUV-u (gdje prikaz boje nije ono na čemu ti algoritmi rade).
Kada posegnuti za oblikom nakon snimanja umjesto za ISP-ovom automatskom ravnotežom bijele: kada je ISP-ov izbor bio loše prilagođen određenoj sceni, kada aplikacija učitava referentne sličice s diska koje su snimljene u drugačijim uvjetima ili kada je procjena boje dovoljno važna da aplikacija želi ponovno provesti ravnotežu s vlastitim izborom algoritma.
5.19.5. Matrica korekcije boje¶
Kada korekcija boje koja je slici potrebna nije skaliranje po kanalu kakvo pruža ravnoteža bijele, nego općenitije miješanje kanala, operacija za koju treba posegnuti jest matrica korekcije boje. Metoda ccm() primjenjuje matricu 3-puta-3 (ili 3-puta-4 s pomakom) koja množi vektor (r, g, b) svakog piksela kako bi proizvela novi vektor (r, g, b):
img.ccm([[1.1, -0.05, -0.05],
[-0.05, 1.1, -0.05],
[-0.05, -0.05, 1.1]])
Matrica dopušta aplikaciji da ispravi preslušavanje između kanala boje – gdje, primjerice, odziv crvenog senzora uključuje nešto zelene svjetlosti, matrica može oduzeti dio zelenog kanala od crvenog izlaza radi kompenzacije. U kombinaciji s pomakom po kanalu, oblik 3-puta-4 dopušta aplikaciji i ponovno postavljanje nule svakog kanala.
Gradivo o ISP cjevovodu pokriva zašto matrica korekcije boje. Oblik nakon snimanja na Image upravo je ista operacija, primijenjena naknadno.