Se você puder processar os arquivos RAW, terá uma matriz de pixels bayer composta por linhas RGRGRG e GBGBGB (ou possivelmente linhas RGBGRGBG). Você pode ignorar todos os pixels R e B, resumir os pixels G e obter a raiz quadrada ( já que existem duas vezes mais pixels verdes do que vermelho ou azul) e divida pela metade do número de G pixels. Isso deve fornecer a média ponderada adequada para "verde" na sua foto. Você pode então pegar a média de vermelho e azul e calcular sua porcentagem de verde a partir das três médias.
Para ser mais preciso, você pode levar em consideração a ponderação adequada para os pixels do sensor vermelho, verde e azul, pois os sensores CMOS têm sensibilidades diferentes para cada comprimento de onda da luz. Os pesos dependeriam geralmente do sensor. Essa seria a abordagem simples.
Para considerar a projeção de cores devido à hora do dia, vários tipos de iluminação artificial etc., pode ser mais apropriado pré-processar cada foto em uma ferramenta como o Lightroom para corrigir primeiro o balanço de brancos e, em seguida, realizar o cálculo em imagens de pixel RGB padrão. Ao contrário do processamento de dados do sensor RAW, você deseja ponderar seu cálculo com base na "pureza verde" do pixel, em vez da média geral do componente verde. Quanto mais verde é um pixel, maior é seu peso vs. pixels mais vermelhos ou azuis. A normalização do balanço de brancos antes do processamento deve eliminar qualquer necessidade de complicar uma computação bastante simples com tangentes projetadas para explicar vários fatores como cobertura de nuvens, hora do dia, estação do ano, etc.
Você ainda pode querer considerar grandes áreas de pixels não incidentes, como o céu. Na verdade, não posso ajudá-lo muito nessa área sem saber exatamente o que você está tentando alcançar. O verde de uma "fotografia" em geral provavelmente seria melhor se computasse a proporção de verde para vermelho e azul, que incluiria pixels do "céu".
Quanto ao seu procedimento, não é necessário dizer que, se você tirar as fotos com as mesmas configurações da câmera, sob o mesmo iluminante (mesma intensidade e temperatura de cor), comparadas com uma linha de base comum, como um cartão cinza de 18%, obviamente um longo caminho para normalizar seus resultados. Com o digital, qualquer discrepância pode ser corrigida com o software de processamento RAW e uma ferramenta básica de seleção de balanço de branco, por isso, fotografe em RAW.
Para fornecer mais informações sobre o cálculo do "verde" das suas fotos. Obviamente, existem maneiras simples, como calcular o peso dos pixels da camada verde vs. azul e vermelho ou calcular a pureza do verde em relação à pureza do vermelho / azul dos pixels RGB. Você pode ter mais sorte se converter para um espaço de cores mais apropriado, como HSV ( Matiz / Saturação / Valor , às vezes chamado HSB, substituindo Valor por Brilho) e calcular sua quantidade de verde usando uma curva no espaço HUE. (OBSERVAÇÃO: HSL é um tipo diferente de espaço de cores e provavelmente não seria ideal para calcular quanto "verde" há em uma foto, portanto, eu usaria o HSV. Você pode aprender mais sobre esses espaços de cores aqui.) O verde puro (independentemente da saturação ou do valor) cai em um ângulo de matiz de 120 ° e cai dali quando você avança para o vermelho (a 0 °) ou para o azul (a 240 °). Entre 240 ° e 360 °, haveria quantidade zero de verde em um pixel, independentemente da saturação ou valor.
Fig 1. Gráfico de Matiz - Pureza Verde em Graus de Matiz
Você pode ajustar a curva de ponderação real para atender às suas necessidades específicas; no entanto, uma curva simples pode ser semelhante à seguinte:
range = 240
period = range * 2 = 240 * 2 = 480
scale = 360/period = 0.75
pureGreen = sin(scale * 120)
O valor para pureGreen
deve ser 1,0 . Uma fórmula para computação greenness
poderia então ser feita da seguinte maneira:
sin(scale * hue) } 0 > hue > 240
greenness =
0 } 240 <= hue <= 360 || hue == 0
O hue
é o grau de cor do seu valor de cor HSV. O radius
é a metade da period
qual o verde está presente até certo ponto. Ele scale
ajusta a curva do pecado ao nosso período, de modo que sin(scale * hue)
atinge o pico (retorna 1,0) exatamente onde você teria o verde puro (ignorando a intensidade dos verdes). Como a quantidade de greenness
só é válida na primeira metade do nosso período, o cálculo de esverdeamento é válido apenas quando a tonalidade for maior que 0 ° e menor que 240 ° e zero para qualquer outra tonalidade.
Você pode ajustar a ponderação ajustando o período, o intervalo dentro do qual você define green
pode estar presente (ou seja, em vez de 0 a 240, você pode definir uma restrição como 40 > hue > 200
alternativa) e definir qualquer coisa fora desse intervalo para ter um verde de 0 Deve-se notar que isso será matematicamente preciso, no entanto, pode não ser inteiramente perceptivamente preciso. É claro que você pode ajustar a fórmula para ajustar o ponto pure green
mais ao amarelo (o que pode produzir resultados perceptivamente mais precisos), aumentar a amplitude da curva para o platô e expandir a faixa de verde puro para uma faixa de matiz, em vez de um único valor da tonalidade, etc. Para precisão total da percepção humana, um algoritmo mais complexo processado no CIE XYZ e no CIE L a b *pode ser necessário espaço. (NOTA: A complexidade de trabalhar no espaço XYZ e Lab aumenta dramaticamente além do que descrevi aqui.)
Para calcular o verde de uma foto, você pode calcular o verde de cada pixel e produzir uma média. Você pode pegar o algoritmo a partir daí e ajustá-lo para suas necessidades específicas.
Você pode encontrar algoritmos para conversões de cores no EasyRGB , como o de RGB para 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
}