QNA > C > Come Calcolare La Lunghezza D'onda (Spettro) In Rgb (Colore)

Come calcolare la lunghezza d'onda (spettro) in RGB (colore)

Prima di tutto, notate che ci sono molti sistemi di colore RGB. Per determinare il colore emesso da un display RGB, è necessario conoscere il colore (cromaticità) di ciascuno dei 3 colori primari. Bisogna anche sapere a quale punto di bianco è calibrato il monitor - il colore del bianco che si ottiene quando i 3 colori sono tutti accesi. E, infine, è necessario conoscere la funzione di trasferimento elettro-ottico (EOTF) del monitor, la funzione che mappa i valori dei pixel in ingresso (tensioni o numeri) nella luminosità dei 3 primari. L'EOTF è di solito non lineare, ma diverse funzioni sono usate in diversi standard.

Se avete un colore specificato come una tripla di intensità in uno standard di codifica dei colori RGB (ad esempio sRGB), potete calcolare cosa dovrebbe produrre il vostro monitor quando alimentato con quell'input (assumendo che sia calibrato). Ma se avete un display diverso che è diverso da sRGB in qualsiasi modo (uno qualsiasi dei primari o il punto bianco sono di un colore diverso, diverso EOTF), allora questo secondo monitor lavora in uno spazio RGB diverso, e per ottenere lo stesso colore visualizzato avete bisogno di una tripla di ingresso RGB diversa.

Quindi scegliete un sistema di colore RGB specifico. Per quel sistema di colori conoscete i tre cromatismi primari, che di solito sono specificati nello spazio CIE (x, y). Non conoscete ancora i singoli guadagni RGB, ma potete calcolarli. Sapete che, quando tutti i guadagni sono impostati al massimo, l'uscita dovrebbe essere il punto bianco calibrato. Quindi, convertite i singoli primari da (x, y) alla forma (x, y, z) (z = 1 - x - y), poi disponeteli in 3 colonne per formare una matrice 3 x 3. Se si moltiplica questa matrice 3 x 3 a destra per il vettore colonna (Gr Gg Gb)', il risultato è il colore CIE (X, Y, Z) (nota: XYZ maiuscolo) del bianco che viene prodotto. Ma voi conoscete la cromaticità del bianco e la sua luminanza (di solito in forma (x, y, Y) che è facilmente convertibile in (X, Y, Z). Così ora avete un sistema di equazioni che può essere risolto per calcolare Gr, Gg e Gb. Il risultato ti dice che il primario rosso del monitor (Xr, Yr, Zr) è in realtà il rosso (x, y, z) moltiplicato per Gr il guadagno rosso, e lo stesso per il verde e il blu. Moltiplicate le 3 colonne della matrice per i guadagni individuali, e ora avete la matrice 3x3 che converte (R, G, B) scalati all'intervallo [0..1] nel vero colore CIE (X, Y, Z).

Invertendo la matrice, avete la conversione da qualsiasi colore (X, Y, Z) che volete in (R, G, B) in questo particolare sistema di colore RGB. Notate che se uno qualsiasi di R, G, o B è minore di 0 o maggiore di 1, questo monitor non può riprodurre quel colore.

Questa era la parte difficile del lavoro. Poi, dovete capire quale colore (X, Y, Z) volete effettivamente. Per fare questo, è necessario ottenere una copia delle funzioni di corrispondenza dei colori CIE 1931 x-bar, y-bar e z-bar. Se state cercando di replicare l'aspetto di un intero spettro di luce (molte lunghezze d'onda), dovete integrare il prodotto dello spettro con ciascuna di queste funzioni separatamente. Se state lavorando con uno spettro discreto (es. ampiezza misurata ogni 5 nm o ogni 1 nm), questo si trasforma in una somma di prodotti. Per ogni lunghezza d'onda, moltiplicate l'ampiezza della luce nella banda dello spettro per il valore della funzione corrispondente al centro di quella banda e poi sommate i risultati per tutte le lunghezze d'onda. Il risultato è il colore (X, Y, Z) che qualcuno (con una normale visione a colori) vedrà guardando quello spettro.

Se il vostro input è uno spettro a lunghezza d'onda singola, come la luce laser, allora tutto quello che dovete fare è cercare il valore di x-bar, y-bar e z-bar per quell'unica lunghezza d'onda, poiché l'ampiezza di tutte le altre lunghezze d'onda è zero, quindi non è necessaria alcuna somma.

Una volta che avete la XYZ del colore che volete, moltiplicatela per la matrice XYZ-to-RGB per il vostro particolare display RGB, e vi dirà i valori RGB necessari per riprodurre quel colore.

La buona notizia: se il vostro input è effettivamente lo spettro di qualche oggetto ordinario che riflette la luce bianca, probabilmente troverete che il vostro monitor può riprodurlo.

La cattiva notizia: se il vostro input è una fonte di luce a frequenza singola, inevitabilmente uno dei pesi RGB che calcolate sarà negativo. Questo significa che il colore che state cercando di riprodurre è al di fuori della gamma di colori del display, e dovrete ridurre la saturazione del colore desiderato (sperando di mantenere la stessa tonalità percepita) fino ad ottenere un colore che rientri nella gamma del display.

Ora, ho sorvolato su alcune cose fondamentali sopra. Non ho descritto cosa sono le funzioni di corrispondenza dei colori, o la differenza tra i formati di colore CIE (x, y, z), (X, Y, Z) e (x, y, Y). Queste cose vi saranno già familiari se avete letto qualche introduzione alla scienza del colore, ma se non lo avete fatto dovrete trovare un libro di testo e impararle.

Questo non richiede niente di più della matematica del liceo. Preferisco fare tutti i calcoli in forma vettoriale e matriciale, usando Excel o Matlab, perché sono entrambi ragionevoli nel trattare la moltiplicazione matrice-vettore e l'inversione della matrice. Ma si può fare la stessa matematica come una serie di equazioni scalari su un blocco di carta. La forma a matrice è solo più compatta.

Di Fillander

Il LED RGB può fare il giallo? :: Qual è la complessità temporale dell'algoritmo GCD di Euclide?
Link utili