5.19. Tonális korrekciók¶
A tonális korrekciók megváltoztatják, hogyan oszlik el a fényerő és a szín egy rögzített képen – ezek azok a javítások, amelyeket egy alkalmazás alkalmaz, amikor egy képkocka túl sötét, túl világos, túl lapos, vagy a rossz szín felé torzul.
A korrekciók két családba sorolhatók: a fényerő-és-kontraszt beállítások, amelyek újraosztják a fényerőt, valamint a szín beállítások, amelyek megváltoztatják, milyen színként olvasódik be az egyes képpontok. Mindkettőnek van megfelelője az érzékelő ISP-jében, amely minden képkockát beérkezéskor korrigál; az itt tárgyalt metódusok egy már rögzített Image objektumra alkalmazandók, utólag, azokra az esetekre, amikor a képkockának nagyobb korrekcióra van szüksége, mint amennyit az ISP biztosított.
5.19.1. Hisztogram-kiegyenlítés¶
A legegyszerűbb kontrasztnyújtó művelet a hisztogram-kiegyenlítés. Az ötlet az, hogy a képpontértékeket úgy képezzük le, hogy a kimenet hisztogramja a lehető leglaposabb legyen – minden érték nagyjából egyformán gyakran forduljon elő. A vizuális hatás az, hogy egy alacsony kontrasztú kép (amelynek hisztogramja egy keskeny sávban összpontosul) magas kontrasztúvá válik, amelynek képpontjai a teljes 0 – 255 tartományt lefedik.
A histeq() végzi a kiegyenlítést:
img.histeq()
A működési mechanizmus közvetlen. Kiszámítjuk a forrás hisztogramjának kumulatív eloszlásfüggvényét (CDF); minden bemeneti képpontérték a CDF-ben elfoglalt helyére képződik le, a kimeneti tartományra skálázva. Ahol a képpontok már egyenletesen oszlottak el, a leképezés közel áll az identitáshoz; ahol a képpontok egyetlen fényerőnél torlódtak fel, a leképezés szétteríti őket azáltal, hogy az adott fényerőt a kimeneti értékek szélesebb tartományára nyújtja.
Az eredmény drámai az alacsony kontrasztú jelenetek esetén – a különbség egy halvány beltéri fénykép és ugyanaz a fénykép histeq után gyakran az „olvashatatlan” és a „tökéletesen olvasható” közötti különbség. A kompromisszum az, hogy a művelet mindent felerősít, beleértve az érzékelő zaját is. Egy olyan jeleneten, ahol valódi, alacsony kontrasztú részletek visszanyerhetők, a histeq a helyes válasz; egy tiszta, jól exponált jeleneten, amelynek egyszerűen nincs rá szüksége, a histeq látható zajt visz be.
5.19.2. CLAHE: adaptív kiegyenlítés¶
A hisztogram-kiegyenlítés globális: a teljes képből számított egyetlen CDF-et használja, és azt mindenhol alkalmazza. Ez működik olyan képeken, amelyek fényerőtartománya nagyjából egyenletes, de elbukik az olyan jeleneteken, amelyeken lokalizált sötét és világos területek vannak – a CDF afelé az oldal felé húzódik, amelyiken több képpont van, és az ellentétes oldal túlkorrigálttá válik.
Az adaptív változat a kontrasztkorlátozott adaptív hisztogram-kiegyenlítés, amelyet általában CLAHE néven emlegetnek. Egyetlen globális CDF helyett a CLAHE külön CDF-et számít a kép minden egyes kis csempéjéhez, minden csempét a saját CDF-jéhez igazítva egyenlít ki, majd egybeolvasztja a csempék határait. Az eredmény az, hogy a fényerő-beállítások lokálisan történnek – az árnyékos sarok megkapja a saját kiegyenlítését anélkül, hogy a világos sarok rossz irányba húzná.
Az adaptive=True jelző CLAHE módba kapcsolja a histeq() metódust:
img.histeq(adaptive=True, clip_limit=10)
A clip_limit paraméter a CLAHE azon része, amelyre a nevében szereplő „kontrasztkorlátozott” utal. A lokális kiegyenlítés túlságosan felerősítheti a zajt azokon a lapos területeken, ahol a CDF-nek nagyon kevés különböző értéke van; a vágási határ megszabja, milyen agresszíven osztható újra egyetlen bin, ami megakadályozza a zaj felerősödését, miközben még mindig lehetővé teszi a kontrasztnyújtást ott, ahol az számít. A 10 körüli érték ésszerű kiindulópont; a nagyobb értékek többet engednek dolgozni a CLAHE-nek a több látható zaj árán, a kisebb értékek pedig finomabbá teszik.
A CLAHE drágább, mint a globális histeq, de tisztább eredményt ad olyan jeleneteken, ahol a fényerő egyenetlenül oszlik el – ami a legtöbb valós jelenetre igaz.
5.19.3. Gamma, kontraszt és fényerő¶
A hisztogram-kiegyenlítés az adatvezérelt módja a fényerő újraleképezésének. Az adatfüggetlen mód egy választott görbe alkalmazása, amelyet néhány könnyen hangolható szabályozó paraméterez. A gamma() hármat biztosít:
img.gamma(gamma=1.0, contrast=1.0, brightness=0.0)
Minden paraméter egy adott transzformációt alkalmaz minden képpontra:
A gamma minden képpont értékét átfuttatja a output = input ** (1 / gamma) hatványfüggvényen. A szokásos jelentés: az 1.0-nál nagyobb értékek kivilágosítják a képet és felemelik a középtónusokat (a klasszikus „monitor gamma” korrekció); az 1.0-nál kisebb értékek elsötétítik. A paraméter nemlineáris – megőrzi a fekete- és fehérpontokat, és csak a köztük lévő eloszlást alakítja át, ami a helyes viselkedés, amikor a cél a részletek visszanyerése árnyékos vagy csúcsfényes területeken anélkül, hogy a meglévő szélsőértékeket összenyomnánk.
A contrast minden képpontot egy egyszerű szorzáson futtat át a középszürke pont körül. Az 1.0-nál nagyobb értékek növelik a kontrasztot (a sötét sötétebb lesz, a világos világosabb, a középszürke változatlan marad); az 1.0-nál kisebb értékek csökkentik a kontrasztot.
A brightness minden képpontértékhez hozzáad egy állandót. A pozitív értékek kivilágosítanak, a negatív értékek elsötétítenek. Az eltolás egyenletes – semmi sem marad meg –, ami önmagában ritkán az, amit egy alkalmazás szeretne, de jól párosul egy kontraszt-lépéssel az eredmény újraközpontosítására.
A három paraméter összekapcsolódik: egyetlen gamma() hívás egy menetben alkalmazhat egy gamma-görbét, majd egy kontraszt-szorzást, majd egy fényerő-eltolást. A sorrend először a gamma, majd a kontraszt, majd a fényerő, ami megfelel annak a sorrendnek, amely a legintuitívabb eredményt adja, amikor mindhárom nem alapértelmezett.
5.19.4. Automatikus fehéregyensúly¶
A tonális korrekciók szín-családja az automatikus fehéregyensúllyal kezdődik. Ugyanaz a mechanizmus, amelyet az érzékelő ISP-je a képalkotási folyamat részeként futtat – a piros, zöld és kék csatornák relatív erősítésének beállítása úgy, hogy egy átlagos szürke folt tényleges szürkeként olvasódjon be –, rögzítés utáni műveletként is elérhető egy kész Image objektumon:
img.awb()
Az alapértelmezett a gray-world (szürke világ) algoritmust használja: feltételezzük, hogy a teljes kép átlagos színe semleges szürke, és a csatornánkénti erősítéseket úgy állítjuk be, hogy ez teljesüljön. Az alternatív max=True forma a white-patch (fehér folt) algoritmust használja: feltételezzük, hogy a legvilágosabb képpontok semleges fehérek, és az erősítéseket úgy állítjuk be, hogy ez teljesüljön. Mindkettő működik RGB565-ön és nyers Bayeren; egyik sem működik szürkeárnyalatoson (ahol nincs szín, amit kiegyensúlyozni lehetne) vagy YUV-on (ahol a színábrázolás nem olyan, amelyen ezek az algoritmusok dolgoznak).
Mikor érdemes a rögzítés utáni formát választani az ISP automatikus fehéregyensúlya helyett: amikor az ISP választása rosszul illeszkedett az adott jelenethez, amikor az alkalmazás olyan referencia-képkockákat tölt be lemezről, amelyeket eltérő körülmények között rögzítettek, vagy amikor a szín megítélése elég fontos ahhoz, hogy az alkalmazás újra le akarja futtatni a saját algoritmusválasztásával.
5.19.5. A színkorrekciós mátrix¶
Amikor a képnek nem a fehéregyensúly által nyújtott csatornánkénti skálázásra van szüksége, hanem egy általánosabb csatorna-keverésre, akkor a színkorrekciós mátrix a megfelelő művelet. A ccm() metódus egy 3x3-as (vagy eltolással 3x4-es) mátrixot alkalmaz, amely minden képpont (r, g, b) vektorát megszorozza, hogy egy új (r, g, b) vektort állítson elő:
img.ccm([[1.1, -0.05, -0.05],
[-0.05, 1.1, -0.05],
[-0.05, -0.05, 1.1]])
A mátrix lehetővé teszi, hogy az alkalmazás korrigálja a színcsatornák közötti áthallást – ahol például a piros érzékelő válasza tartalmaz némi zöld fényt, ott a mátrix levonhatja a zöld csatorna egy hányadát a piros kimenetből a kompenzáció érdekében. Egy csatornánkénti eltolással kombinálva a 3x4-es forma azt is lehetővé teszi, hogy az alkalmazás minden csatornát újranullázzon.
Az ISP-folyamat anyaga lefedi a színkorrekciós mátrixok miértjét. Az Image objektumon végzett rögzítés utáni forma csak ugyanaz a művelet, utólag alkalmazva.