Come potrei utilizzare la mia reflex per misurare il "verde" di una foto?


13

sfondo

Le mie immagini digitali possono essere lette in un programma per computer come Matlab o R come matrice amxnx 3 in cui mxn è il numero di pixel osservati da ciascuno dei tre sensori (rosso, verde e blu) e ogni cella nella matrice ha un numero da 1-255 che riflette la luminosità osservata dal sensore.

Vorrei usare queste informazioni per ottenere una misura obiettiva di verde in una fotografia, perché voglio tentare di correlare il verde alla crescita delle piante (immagina un'immagine al giorno di un campo di grano).

I lavori precedenti in questa direzione hanno avuto un certo successo calcolando un indice di verde come

  • verde% = verde / (blu + rosso) o
  • divergenza verde = 2 * verde - rosso - blu

dalle immagini della webcam per ciascuno dei pixel MXN, ma non vi era alcun controllo sull'apertura o sulla radiazione incidente (angolo solare).

nota che non sto cercando una misura 'assoluta' di greenness, la scala e la distribuzione del numero non ha importanza - deve solo fornire una misura relativa coerente di greenness.

Domanda

Posso utilizzare la mia reflex per ottenere una solida misura di verde invariante con una o tutte le seguenti condizioni:

  • coperto dalle nuvole?
  • ora del giorno?
  • giorno dell'anno? (questo è l'unico requisito)
  • proporzione di cielo / terra sullo sfondo?

Stato attuale

Ho escogitato le seguenti idee, ma non sono sicuro di quale sarebbe necessario o quali non avrebbero alcun effetto sul rapporto verde / (rosso + blu)

  1. scatta una foto di un pezzo di plastica bianca e usa questa immagine per normalizzare gli altri valori
  2. Apertura fissa
  3. Correggi la velocità dell'otturatore
  4. imposta il bilanciamento del bianco usando un pezzo di carta bianca
  5. Scatta tutte le foto dalla stessa angolazione
  6. Scatta tutte le foto a mezzogiorno solare

1
Potresti considerare l'illuminazione artificiale, renderebbe la procedura più semplice. Un flash dovrebbe funzionare adeguatamente, assicurati che sia nella stessa posizione e potenza.
PearsonArtPhoto

@Pearsonarphoto - idea interessante, stavo pensando di scattare le foto durante il giorno, ma forse ha più senso farle di notte senza luna.
David LeBauer,

1
Se stai seguendo i consigli di Pearsonartphoto, ti consigliamo di impostare manualmente l'otturatore, l'apertura e l'ISO - imposta l'otturatore sulla velocità di sincronizzazione del flash (generalmente da 1/200 a 1/320) e imposta l'apertura e l'ISO su un valore basso come possono andare senza esaurire la potenza del flash. Ciò renderà il tuo ambiente il più buio possibile - una luna piena non dovrebbe essere un problema (sole di mezzogiorno, d'altra parte ...) Per questa situazione, il flash sull'asse sarebbe il migliore, poiché proietterà il minor numero di ombre .
Evan Krall

2
@Evan Non sono d'accordo sul flash sull'asse. Il motivo è questo: photo.stackexchange.com/questions/9531/… - Modi di riflessione troppo diretta. Tranne quando si utilizzano i polarizzatori, come ho descritto qui, ma è necessario assicurarsi che gli ingranaggi rimangano gli stessi e che il bilanciamento del bianco sia eseguito correttamente. I polarizzatori cambiano il bilanciamento del bianco.
Simon A. Eugster,

2
La clorofilla è la più brillante nel vicino infrarosso: yale.edu/ceo/Documentation/rsvegfaq.html Ci sono misure standard di "verde" delle piante basate su questo, come NDVI. Pertanto, se possibile, procurati una videocamera in grado di registrare la banda NIR.
whuber

Risposte:


12

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.

Diagramma di tonalità - Purezza verde in gradi di tonalità
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 pureGreendovrebbe essere 1.0 . Una formula per il calcolo greennesspotrebbe 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 periodcui verde è presente in una certa misura. I scaleregola 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 è greenpossibile definire potrebbe essere presente (ovvero anziché da 0 a 240, è possibile impostare un vincolo come 40 > hue > 200invece) 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 greenpiù 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
}

1
+1 alla tecnica di elaborazione grezza. La fonte di dcraw sarebbe un buon punto di partenza cybercom.net/~dcoffin/dcraw/dcraw.c
Leggi il profilo

1
L'elaborazione grezza semplificherebbe il calcolo del livello di verde, tuttavia renderebbe molto più complessa la gestione della dominante di colore.
jrista

3

Progetto GLOBE ?

Non utilizzare un pezzo di carta bianco. Questi contengono brillantanti ottici che convertono alcuni raggi UV in luce blu, causando un'esposizione errata. Questo è il motivo per cui esistono graycards commerciali (come suggerito da jrista).

Scattare tutte le foto esattamente dallo stesso posto è sicuramente l'approccio corretto. Per quanto riguarda la velocità dell'otturatore e l'apertura, questi non dovrebbero importare. La velocità dell'otturatore non cambia affatto il colore, l'apertura sfoca l'immagine, ma penso che questo effetto scompare comunque quando si sommano tutti i valori dei pixel. Preferirei provare a ottenere un'esposizione costante.

Per quanto riguarda la differenza tra cloud e non cloud, potresti semplicemente voler eseguire alcuni test. Se la vera quantità di verde non cambia rapidamente (cioè da oggi a domani), allora non dovrebbe farlo nemmeno quando si esaminano le immagini. Forse un approccio empirico potrebbe aiutare lì (ad esempio se scopri che il verde è sempre più alto del 10% quando è annebbiato, potresti compensarlo).


non è un progetto GLOBE, ma potrebbe essere trasformato in uno; grazie per aver segnalato quel sito.
David LeBauer,

Forse di interesse anche per te: sto attualmente scrivendo un programma per analizzare video, ad esempio da webcam, e statistiche di output (condivisione verde ecc.). Dovrebbe essere finito nelle prossime settimane. phenocam.granjow.net
Simon A. Eugster,

sembra utile. Hai collaborato con qualche scienziato?
David LeBauer,

Non ancora troppo dato che i metodi di valutazione saranno l'ultima parte (e possono anche essere cambiati / aggiunti facilmente). Ma è un progetto dell'ETH di Zurigo e verrà utilizzato anche lì. (Per essere precisi, inizialmente verrà utilizzato dagli studenti delle scuole superiori per il loro progetto Globe.)
Simon A. Eugster,

1
  1. Suggerirei di riprendere "RAW" e di convertirlo in TIFF a 16 bit utilizzando il bilanciamento automatico del bianco della fotocamera ma nessuna correzione gamma (ovvero bilanciamento del colore ma uscita lineare). 16 bit consentirà un migliore calcolo dei rapporti e degli indici nelle ombre e nelle alte luci profonde (cioè senza ritaglio). DCRAW può farlo, ma la tua fotocamera verrebbe con il suo software che è probabilmente più facile da usare.

  2. Se vuoi indici, allora RGB è davvero l'unico spazio colore utile. Hai già menzionato l'indice "divergenza verde" (chiamato anche indice verde in eccesso): questo e l'algoritmo Green Leaf strettamente correlato funzionano abbastanza bene. Se si desidera eseguire la classificazione dei pixel in base al colore (cioè veg contro non-veg), allora osserverei attentamente lo spazio cromatico L a b * anziché HSV / HSI. In realtà sul sito Web di Mathworks è disponibile una demo abbastanza buona che illustra L ab * analisi. La classificazione potrebbe plausibilmente essere combinata con l'analisi spettrale per rispondere alle domande a) quanti pixel verdi ci sono eb) quanto sono verdi? Questo potrebbe essere più utile di un semplice indice greeness, che potrebbe anche essere influenzato dalla qualità spettrale di sfondo (suolo, rifiuti, ecc.), Che potrebbe anche cambiare nel tempo. Hai citato un raccolto di mais, quindi suppongo che stai puntando la fotocamera verso il basso, non verso l'alto?

  3. Se avessi due fotocamere, potresti combinare immagini dall'aspetto verso il basso (misurazione del verde) con immagini dall'aspetto verso l'alto che misurano la copertura vegetale. Le immagini verso l'alto non sarebbero adatte per l'analisi spettrale e la classificazione dei pixel sarebbe basata sul contrasto tra cielo / non cielo, probabilmente usando solo il canale blu dell'immagine RGB.

  4. Se stai raccogliendo una serie di attività (giornaliera?), Puoi dividere le immagini verso il basso in immagini di "giorno nuvoloso" e immagini di "giorno soleggiato" e verificare la presenza di errori. Potresti giocare con il bilanciamento del colore durante l'elaborazione grezza per correggere il bias, se presente, o semplicemente ridimensionare una serie in modo che corrisponda all'altra (per semplicità) supponendo che i giorni soleggiati e nuvolosi siano intervallati.

Divertiti.


Una tessera colorata con tessere rosse, verdi e blu potrebbe essere persino migliore di una carta grigia se segui quel percorso.
fisheye,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.