Se riesci a elaborare i file RAW, avrai un array di pixel bayer composto da righe RGRGRG e GBGBGB (o eventualmente righe RGBGRGBG.) Potresti ignorare tutti i pixel R e B, riassumere i pixel G, prendere la radice quadrata ( poiché il numero di pixel verdi è doppio rispetto a quello rosso o blu) e si divide per metà del numero di pixel G. Questo dovrebbe darti la media ponderata corretta per "verde" nella tua foto. È quindi possibile prendere la media di rosso e blu e calcolare la percentuale verde da tutte e tre le medie.
Per essere più precisi, potresti voler considerare la corretta ponderazione per i pixel del sensore rosso, verde e blu, poiché i sensori CMOS hanno sensibilità diverse per ciascuna lunghezza d'onda della luce. I pesi dipenderebbero dal sensore, in generale. Questo sarebbe l'approccio semplice.
Per tenere conto della dominante di colore dovuta all'ora del giorno, a vari tipi di illuminazione artificiale, ecc., Potrebbe essere più appropriato preelaborare ogni foto in uno strumento come Lightroom per correggere prima il bilanciamento del bianco, quindi eseguire il calcolo su immagini pixel RGB standard. A differenza dell'elaborazione dei dati del sensore RAW, si dovrebbe ponderare il calcolo in base alla "purezza verde" dei pixel, anziché alla media della componente verde in generale. Più un pixel verde è puro, maggiore è il suo peso rispetto ai pixel che sono più rossi o blu. La normalizzazione del bilanciamento del bianco prima dell'elaborazione dovrebbe eliminare qualsiasi necessità di complicare un calcolo altrimenti abbastanza semplice con tangenti progettate per tenere conto di innumerevoli fattori come la copertura nuvolosa, l'ora del giorno, la stagione, ecc.
Potresti comunque voler tenere conto di ampie aree di pixel non incidenti, come il cielo. Non posso davvero aiutarti molto in quell'area senza sapere di più esattamente cosa stai cercando di ottenere. Il verde di una "fotografia" in generale sarebbe probabilmente meglio se si calcolasse il rapporto tra verde, rosso e blu, che includerebbe i pixel "cielo".
Per quanto riguarda la tua procedura, è ovvio che se scatti le foto con le stesse impostazioni della fotocamera, sotto lo stesso illuminante (stessa intensità e temperatura del colore), misurato su una linea di base comune come una carta grigia al 18%, ovviamente andrà una lunga strada verso la normalizzazione dei risultati. Con il digitale è possibile correggere eventuali discrepanze con il software di elaborazione RAW e uno strumento di selezione del bilanciamento del bianco di base, quindi assicurarsi di scattare in RAW.
Per fornire ulteriori informazioni sul calcolo del "verde" delle tue foto. Esistono ovviamente modi semplici, come il calcolo del peso dei pixel bayer verdi rispetto al blu e al rosso o il calcolo della purezza del verde in relazione alla purezza rosso / blu dei pixel RGB. Potresti avere più fortuna se ti converti in uno spazio colore più appropriato, come HSV ( Tonalità / Saturazione / Valore , a volte chiamato HSB, sostituendo Valore con Luminosità) e calcola la tua quantità di verde usando una curva nello spazio HUE. (NOTA: HSL è un diverso tipo di spazio colore e probabilmente non sarebbe l'ideale per calcolare quanto "verde" è presente in una foto, quindi utilizzerei HSV. Puoi trovare ulteriori informazioni su questi spazi colore qui.) Il verde puro (indipendentemente dalla saturazione o dal valore) cade con un angolo di tonalità di 120 ° e cade da lì mentre ci si sposta verso il rosso (a 0 °) o verso il blu (a 240 °). Tra 240 ° e 360 °, ci sarebbe una quantità zero di verde in un pixel, indipendentemente dalla saturazione o dal valore.
Fig 1. Grafico della tonalità - Purezza verde in gradi di tonalità
È possibile regolare la curva di ponderazione effettiva per soddisfare le esigenze specifiche, tuttavia una curva semplice potrebbe essere simile alla seguente:
range = 240
period = range * 2 = 240 * 2 = 480
scale = 360/period = 0.75
pureGreen = sin(scale * 120)
Il valore per pureGreen
dovrebbe essere 1.0 . Una formula per il calcolo greenness
potrebbe quindi essere eseguita come segue:
sin(scale * hue) } 0 > hue > 240
greenness =
0 } 240 <= hue <= 360 || hue == 0
Il hue
è il grado di colore dal valore di colore HSV. La radius
è la metà di period
cui verde è presente in una certa misura. I scale
regola la curva peccato nostro periodo, in modo tale che sin(scale * hue)
picchi (rendimenti 1.0) esattamente dove si avrebbe verde puro (ignorando che l'intensità verdi). Poiché la quantità di greenness
è valida solo nella prima metà del nostro periodo, il calcolo del verde è valido solo quando la tonalità è maggiore di 0 ° e inferiore a 240 ° e il suo zero per qualsiasi altra tonalità.
È possibile regolare la ponderazione regolando il periodo, l'intervallo all'interno del quale è green
possibile definire potrebbe essere presente (ovvero anziché da 0 a 240, è possibile impostare un vincolo come 40 > hue > 200
invece) e definire qualsiasi cosa al di fuori di tale intervallo per avere un verde di 0 Va notato che questo sarà matematicamente accurato, tuttavia potrebbe non essere del tutto percettivamente accurato. Puoi ovviamente modificare la formula per regolare il punto di pure green
più verso il giallo (che potrebbe produrre risultati più percettivamente accurati), aumentare l'ampiezza della curva sull'altopiano ed espandere la banda di verde puro su una gamma di tonalità, piuttosto che una singola valore della tonalità, ecc. Per la precisione percettiva umana totale, un algoritmo più complesso elaborato in CIE XYZ e CIE L a b *potrebbe essere richiesto spazio. (NOTA: la complessità di lavorare nello spazio XYZ e Lab aumenta drammaticamente oltre ciò che ho descritto qui.)
Per calcolare il verde di una foto, è possibile calcolare il verde di ciascun pixel, quindi produrre una media. Potresti quindi prendere l'algoritmo da lì e modificarlo per le tue esigenze specifiche.
Puoi trovare algoritmi per le conversioni di colore su EasyRGB , come quello per RGB in HSV:
var_R = ( R / 255 ) // Red percentage
var_G = ( G / 255 ) // Green percentage
var_B = ( B / 255 ) // Blue percentage
var_Min = min( var_R, var_G, var_B ) //Min. value of RGB
var_Max = max( var_R, var_G, var_B ) //Max. value of RGB
del_Max = var_Max - var_Min //Delta RGB value
V = var_Max //Value (or Brightness)
if ( del_Max == 0 ) //This is a gray, no chroma...
{
H = 0 //Hue (0 - 1.0 means 0° - 360°)
S = 0 //Saturation
}
else //Chromatic data...
{
S = del_Max / var_Max
del_R = ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max
del_G = ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max
del_B = ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max
if ( var_R == var_Max ) H = del_B - del_G
else if ( var_G == var_Max ) H = ( 1 / 3 ) + del_R - del_B
else if ( var_B == var_Max ) H = ( 2 / 3 ) + del_G - del_R
if ( H < 0 ) H += 1
if ( H > 1 ) H -= 1
}