25 nov. 2010

Corectia gama

Corecţia gama se foloseşte în grafică şi este o chestie care poate fi definită în mai multe feluri. În mod formal, este aplicarea unei funcţii de putere pe luminozitate. În mod intuitiv, este metoda de a creşte sau a scădea luminozitatea aparentă (relativă) a unei imagini.

Ce face corecţia gama?

Hai să ne uităm un pic la forma matematică a poveştii, ca să înţelegem ce se întâmplă de fapt – vom vedea apoi şi de ce trebuie să ne complicăm cu chestia asta în practică. Prin corecţie gama se înţelege aplicarea unei funcţii de forma următoare pe componenta de luminozitate a unei culori (şi prin extensie asupra tuturor culorilor dintr-o imagine):

f(x) = x^\gamma \!

unde x este luminozitatea normalizată (adică variază între 0 şi 1), iar γ este... gama, adică tocmai parametrul pe care îl alegem noi atunci când operăm o corecţie.

Vă daţi seama că, de vreme ce x variază între 0 şi 1, asta înseamnă că rezultatul funcţiei va varia tot între 0 şi 1 indiferent ce valoare alegem pentru γ. Asta înseamnă că orice corecţie gama am aplica, negrul rămâne negru iar albul rămâne alb. De-asta am spus mai sus că din punct de vedere intuitiv corecţia gama influenţează luminozitatea relativă a unei imagini – orice am face, albul nu se întunecă iar negrul nu devine mai spălăcit.

În plus, pentru γ=1 funcţia nu produce nicio schimbare:

f(x) = x^1 = x \!

Deci chestiile interesante au loc numai pentru plaja medie de luminozităţi şi numai atunci când valoarea lui γ este fie supraunitară, fie subunitară. Iar fiindcă x variază între 0 şi 1, cu cât γ e mai mare, cu atât valorile intermediare ale funcţiei vor fi mai mici (şi, evident, viceversa). Cu alte cuvinte, aplicarea unei corecţii gama supraunitare întunecă o imagine, în timp ce o corecţie subunitară o luminează.

De ce avem nevoie de corecţie gama?

Culmea e că avem nevoie de corecţie gama din mai multe motive separate. De fapt, în cea mai mare parte a timpului diversele corecţii se anulează reciproc de la sine. Hai să vedem.

Unde avem nevoie de corecţii gama?

Dacă aţi urmărit firul epic al poveştii noastre de până acum aveţi toate motivele să fiţi nedumeriţi în privinţa utilităţii conceptului de corecţie gama: de când a început articolul, singura surpriză apărută sub diverse forme a fost că toate neliniarităţile se anulează reciproc. Adică v-am aburit degeaba. Ei, nu chiar. Până acum am vorbit exclusiv despre sisteme de redare a imaginilor – dar cum rămâne cu sistemele de capturare?Toate sistemele curente de captură a imaginilor – camere foto, camere video, scannere –, toate se bazează pe componente electronice care în ultimă instanţă transformă fotoni în electroni (folosesc o simplificare grosolană, dar ne serveşte scopul). Cu alte cuvinte, cu cât o componentă primeşte mai mulţi fotoni, cu atât produce un semnal de ieşire mai puternic. Prin urmare semnalul de ieşire variază liniar cu intensitatea luminoasă absolută de intrare.Păi dacă semnalul variază liniar iar noi stocăm în mod normal luminozitatea gata codificată pentru percepţie înseamnă că imaginile capturate arată ca naiba! Da, chiar aşa este – dacă am codifica liniar informaţia captată de senzori imaginea chiar ar părea prea întunecată dacă am afişa-o ca atare. Aşa că imaginilor capturate li se aplică în mod deliberat o corecţie gama care să transforme informaţia liniară de luminozitate în informaţie neliniară, conform percepţiei umane.Pe de altă parte aţi fi îndreptăţiţi să vă întrebaţi de ce nu stocăm informaţia de luminozitate liniar – sigur, ar trebui neliniarizată la ieşire, dar măcar am stoca informaţie corectă, conformă cu realitatea. E o întrebare legitimă, hai să-o explorăm un pic. Să presupunem că aţi avea o foaie de hârtie cu pătrăţele, ca cea din caietele de matematică. Dacă vi s-ar cere să figuraţi multiplii şi submultiplii metrului, de exemplu, aţi avea două variante (mă rog, aţi avea multe variante, dar noi vom explora doar două). Prima variantă ar fi să marcaţi pur şi simplu lungimea multiplilor şi a submultiplilor pe grafic – rezultatul ar fi o reprezentare 1:1 a tuturor lungimilor. Toate bune şi frumoase, însă v-ar trebui o coală de un kilometru lungime ca să indicaţi doar primii trei multipli (ceilalţi doi sunt decametrul şi hectometrul, sigur aţi uitat măcar numele unuia dintre ei). Şi în plus de la milimetru în jos nu prea mai aveţi cum să desenaţi. Alternativa ar fi să aplicaţi o corecţie gama înainte de a începe desenul. Dacă de exemplu aţi alege ca scara de la 0 la 1 să corespundă kilometrilor, iar pe desen aţi folosi scara 1:10 cm atunci aţi reuşi să figuraţi o mulţime de multipli şi submultipli pe o singură coală normală de hârtie! (În practică se foloseşte mai frecvent scara logaritmică în acest scop, vezi al treilea grafic.)Observaţi că în primul caz am fi nevoiţi să folosim o cantitate uriaşă de stocare a informaţiei (o coală uriaşă de hârtie) pentru a transmite aceeaşi cantitate de informaţie utilă ca şi în al doilea caz! Exact acelaşi lucru s-ar întâmpla şi dacă am stoca informaţia de culoare liniar: o parte semnificativă din informaţia stocată ar fi complet inutilă, fiindcă ar fi nerelevantă pentru sistemul nostru vizual. Iar diferenţa este considerabilă: o trecere graduală, insesizabilă, de la negru la alb ar necesita aproape 10.000 de nuanţe distincte dacă ne-am ambiţiona să le stocăm liniar, în timp ce o codificare neliniară convenabilă ar necesita sub 500 de nuanţe distincte! Presupun că vă întrebaţi cum de a produs adaptarea speciei noastre un sistem atât de curios de percepţie a luminozităţii (şi în general de răspuns la stimuli, după cum am văzut mai sus). Motivul ţine probabil şi de cantitatea de informaţie care circulă prin sistem, dar mai ales de capacitatea de a organiza un cocktail eterogen de simţuri pe o plajă cât mai largă. De exemplu sistemul nostru vizual este perfect capabil să distingă simultan detalii atât din interiorul unei camere întunecoase şi din imaginea străzii scăldate în soarele amiezii (gândiţi-vă că vă uitaţi către o fereastră deschisă fără ca aceasta să vă acopere întreg câmpul vizual). Prin contrast sunt de notorietate problemele de expunere ale camerelor de fotografiat în condiţii mult mai puţin extreme – evident, diferenţa este cauzată de captura liniară a luminii în cazul camerei de fotografiat (vă daţi seama că întreaga industrie fotografică şi cinematografică ar sări în sus de bucurie dacă ar inventa cineva un senzor cu acelaşi gen de „defect” ca monitoarele cu tub catodic şi procesul tipografic).Ok, am văzut că este necesară codificarea gama atunci când capturăm liniar imagini, în aşa fel încât monitorul să facă decodificarea gama la redare. Însă uneori este necesară chiar o corecţie gama autentică: de exemplu dacă procesăm o imagine pe un monitor cu nişte caracteristici date iar apoi imaginea este afişată pe un cu totul alt monitor atunci trebuie să aplicăm o corecţie gama de aşa natură încât imaginea finală să fie bine afişată pe monitorul destinaţie. Dacă aţi citit la rând articolele din seria despre culoare ar trebui să obiectaţi: ştim deja că monitoarele au profile de culoare ICC asociate iar imaginea are un spaţiu de culoare asociat, deci nu ar trebui să ne intereseze diferenţele între specificaţiile diverselor monitoare. În general aşa este, dar cineva tot face corecţia gama – că e un program care rulează la nivelul sistemului de operare e neimportant; important este că se întâmplă.Un corolar interesant şi oarecum neaşteptat al primei părţi a acestei secţiuni este faptul că şi imaginile generate de calculator au nevoie de corecţie gama, exact ca şi în cazul capturii. Dacă vă gândiţi un pic la un sistem de modelare 3D vă veţi da seama că la render acesta simulează condiţiile de luminozitate reale – ar fi absurd ca tot sistemul să aplice intern corecţii şi corecţii ale corecţiilor atunci când procesează felul în care se combină, se reflectă şi se refractă razele de lumină prin model. Prin urmare toate calculele interne se fac liniar, iar corecţia (codificarea) gama se face abia la sfârşit, pe imaginea finală – exact ca şi în cazul unei camere foto. Evident, un sistem de modelare 3D este în ultimă instanţă acelaşi lucru ca un joc 3D, aşa că şi aici are loc acelaşi proces. Vă daţi sema, după ce a procesat unghiuri, texturi şi gradul de iluminare a mii de triunghiuri, calculatorul dumneavoastră trebuie să aplice o funcţie neliniară complicată pe fiecare element din fiecare triplet din fiecare punct al ecranului – şi asta de zeci de ori pe secundă! Poate nu vă reprezentaţi foarte bine magnitudinea acestei sarcini aşa că am să vă ofer o cifră concretă: numai codificarea gama presupune 117.964.800 de ridicări la putere a unor valori subunitare pe secundă pentru o rezoluţie de 1280 x 1024 puncte la 30 de cadre pe secundă. Şi reţineţi, acesta este doar ultimul pas de procesare, după ce s-a încheiat absolut tot procesul de generare a imaginii. Destul de impresionant, dacă mă întrebaţi pe mine.

SURSA: Corectia gama

Niciun comentariu:

Trimiteți un comentariu