Como eu usaria minha SLR para medir o 'verde' de uma foto?

13

fundo

Minhas imagens digitais podem ser lidas em um programa de computador como Matlab ou R como matriz amxnx 3, em que mxn é o número de pixels observado por cada um dos três sensores (vermelho, verde e azul) e cada célula da matriz possui um número 1-255 que reflete o brilho observado pelo sensor.

Eu gostaria de usar essas informações para obter uma medida objetiva do verde em uma fotografia, porque quero tentar correlacionar o verde ao crescimento das plantas (imagine uma foto por dia de um campo de milho).

Trabalhos anteriores nessa direção tiveram algum sucesso ao calcular um índice de verde como

  • verde% = verde / (azul + vermelho) ou
  • divergência verde = 2 * verde - vermelho - azul

das imagens da webcam para cada um dos pixels mxn, mas não havia controle sobre a abertura ou a radiação incidente (ângulo solar).

observe que não estou procurando uma medida 'absoluta' de esverdeamento, a escala e a distribuição do número não importa - ele apenas precisa fornecer uma medida relativa consistente de esverdeamento.

Questão

Posso usar minha SLR para obter uma medida robusta de verde invariável com um ou todos os seguintes itens:

  • cobertura de nuvens?
  • hora do dia?
  • dia do ano? (este é o único requisito)
  • proporção de céu / solo em segundo plano?

Status atual

Tive as seguintes idéias, mas não sei ao certo quais seriam necessárias ou quais não teriam efeito na proporção de verde / (vermelho + azul)

  1. tire uma foto de um pedaço de plástico branco e use esta imagem para normalizar os outros valores
  2. Corrigir abertura
  3. Corrigir velocidade do obturador
  4. defina o balanço de branco usando um pedaço de papel branco
  5. Tire todas as fotos do mesmo ângulo
  6. Tire todas as fotos ao meio-dia solar
David LeBauer
fonte
1
Você pode considerar a iluminação artificial, isso tornaria o procedimento mais simples. Um flash deve funcionar adequadamente, apenas verifique se está no mesmo local e com a energia.
Pearsonartphoto
@Pearsonarphoto - ideia interessante, eu estava pensando em tirar as fotos durante o dia, mas talvez faça mais sentido fazê-las à noite sem lua.
David LeBauer
1
Se você estiver seguindo o conselho da Pearsonartphoto, defina manualmente o obturador, a abertura e o ISO - defina o obturador para a velocidade de sincronização do flash (geralmente 1/200 a 1/320) e defina sua abertura e ISO como baixos. como eles podem ir sem ficar sem energia do flash. Isso deixará o ambiente o mais escuro possível - uma lua cheia não deve ser problema (sol do meio dia, por outro lado ...) Para esta situação, o flash no eixo seria o melhor, pois lançaria o menor número de sombras .
Evan Krall
2
@Evan Não concordo com flash no eixo. A razão é a seguinte: photo.stackexchange.com/questions/9531/… - Maneiras de refletir muito diretamente. Exceto ao usar polarizadores, como descrevi lá - mas é preciso garantir que o equipamento permaneça o mesmo e que o balanço de branco seja feito corretamente. Os polarizadores alteram o balanço de brancos.
Simon A. Eugster
2
A clorofila é mais brilhante no infravermelho próximo: yale.edu/ceo/Documentation/rsvegfaq.html Existem medidas padrão de "verde" das plantas com base nisso, como o NDVI. Assim, se você puder, consiga uma câmera que possa gravar a banda NIR.
whuber

Respostas:

12

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.

Gráfico de Matiz - Pureza Verde em Graus de Matiz
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 pureGreendeve ser 1,0 . Uma fórmula para computação greennesspoderia 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 periodqual o verde está presente até certo ponto. Ele scaleajusta 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 greennesssó é 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 greenpode estar presente (ou seja, em vez de 0 a 240, você pode definir uma restrição como 40 > hue > 200alternativa) 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 greenmais 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
}
jrista
fonte
1
+1 na técnica de processamento bruto. A fonte dcraw seria um bom ponto de partida cybercom.net/~dcoffin/dcraw/dcraw.c
Por favor, leia perfil
1
O processamento em bruto tornaria mais fácil o cálculo do nível verde, no entanto, tornaria o tratamento da conversão de cores consideravelmente mais complexo.
jrista
3

Projeto GLOBE ?

Não use um pedaço de papel branco. Eles contêm branqueadores ópticos que convertem um pouco de UV em luz azul, causando exposição incorreta. É por isso que existem cartões cinza comerciais (como sugerido por jrista).

Tirar todas as fotos exatamente do mesmo lugar é certamente a abordagem correta. Em relação à velocidade do obturador e abertura, estes não devem importar. A velocidade do obturador não muda de cor, a abertura desfoca a imagem, mas acho que esse efeito desaparece de qualquer maneira quando você soma todos os valores de pixel. Prefiro tentar obter uma exposição constante.

Com relação à diferença entre nublado e não nublado, você pode apenas querer executar alguns testes. Se a quantidade real de verde não mudar rapidamente (ou seja, de hoje para amanhã), também não deve ser feita ao examinar as imagens. Talvez uma abordagem empírica possa ajudar lá (por exemplo, se você descobrir que o verde é sempre 10% maior quando está nublado, você pode compensar isso).

Simon A. Eugster
fonte
não é um projeto GLOBE, mas pode ser transformado em um; obrigado por apontar esse site.
David LeBauer 17/03/11
Talvez também seja interessante para você: atualmente, estou escrevendo um programa para analisar vídeos, por exemplo, de webcams, e estatísticas de saída (compartilhamento verde etc.). Deve terminar nas próximas semanas. phenocam.granjow.net
Simon A. Eugster
isso parece útil. Você tem colaborado com algum cientista?
David LeBauer 01/02
Ainda não muito, já que os métodos de avaliação serão a última parte (e também podem ser alterados / adicionados facilmente). Mas é um projeto da ETH Zürich e também será usado lá. (Para ser preciso, inicialmente, ele será usado por estudantes do ensino médio para o seu projecto Globe.)
Simon A. Eugster
1
  1. Eu sugeriria fotografar 'RAW' e converter para TIFF de 16 bits usando o balanço de branco automático da câmera, mas sem correção de gama (ou seja, saída de cores equilibrada, mas linear). 16 bits permitirá um melhor cálculo de proporções e índices em sombras profundas e realces (ou seja, sem recorte). O DCRAW pode fazer isso, mas sua câmera viria com seu próprio software, provavelmente mais fácil de usar.

  2. Se você deseja índices, o RGB é realmente o único espaço de cores útil. Você já mencionou o índice de 'divergência verde' (também chamado de Excesso de Índice Verde) - este e o algoritmo de folha verde intimamente relacionado funcionam muito bem. Se você deseja executar uma classificação de pixel baseada em cores (ou seja, veg versus não veg), eu examinaria atentamente o espaço de cores L a b * em vez de HSV / HSI. Na verdade, há uma demonstração muito boa no site da Mathworks que ilustra L ab * análise. A classificação poderia ser combinada com a análise espectral para responder às perguntas a) quantos pixels verdes existem eb) quantos verdes são? Isso pode ser mais útil do que apenas um índice de greeness, que também seria influenciado pela qualidade espectral de fundo (solo, lixo, etc.), que também poderia mudar com o tempo. Você mencionou uma colheita de milho, então suponho que você esteja apontando a câmera para baixo, não para cima?

  3. Se você tivesse duas câmeras, poderia combinar imagens de aparência descendente (medindo o verde) com imagens de aparência ascendente que medem a cobertura vegetal. Imagens para cima não seriam adequadas para análise espectral e a classificação de pixels seria baseada no contraste entre céu / não céu, provavelmente usando apenas o canal azul da imagem RGB.

  4. Se você estiver coletando séries temporais (diárias?), Poderá dividir as imagens descendentes em imagens de 'dia nublado' e imagens de 'dia ensolarado' e verificar se há viés. Você pode jogar com o equilíbrio de cores durante o processamento bruto para corrigir o viés, se presente, ou apenas redimensionar uma série para corresponder à outra (simplifique) assumindo que os dias ensolarados e nublados são intercalados.

Diverta-se.

olho de peixe
fonte
Um ladrilho colorido com ladrilhos vermelho, verde e azul pode ser ainda melhor do que um cartão cinza se você seguir esse caminho.
Fisheye #