¿Cómo haría para usar mi SLR para medir el 'verde' de una foto?

13

Antecedentes

Mis imágenes digitales se pueden leer en un programa de computadora como Matlab o R como matriz amxnx 3, donde mxn es la cantidad de píxeles observados por cada uno de los tres sensores (rojo, verde y azul), y cada celda en la matriz tiene un número 1-255 que refleja el brillo observado por el sensor.

Me gustaría usar esta información para obtener una medida objetiva del verdor en una fotografía, porque quiero intentar correlacionar el verdor con el crecimiento de las plantas (imagine una imagen por día de un campo de maíz).

El trabajo anterior en esta dirección ha tenido cierto éxito al calcular un índice de verde ya sea como

  • verde% = verde / (azul + rojo) o
  • divergencia verde = 2 * verde - rojo - azul

de las imágenes de la cámara web para cada uno de los píxeles mxn, pero no hubo control sobre la apertura o la radiación incidente (ángulo solar).

tenga en cuenta que no estoy buscando una medida 'absoluta' de verdor, la escala y la distribución del número no importa, solo tiene que proporcionar una medida relativa consistente de verdor.

Pregunta

¿Puedo usar mi SLR para obtener una medida robusta de verdor que sea invariable con alguno o todos los siguientes:

  • ¿Cubierto de nubes?
  • hora del dia?
  • día del año? (este es el único requisito)
  • proporción de cielo / tierra en el fondo?

Estado actual

Se me ocurrieron las siguientes ideas, pero no estoy seguro de cuáles serían necesarias o cuáles no tendrían ningún efecto en la relación de verde / (rojo + azul)

  1. tome una foto de una pieza de plástico blanca y use esta imagen para normalizar los otros valores
  2. Fijar apertura
  3. Fijar velocidad de obturación
  4. establecer el balance de blancos con un trozo de papel blanco
  5. Toma todas las fotos desde el mismo ángulo
  6. Toma todas las fotos al mediodía solar
David LeBauer
fuente
1
Puede considerar la iluminación artificial, simplificaría el procedimiento. Un flash debería funcionar adecuadamente, solo asegúrese de que esté en la misma ubicación y potencia.
PearsonArtPhoto
@Pearsonarphoto: idea interesante, estaba pensando en tomar las fotos durante el día, pero tal vez tenga más sentido hacerlas de noche sin luna.
David LeBauer
1
Si sigue los consejos de Pearsonartphoto, querrá configurar su obturador, apertura e ISO manualmente: configure su obturador a la velocidad de sincronización de su flash (generalmente 1/200 a 1/320), y configure su apertura e ISO como bajos ya que pueden ir sin quedarse sin flash. Esto hará que su ambiente sea lo más oscuro posible: una luna llena no debería ser un problema (sol de medio día, por otro lado ...) Para esta situación, el flash en el eje sería lo mejor, ya que proyectará la menor cantidad de sombras .
Evan Krall
2
@Evan No estoy de acuerdo con el flash en el eje. La razón es esta: photo.stackexchange.com/questions/9531/… —Demasiada reflexión directa. Excepto cuando se usan polarizadores, como lo describí allí, pero uno debe asegurarse de que el engranaje permanezca igual y que el balance de blancos se realice correctamente. Los polarizadores cambian el balance de blancos.
Simon A. Eugster
2
La clorofila es más brillante en el infrarrojo cercano: yale.edu/ceo/Documentation/rsvegfaq.html Existen medidas estándar de "verdor" de las plantas basadas en esto, como el NDVI. Por lo tanto, si es posible, obtenga una cámara que pueda grabar la banda NIR.
whuber

Respuestas:

12

Si puede procesar los archivos RAW, tendrá una matriz de píxeles bayer compuesta por filas RGRGRG y GBGBGB (o posiblemente filas RGBGRGBG). Puede ignorar todos los píxeles R y B, resumir los píxeles G, sacar la raíz cuadrada ( dado que hay el doble de píxeles verdes que rojos o azules), y divida por la mitad el número de G píxeles. Eso debería darle el promedio ponderado adecuado para "verde" en su foto. Luego, puede tomar el promedio de rojo y azul, y calcular su porcentaje verde de los tres promedios.

Para ser más precisos, es posible que desee tener en cuenta la ponderación adecuada para los píxeles de los sensores rojo, verde y azul, ya que los sensores CMOS tienen diferentes sensibilidades a cada longitud de onda de luz. Los pesos dependerían del sensor, en general. Ese sería el enfoque simple.

Para tener en cuenta el tono de color debido a la hora del día, varios tipos de iluminación artificial, etc., entonces podría ser más apropiado preprocesar cada foto en una herramienta como Lightroom para corregir el balance de blancos primero y luego realizar su cálculo en imágenes de píxeles RGB estándar. A diferencia del procesamiento de datos del sensor RAW, querrá ponderar su cálculo en función de la "pureza verde" del píxel, en lugar de promediar el componente verde en general. Cuanto más verde puro es un píxel, mayor es su peso frente a los píxeles que son más rojos o azules. La normalización del balance de blancos antes del procesamiento debería eliminar cualquier necesidad de complicar un cálculo bastante simple con tangentes diseñadas para dar cuenta de innumerables factores como la capa de nubes, la hora del día, la estación, etc.

Es posible que aún desee tener en cuenta grandes áreas de píxeles no incidentes, como el cielo. Realmente no puedo ayudarte mucho en esa área sin saber más sobre exactamente lo que estás tratando de lograr. El verde de una "fotografía" en general probablemente sería mejor al calcular la proporción de verde a rojo y azul, que incluiría píxeles de "cielo".

En cuanto a su procedimiento, no debería decir que si toma las imágenes con la misma configuración de la cámara, bajo el mismo iluminante (misma intensidad y temperatura de color), medido contra una línea de base común, como una tarjeta gris al 18%, obviamente irá un largo camino hacia la normalización de sus resultados. Con digital, cualquier discrepancia se puede corregir con el software de procesamiento RAW y una herramienta básica de selección de balance de blancos, así que asegúrese de disparar en RAW.


Para proporcionar más información sobre el cálculo del "verde" de sus fotos. Obviamente, existen formas simples, como calcular el peso de los píxeles de bayer verde frente a azul y rojo, o calcular la pureza verde en relación con la pureza rojo / azul de los píxeles RGB. Es posible que tenga más suerte si convierte a un espacio de color más apropiado, como HSV ( Hue / Saturation / Value , a veces llamado HSB, que reemplaza Value con Brightness), y calcula su cantidad verde usando una curva en el espacio HUE. (NOTA: HSL es un tipo diferente de espacio de color, y probablemente no sería ideal para calcular cuánto "verde" hay en una foto, así que usaría HSV. Puede obtener más información sobre estos espacios de color aquí.) El verde puro (independientemente de la saturación o el valor) cae en un ángulo de tono de 120 °, y se cae desde allí a medida que avanza hacia el rojo (a 0 °) o hacia el azul (a 240 °). Entre 240 ° y 360 °, habría cero cantidad de verde en un píxel, independientemente de la saturación o el valor.

Hue Plot - Pureza verde en grados de tono
Fig. 1. Diagrama de tono: pureza verde en grados de tono

Puede ajustar la curva de ponderación real para satisfacer sus necesidades específicas, sin embargo, una curva simple podría ser similar a la siguiente:

range = 240
period = range * 2 = 240 * 2 = 480
scale = 360/period = 0.75
pureGreen = sin(scale * 120)

El valor para pureGreendebe ser 1.0 . Una fórmula para la computación greennesspodría entonces hacerse de la siguiente manera:

             sin(scale * hue)   } 0 > hue > 240
greenness = 
             0                  } 240 <= hue <= 360 || hue == 0

El huees el grado de color de su valor de color HSV. El radiuses la mitad de la periodcual el verde está presente hasta cierto punto. Las scaleajusta la curva de pecado a nuestra época, de tal manera que sin(scale * hue)los picos (retornos 1.0) exactamente donde usted tendría verde puro (haciendo caso omiso de que la intensidad de los verdes). Dado que la cantidad de greennesssolo es válida en la primera mitad de nuestro período, el cálculo de verdor solo es válido cuando el tono es mayor que 0 ° y menor que 240 °, y es cero para cualquier otro tono.

Puede ajustar la ponderación ajustando el período, el rango dentro del cual define greenpuede estar presente (es decir, en lugar de 0 a 240, puede establecer una restricción como en su 40 > hue > 200lugar) y definir cualquier cosa fuera de ese rango para que tenga un verde de 0 Cabe señalar que esto será matemáticamente exacto, sin embargo, puede que no sea completamente perceptualmente exacto. Por supuesto, puede ajustar la fórmula para ajustar el punto de pure greenmás hacia el amarillo (lo que podría producir resultados más perceptualmente precisos), aumentar la amplitud de la curva a la meseta y expandir la banda de verde puro a un rango de tono, en lugar de un solo valor de tono, etc. Para una precisión perceptiva humana total, un algoritmo más complejo procesado en CIE XYZ y CIE L a b *Se puede requerir espacio. (NOTA: La complejidad de trabajar en el espacio XYZ y Lab aumenta dramáticamente más allá de lo que he descrito aquí).

Para calcular el verde de una foto, puede calcular el verde de cada píxel y luego generar un promedio. Luego puede tomar el algoritmo desde allí y ajustarlo para sus necesidades específicas.

Puede encontrar algoritmos para conversiones de color en EasyRGB , como el de RGB a 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
}
jrista
fuente
1
+1 a la técnica de procesamiento sin procesar. La fuente dcraw sería un buen punto de partida cybercom.net/~dcoffin/dcraw/dcraw.c
Lea el perfil el
1
El procesamiento sin procesar facilitaría el cálculo del nivel de verde, sin embargo, haría que lidiar con el color sea mucho más complejo.
jrista
3

Proyecto GLOBE ?

No use un pedazo de papel blanco. Contienen abrillantadores ópticos que convierten algunos rayos UV en luz azul, lo que provoca una exposición incorrecta. Es por eso que existen tarjetas grises comerciales (como lo sugiere jrista).

Tomar todas las fotos desde el mismo lugar es sin duda el enfoque correcto. En cuanto a la velocidad de obturación y la apertura, estos no deberían importar. La velocidad de obturación no cambia de color en absoluto, la apertura difumina la imagen, pero creo que este efecto desaparece de todos modos cuando se suman todos los valores de píxeles. Prefiero tratar de obtener una exposición constante.

Con respecto a la diferencia entre nublado y no nublado, es posible que solo desee ejecutar algunas pruebas. Si la cantidad real de verde no cambia rápidamente (es decir, de hoy a mañana), tampoco debería hacerlo al examinar las imágenes. Quizás un enfoque empírico podría ayudar allí (por ejemplo, si descubre que el verdor siempre es un 10% más alto cuando está nublado, podría compensar eso).

Simon A. Eugster
fuente
no es un proyecto GLOBE, pero podría convertirse en uno; gracias por señalar ese sitio
David LeBauer
Quizás también sea de su interés: actualmente estoy escribiendo un programa para analizar videos, por ejemplo, de cámaras web y estadísticas de salida (compartición verde, etc.) Debería estar terminado en las próximas semanas. phenocam.granjow.net
Simon A. Eugster
Eso suena útil. ¿Has estado colaborando con algún científico?
David LeBauer
Todavía no demasiado, ya que los métodos de evaluación serán la última parte (y también se pueden cambiar / agregar fácilmente). Pero es un proyecto de ETH Zürich y también se utilizará allí. (Para ser precisos, inicialmente será utilizado por estudiantes de secundaria para su proyecto Globe.)
Simon A. Eugster
1
  1. Sugeriría disparar 'RAW' y convertir a TIFF de 16 bits utilizando el balance de blancos automático de la cámara pero sin corrección de gamma (es decir, balance de color pero salida lineal). 16 bits permitirá un mejor cálculo de proporciones e índices en sombras profundas y reflejos (es decir, sin recorte). DCRAW puede hacer esto, pero su cámara vendría con su propio software que probablemente sea más fácil de usar.

  2. Si desea índices, entonces RGB es realmente el único espacio de color útil. Ya ha mencionado el índice de 'divergencia verde' (también llamado índice de exceso de verde); este y el algoritmo de hoja verde estrechamente relacionado funcionan bastante bien. Si desea realizar una clasificación de píxeles basada en el color (es decir, veg versus no veg), miraría detenidamente el espacio de color L a b * en lugar de HSV / HSI. En realidad, hay una muy buena demostración en el sitio web Mathworks que ilustra L de unab * análisis. La clasificación podría combinarse con el análisis espectral para responder las preguntas a) ¿cuántos píxeles verdes hay yb) qué tan verdes son? Esto podría ser más útil que solo un índice de verde, que también estaría influenciado por la calidad espectral de fondo (suelo, basura, etc.), que también podría cambiar con el tiempo. Mencionaste una cosecha de maíz, así que supongo que estás apuntando la cámara hacia abajo, no hacia arriba.

  3. Si tuviera dos cámaras, podría combinar imágenes que miren hacia abajo (midiendo el verde) con imágenes que miren hacia arriba y midan la cubierta vegetal. Las imágenes ascendentes no serían adecuadas para el análisis espectral y la clasificación de píxeles se basaría en el contraste entre cielo / no cielo, probablemente utilizando solo el canal azul de la imagen RGB.

  4. Si está recopilando una serie de tiempo (¿diaria?), Puede dividir las imágenes hacia abajo en imágenes de 'día nublado' e imágenes de 'día soleado' y verificar si hay sesgo. Puede jugar con el balance de color durante el procesamiento sin procesar para corregir el sesgo, si está presente, o simplemente cambiar el tamaño de una serie para que coincida con la otra (manténgalo simple) suponiendo que los días soleados y nublados estén intercalados.

Que te diviertas.

ojo de pez
fuente
Una ficha de color con fichas rojas, verdes y azules podría ser incluso mejor que una carta gris si sigues ese camino.
ojo de pez