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.
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 pureGreen
debe ser 1.0 . Una fórmula para la computación greenness
podría entonces hacerse de la siguiente manera:
sin(scale * hue) } 0 > hue > 240
greenness =
0 } 240 <= hue <= 360 || hue == 0
El hue
es el grado de color de su valor de color HSV. El radius
es la mitad de la period
cual el verde está presente hasta cierto punto. Las scale
ajusta 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 greenness
solo 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 green
puede estar presente (es decir, en lugar de 0 a 240, puede establecer una restricción como en su 40 > hue > 200
lugar) 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 green
má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
}