5.19. Sävykorjaukset¶
Sävykorjaukset muuttavat sitä, miten kirkkaus ja väri jakautuvat otetussa kuvassa – ne ovat korjauksia, joita sovellus tekee, kun kehys on liian tumma, liian kirkas, liian lattea tai vinoutunut väärään väriin.
Korjaukset jakautuvat kahteen ryhmään: kirkkaus- ja kontrastisäätöihin, jotka jakavat kirkkauden uudelleen, ja värisäätöihin, jotka muuttavat sitä, minä värinä kukin pikseli luetaan. Molemmilla on vastineensa sensorin ISP-prosessissa, joka korjaa jokaisen kehyksen sen saapuessa; tässä esitellyt menetelmät kohdistuvat jo otettuun Image-kuvaan jälkikäteen niitä tapauksia varten, joissa kehys tarvitsee enemmän korjausta kuin ISP tarjosi.
5.19.1. Histogrammin tasoitus¶
Yksinkertaisin kontrastia venyttävä operaatio on histogrammin tasoitus. Ajatuksena on kuvata pikseliarvot uudelleen niin, että lopputuloksen histogrammi on mahdollisimman tasainen – jokainen arvo esiintyy suunnilleen yhtä usein. Visuaalinen vaikutus on, että matalakontrastinen kuva (jonka histogrammi keskittyy kapealle kaistalle) muuttuu korkeakontrastiseksi kuvaksi, jonka pikselit kattavat koko 0 – 255 -alueen.
histeq() suorittaa tasoituksen:
img.histeq()
Mekanismi on suoraviivainen. Lähdekuvan histogrammin kertymäfunktio (CDF) lasketaan; jokainen syötepikselin arvo kuvataan sen sijaintiin CDF:ssä ja skaalataan lähtöalueelle. Siellä missä pikselit olivat jo tasaisesti jakautuneet, kuvaus on lähellä identiteettiä; siellä missä pikselit olivat kasautuneet yhteen kirkkauteen, kuvaus levittää ne venyttämällä tuon kirkkauden laajemmalle lähtöarvojen alueelle.
Tulos on dramaattinen matalakontrastisissa kohteissa – ero himmeän sisäkuvan ja saman kuvan histeq-käsittelyn jälkeen on usein ero ”lukukelvottoman” ja ”täysin luettavan” välillä. Vastapainona on, että operaatio vahvistaa kaikkea, mukaan lukien sensorin kohinaa. Kohteessa, jossa on todellista matalakontrastista yksityiskohtaa palautettavaksi, histeq on oikea vastaus; puhtaassa, hyvin valotetussa kohteessa, joka ei sitä yksinkertaisesti tarvitse, histeq tuo näkyvää kohinaa.
5.19.2. CLAHE: mukautuva tasoitus¶
Histogrammin tasoitus on globaali: se käyttää yhtä koko kuvasta laskettua CDF:ää ja soveltaa sitä kaikkialla. Tämä toimii kuvilla, joiden kirkkausalue on suunnilleen tasainen, mutta epäonnistuu kohteissa, joissa on paikallisia tummia ja kirkkaita alueita – CDF vetäytyy sille puolelle, jolla on enemmän pikseleitä, ja vastakkainen puoli ylikorjautuu.
Mukautuva muunnelma on kontrastirajoitettu mukautuva histogrammin tasoitus (Contrast Limited Adaptive Histogram Equalisation), yleisesti CLAHE. Yhden globaalin CDF:n sijaan CLAHE laskee erillisen CDF:n kuvan jokaiselle pienelle ruudulle, tasoittaa jokaisen ruudun sen omaa CDF:ää vasten ja sulauttaa ruutujen rajat yhteen. Tuloksena kirkkaussäädöt tapahtuvat paikallisesti – varjostunut kulma saa oman tasoituksensa ilman, että kirkas kulma vetää sitä väärään suuntaan.
adaptive=True -lippu vaihtaa histeq() -metodin CLAHE-tilaan:
img.histeq(adaptive=True, clip_limit=10)
clip_limit -parametri on se osa CLAHE:sta, johon nimen ”contrast limited” viittaa. Paikallinen tasoitus voi ylivahvistaa kohinaa latteilla alueilla, joilla CDF:llä on hyvin vähän erillisiä arvoja; clip-raja rajoittaa sitä, kuinka voimakkaasti mikä tahansa yksittäinen lokero voidaan jakaa uudelleen, mikä estää kohinan vahvistumisen mutta sallii silti kontrastin venyttämisen siellä, missä sillä on merkitystä. Arvo noin 10 on järkevä lähtökohta; suuremmat arvot antavat CLAHE:n työskennellä kovemmin näkyvämmän kohinan kustannuksella, pienemmät tekevät siitä hellävaraisemman.
CLAHE on kalliimpi kuin globaali histeq, mutta tuottaa puhtaampia tuloksia kohteissa, joissa kirkkaus on epätasaisesti jakautunut – mikä koskee useimpia tosielämän kohteita.
5.19.3. Gamma, kontrasti ja kirkkaus¶
Histogrammin tasoitus on datalähtöinen tapa kuvata kirkkaus uudelleen. Datasta riippumaton tapa on soveltaa valittua käyrää, jota säädellään muutamalla helposti viritettävällä nupilla. gamma() tarjoaa kolme:
img.gamma(gamma=1.0, contrast=1.0, brightness=0.0)
Kukin parametri soveltaa yhtä tiettyä muunnosta jokaiseen pikseliin:
gamma ajaa kunkin pikselin arvon potenssifunktion output = input ** (1 / gamma) läpi. Vakiomerkitys: arvot, jotka ovat suurempia kuin 1.0, kirkastavat kuvaa ja nostavat keskisävyjä (klassinen ”näytön gamma” -korjaus); arvot, jotka ovat pienempiä kuin 1.0, tummentavat sitä. Parametri on epälineaarinen – se säilyttää musta- ja valkopisteet ja muotoilee uudelleen vain niiden välisen jakauman, mikä on oikea käyttäytyminen, kun tavoitteena on palauttaa yksityiskohtia varjo- tai huippualueilla murskaamatta olemassa olevia ääripäitä.
contrast ajaa kunkin pikselin suoran kertolaskun läpi keskiharmaan pisteen ympärillä. Arvot, jotka ovat suurempia kuin 1.0, lisäävät kontrastia (tumma tummenee, kirkas kirkastuu, keskiharmaa pysyy samana); arvot, jotka ovat pienempiä kuin 1.0, vähentävät kontrastia.
brightness lisää vakion jokaiseen pikseliarvoon. Positiiviset arvot kirkastavat, negatiiviset arvot tummentavat. Siirto on yhtenäinen – mitään ei säilytetä – mikä on harvoin se, mitä sovellus haluaa yksinään, mutta se toimii hyvin yhdessä kontrastikäsittelyn kanssa lopputuloksen uudelleenkeskittämiseen.
Kolme parametria yhdistyvät: yksi gamma() -kutsu voi soveltaa gammakäyrää, sitten kontrastikertolaskua, sitten kirkkaussiirtoa, kaikki yhdellä kertaa. Järjestys on ensin gamma, sitten kontrasti, sitten kirkkaus, mikä vastaa järjestystä, joka antaa intuitiivisimmat tulokset, kun kaikki kolme poikkeavat oletusarvoistaan.
5.19.4. Automaattinen valkotasapaino¶
Sävykorjausten väriperhe alkaa automaattisesta valkotasapainosta. Sama mekanismi, jota sensorin ISP suorittaa osana kuvantamisputkea – punaisen, vihreän ja sinisen kanavan suhteellisten vahvistusten säätäminen niin, että keskimäärin harmaa laikku luetaan todellisena harmaana – on saatavilla myös oton jälkeisenä operaationa valmiille Image-kuvalle:
img.awb()
Oletus käyttää gray-world-algoritmia: koko kuvan keskimääräisen värin oletetaan olevan neutraalin harmaa, ja kanavakohtaiset vahvistukset säädetään niin, että näin on. Vaihtoehtoinen max=True -muoto käyttää white-patch-algoritmia: kirkkaimpien pikselien oletetaan olevan neutraalin valkoisia, ja vahvistukset säädetään niin, että näin on. Molemmat toimivat RGB565:llä ja raa’alla Bayer-datalla; kumpikaan ei toimi harmaasävyllä (jossa ei ole väriä tasapainotettavaksi) eikä YUV:lla (jossa väriesitys ei ole sitä, mihin nämä algoritmit operoivat).
Milloin kannattaa turvautua oton jälkeiseen muotoon ISP:n automaattisen valkotasapainon sijaan: kun ISP:n valinta sopi huonosti tietylle kohteelle, kun sovellus lataa levyltä referenssikehyksiä, jotka on otettu eri olosuhteissa, tai kun väriarvio on niin tärkeä, että sovellus haluaa suorittaa sen uudelleen omalla algoritmivalinnallaan.
5.19.5. Värinkorjausmatriisi¶
Kun kuvan tarvitsema värinkorjaus ei ole valkotasapainon antama kanavakohtainen skaalaus vaan yleisempi kanavien sekoitus, käytettävä operaatio on värinkorjausmatriisi. ccm() -metodi soveltaa 3-kertaa-3- (tai 3-kertaa-4 siirrolla) matriisia, joka kertoo jokaisen pikselin (r, g, b) -vektorin tuottaen uuden (r, g, b) -vektorin:
img.ccm([[1.1, -0.05, -0.05],
[-0.05, 1.1, -0.05],
[-0.05, -0.05, 1.1]])
Matriisin avulla sovellus voi korjata värikanavien välistä ylikuulumista – esimerkiksi siellä, missä punaisen sensorin vaste sisältää hieman vihreää valoa, matriisi voi vähentää osan vihreästä kanavasta punaisesta ulostulosta kompensoidakseen. Yhdistettynä kanavakohtaiseen siirtoon 3-kertaa-4-muoto antaa sovelluksen myös nollata jokaisen kanavan uudelleen.
ISP-putki -materiaali käsittelee värinkorjausmatriisien miksi-kysymystä. Oton jälkeinen muoto Image-kuvalla on vain sama operaatio, jälkikäteen sovellettuna.