Spazi a colori, gamma e miglioramento dell'immagine
-
29-10-2019 - |
Domanda
Spazio colore. Bene, tutti conoscono RGB: tre valori normalizzati nell'intervallo [0,0,1,0], che hanno il significato dell'intensità dei componenti del colore blu verde rossi; Questa intensità è intesa come lineare, no?
Gamma. Per quanto posso capire, Gamma è una funzione che mappa i componenti del colore RGB su un altro valore. Google su questo, ho visto funzioni lineari e funzioni non lineari ... le funzioni lineari sembrano ridimensionare i componenti RGB, quindi sembra mettere a punto la luminosità dell'immagine; Le funzioni non lineari sembrano "decomprimere" componenti più scuri/più chiari.
Ora sto iniziando ad implementare un visualizzatore di immagini, che deve visualizzare diversi formati di immagine come trama. Vorrei modificare il gamma di queste immagini, quindi dovrei costruire uno shader di frammenti e correre sopra il quad testuonato. Bene, ma come posso determinare la correzione gamma giusta?
OpenGL funziona utilizzando lo spazio a colori RGB lineare, usando componenti a punta mobile. In effetti, potrei calcolare i valori corretti da gamma a partire da quei valori (con speciale precisione a virgola mobile), quindi vengono visualizzati dopo aver bloccato il valore corretto dalla gamma.
Innanzitutto, determinerò la rampa gamma. Come potrei determinarlo? (analgualmente o usando le tabelle di ricerca)
Quindi, sono venuto per indagare sull'estensione OpenGL Ext_FrameBuffer_Srgb, che sembra molto correlata all'estensione Ext_texture_srgb.
Ext_texture_srgb Introdurre un nuovo formato di trama che viene utilizzato per linearizzare i valori di Textel nello spazio lineare RGB. (Nota a piè di pagina 1) In questo modo, sono a conoscenza dello spazio dei colori SRGB e lo uso come spazio di colore lineare RGB.
Invece, Ext_FrameBuffer_SRGB Extension mi consente di codificare i valori RGB lineari sul frameBuffer SRGB, senza preoccuparci.
...
Aspetta, tutte queste informazioni per cosa? Se riesco a usare SRGB FrameBuffer e caricare trame SRGB, elaborare che le trame senza conversioni SRGB ... perché dovrei correggere la gamma?
Forse posso correggere la gamma uguali, anche su un buffer SRGB? O è meglio no? E luminosità e contrasto: devono essere applicati prima o dopo la correzione gamma?
Sono molte informazioni, ora mi confongo. Spero che qualcuno di voi possa spiegarmi di più tutti questi concetti! Grazie.
...
C'è un'altra domanda. Nel caso in cui il dispositivo gamma è diverso dallo "standard" 2.2, come si "accumula" correzioni gamma diverse? Non so se sia chiaro: nel caso Impiet Implement i valori RGB sono già corretti per un monitor con un valore gamma di 2.2, ma il monitor ha una gamma di valore 2.8, come correggere la gamma?
(1) Ecco un po 'di estratto per evidenziare ciò che intendo:
Lo spazio colore SRGB si basa sulle caratteristiche tipiche del monitor (non lineare) previste in un ufficio scarsamente illuminato. È stato standardizzato dalla International Electrotechnical Commission (IEC) come IEC 61966-2-1. Lo spazio colore SRGB corrisponde approssimativamente alla correzione gamma 2.2.
Questa estensione fornisce qualsiasi tipo di formati di framebuffer SRGB o immagini garantite con trame SRGB "avranno un bell'aspetto" quando si output a un dispositivo che supporta uno spazio di colore SRGB?
RESOLVED: No. Whether the displayed framebuffer is displayed to a monitor that faithfully reproduces the sRGB color space is beyond the scope of this extension. This involves the gamma correction and color calibration of the physical display device. With this extension, artists can author content in an sRGB color space and provide that sRGB content for use as texture imagery that can be properly converted to linear RGB and filtered as part of texturing in a way that preserves the sRGB distribution of precision, but that does NOT mean sRGB pixels are output to the framebuffer. Indeed, this extension provides texture formats that convert sRGB to linear RGB as part of filtering. With programmable shading, an application could perform a linear RGB to sRGB conversion just prior to emitting color values from the shader. Even so, OpenGL blending (other than simple modulation) will perform linear math operations on values stored in a non-linear space which is technically incorrect for sRGB-encoded colors. One way to think about these sRGB texture formats is that they simply provide color components with a distribution of values distributed to favor precision towards 0 rather than evenly distributing the precision with conventional non-sRGB formats such as GL_RGB8.
Nessuna soluzione corretta