Comment pourrais-je utiliser mon appareil photo reflex pour mesurer la «verdure» d'une photo?


13

Contexte

Mes images numériques peuvent être lues dans un programme informatique comme Matlab ou R en tant que matrice amxnx 3 où mxn est le nombre de pixels observés par chacun des trois capteurs (rouge, vert et bleu), et chaque cellule de la matrice a un nombre de 1 à 255 qui reflète la luminosité observée par le capteur.

Je voudrais utiliser ces informations pour obtenir une mesure objective de la verdure sur une photo, car je veux tenter de corréler la verdure à la croissance des plantes (imaginez une image par jour d'un champ de maïs).

Les travaux antérieurs dans ce sens ont connu un certain succès en calculant un indice de vert

  • vert% = vert / (bleu + rouge) ou
  • divergence verte = 2 * vert - rouge - bleu

à partir d'images webcam pour chacun des pixels mxn, mais il n'y avait aucun contrôle sur l'ouverture ou le rayonnement incident (angle solaire).

notez que je ne cherche pas une mesure «absolue» de verdure, l'échelle et la distribution du nombre n'ont pas d'importance - il suffit de fournir une mesure relative cohérente de verdure.

Question

Puis-je utiliser mon SLR pour obtenir une mesure de verdure robuste qui est invariante avec tout ou partie des éléments suivants:

  • couverture nuageuse?
  • moment de la journée?
  • jour de l'année? (c'est la seule exigence)
  • proportion de ciel / sol en arrière-plan?

Statut actuel

J'ai proposé les idées suivantes, mais je ne sais pas lesquelles seraient nécessaires ou lesquelles n'auraient aucun effet sur le rapport vert / (rouge + bleu)

  1. prendre une photo d'un morceau de plastique blanc et utiliser cette image pour normaliser les autres valeurs
  2. Ouverture fixe
  3. Fixe la vitesse d'obturation
  4. régler la balance des blancs à l'aide d'une feuille de papier blanc
  5. Prenez toutes les photos sous le même angle
  6. Prenez toutes les photos à midi solaire

1
Vous pourriez envisager un éclairage artificiel, cela simplifierait la procédure. Un flash devrait fonctionner correctement, assurez-vous simplement qu'il est au même endroit et qu'il est alimenté.
PearsonArtPhoto

@Pearsonarphoto - idée intéressante, je pensais à prendre des photos pendant la journée, mais il est peut-être plus logique de les faire la nuit sans lune.
David LeBauer

1
Si vous suivez les conseils de Pearsonartphoto, vous voudrez régler manuellement l'obturateur, l'ouverture et l'ISO - réglez votre obturateur sur la vitesse de synchronisation de votre flash (généralement 1/200 à 1/320), et réglez votre ouverture et ISO aussi bas car ils peuvent aller sans manquer de puissance du flash. Cela rendra votre ambiance aussi sombre que possible - une pleine lune ne devrait pas poser de problème (soleil de midi, par contre ...) Pour cette situation, le flash sur l'axe serait le meilleur, car il projettera le moins d'ombres .
Evan Krall

2
@Evan Je ne suis pas d'accord sur le flash sur axe. La raison en est la suivante: photo.stackexchange.com/questions/9531/… - Trop de réflexion directe. Sauf lors de l'utilisation de polariseurs, comme je l'ai décrit ici - mais il faut ensuite s'assurer que le matériel reste le même et que la balance des blancs est effectuée correctement. Les polariseurs modifient la balance des blancs.
Simon A. Eugster

2
La chlorophylle est la plus brillante dans le proche infrarouge: yale.edu/ceo/Documentation/rsvegfaq.html Il existe des mesures standard de la «verdure» des plantes basées sur cela, comme le NDVI. Ainsi, si vous le pouvez, procurez-vous une caméra capable d'enregistrer la bande NIR.
whuber

Réponses:


12

Si vous pouvez traiter les fichiers RAW, vous aurez un tableau de pixels bayer composé de lignes RGRGRG et GBGBGB (ou éventuellement des lignes RGBGRGBG.) Vous pouvez ignorer tous les pixels R et B, résumer les pixels G, prendre la racine carrée ( car il y a deux fois plus de pixels verts qu'il y a de rouge ou de bleu), et divisez par deux le nombre de pixels G. Cela devrait vous donner la moyenne pondérée appropriée pour le "vert" dans votre photo. Vous pouvez ensuite prendre la moyenne du rouge et du bleu et calculer votre pourcentage vert à partir des trois moyennes.

Pour être plus précis, vous souhaiterez peut-être prendre en compte la pondération appropriée pour les pixels des capteurs rouges, verts et bleus, car les capteurs CMOS ont des sensibilités différentes à chaque longueur d'onde de la lumière. Les poids dépendent généralement du capteur. Ce serait l'approche simple.

Pour tenir compte de la dominante de couleur en raison de l'heure de la journée, de divers types d'éclairage artificiel, etc., il pourrait être plus approprié de prétraiter chaque photo dans un outil comme Lightroom pour corriger d'abord la balance des blancs, puis effectuer votre calcul sur des images pixel RVB standard. Contrairement au traitement des données du capteur RAW, vous voudriez pondérer votre calcul en fonction de la «pureté verte» des pixels, plutôt que de faire la moyenne globale de la composante verte. Plus un pixel est vert pur, plus son poids est élevé par rapport à des pixels plus rouges ou bleus. La normalisation de la balance des blancs avant le traitement devrait éliminer tout besoin de compliquer un calcul par ailleurs assez simple avec des tangentes conçues pour tenir compte de nombreux facteurs tels que la couverture nuageuse, l'heure de la journée, la saison, etc.

Vous pouvez toujours vouloir prendre en compte de grandes zones de pixels non incidents, comme le ciel. Je ne peux pas vraiment vous aider beaucoup dans ce domaine sans en savoir plus sur ce que vous essayez d'accomplir. La verdure d'une "photographie" dans son ensemble serait probablement mieux servie en calculant le rapport du vert au rouge et au bleu, qui comprendrait les pixels "du ciel".

Quant à votre procédure, il va sans dire que si vous prenez les photos avec les mêmes réglages de l'appareil photo, sous le même illuminant (même intensité et température de couleur), mesurés par rapport à une ligne de base commune telle qu'une carte grise à 18%, ira évidemment un long chemin vers la normalisation de vos résultats. Avec le numérique, tout écart peut être corrigé avec le logiciel de traitement RAW et un outil de sélection de la balance des blancs de base, alors assurez-vous de prendre des photos en RAW.


Pour fournir un aperçu supplémentaire du calcul de la "verdure" de vos photos. Il existe évidemment des moyens simples, tels que le calcul du poids des pixels verts par rapport au bleu et au rouge, ou le calcul de la pureté verte par rapport à la pureté rouge / bleu des pixels RVB. Vous pourriez avoir plus de chance si vous convertissez dans un espace colorimétrique plus approprié, tel que HSV ( Teinte / Saturation / Valeur , parfois appelé HSB, en remplaçant Valeur par la luminosité), et calculez votre quantité de vert en utilisant une courbe dans l'espace HUE. (REMARQUE: HSL est un type d'espace colorimétrique différent et ne serait probablement pas idéal pour calculer la quantité de "vert" dans une photo, donc j'utiliserais HSV. Vous pouvez en savoir plus sur ces espaces colorimétriques ici.) Le vert pur (quelle que soit la saturation ou la valeur) tombe à un angle de teinte de 120 °, et tombe à partir de là lorsque vous vous dirigez vers le rouge (à 0 °) ou vers le bleu (à 240 °). Entre 240 ° et 360 °, il y aurait zéro quantité de vert dans un pixel, quelle que soit la saturation ou la valeur.

Tracé de teinte - Pureté verte en degrés de teinte
Fig 1. Tracé de teinte - Pureté verte en degrés de teinte

Vous pouvez ajuster la courbe de pondération réelle pour répondre à vos besoins spécifiques, mais une simple courbe pourrait être similaire à la suivante:

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

La valeur de pureGreendoit être 1,0 . Une formule de calcul greennesspourrait alors être faite comme suit:

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

Le hueest le degré de couleur de votre valeur de couleur HSV. C'est radiusla moitié de la zone perioddans laquelle le vert est présent dans une certaine mesure. Le scaleajuste la courbe sin à notre période, de telle sorte que les sin(scale * hue)pics (renvoie 1,0) exactement où vous auriez du vert pur (en ignorant l'intensité des verts). Étant donné que la quantité de greennessn'est valide que dans la première moitié de notre période, le calcul de verdure n'est valide que lorsque la teinte est supérieure à 0 ° et inférieure à 240 °, et son zéro pour toute autre teinte.

Vous pouvez ajuster la pondération en ajustant la période, la plage dans laquelle vous définissez greenpeut être présente (c.-à-d. Plutôt que de 0 à 240, vous pouvez définir une contrainte comme à la 40 > hue > 200place), et définissez tout ce qui se situe en dehors de cette plage pour avoir une verdeur de 0 Il convient de noter que ce sera mathématiquement précis, mais il peut ne pas être entièrement précis sur le plan perceptuel. Vous pouvez bien sûr modifier la formule pour ajuster le point de pure greenplus vers le jaune (ce qui pourrait produire des résultats plus précis sur le plan perceptuel), augmenter l'amplitude de la courbe pour atteindre un plateau et étendre la bande de vert pur à une gamme de teintes, plutôt qu'à un seul valeur de teinte, etc. Pour une précision de perception humaine totale, un algorithme plus complexe traité dans CIE XYZ et CIE L a b *de l'espace pourrait être nécessaire. (REMARQUE: la complexité du travail dans XYZ et l'espace Lab augmente considérablement au-delà de ce que j'ai décrit ici.)

Pour calculer la verdure d'une photo, vous pouvez calculer la verdure de chaque pixel, puis produire une moyenne. Vous pouvez ensuite prendre l'algorithme à partir de là et le modifier selon vos besoins spécifiques.

Vous pouvez trouver des algorithmes pour les conversions de couleurs sur EasyRGB , tels que celui pour RVB en 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 à la technique de traitement brut. La source dcraw serait un bon point de départ cybercom.net/~dcoffin/dcraw/dcraw.c
Veuillez lire mon profil

1
Le traitement brut faciliterait le calcul du niveau de vert, mais rendrait le traitement de la dominante de couleur considérablement plus complexe.
jrista

3

Projet GLOBE ?

N'utilisez pas de papier blanc. Ceux-ci contiennent des azurants optiques qui convertissent certains UV en lumière bleue, provoquant une exposition incorrecte. C'est pourquoi les cartes grises commerciales (comme suggéré par jrista) existent.

Prendre toutes les photos exactement au même endroit est certainement la bonne approche. En ce qui concerne la vitesse d'obturation et l'ouverture, cela ne devrait pas avoir d'importance. La vitesse d'obturation ne change pas du tout de couleur, l'ouverture rend l'image floue, mais je pense que cet effet disparaît quand même lorsque vous résumez toutes les valeurs de pixels. Je préfère essayer d'obtenir une exposition constante.

En ce qui concerne la différence entre clouded et non clouded, vous pouvez simplement vouloir exécuter quelques tests. Si la véritable quantité de vert ne change pas rapidement (c'est-à-dire d'aujourd'hui à demain), il ne devrait pas non plus le faire lors de l'examen des images. Une approche empirique pourrait peut-être y aider (par exemple, si vous découvrez que la verdure est toujours 10% plus élevée lorsqu'elle est trouble, vous pouvez compenser cela).


ce n'est pas un projet GLOBE, mais il pourrait être transformé en un seul; merci d'avoir signalé ce site.
David LeBauer

Peut-être que cela vous intéresse aussi: j'écris actuellement un programme pour analyser des vidéos, par exemple à partir de webcams, et des statistiques de sortie (part verte, etc.). Devrait être terminé dans les prochaines semaines. phenocam.granjow.net
Simon A. Eugster

cela semble utile. Avez-vous collaboré avec des scientifiques?
David LeBauer

Pas trop pour l'instant car les méthodes d'évaluation seront la dernière partie (et peuvent également être modifiées / ajoutées facilement). Mais c'est un projet de l'ETH Zürich et y sera également utilisé. (Pour être précis, il sera initialement utilisé par les élèves du secondaire pour leur projet Globe.)
Simon A. Eugster

1
  1. Je suggérerais de prendre «RAW» et de le convertir en TIFF 16 bits en utilisant la balance des blancs automatique de l'appareil photo mais pas de correction gamma (c'est-à-dire une sortie équilibrée mais linéaire). 16 bits permettra un meilleur calcul des ratios et des indices dans les ombres et les hautes lumières (c.-à-d. Pas d'écrêtage). DCRAW peut le faire, mais votre appareil photo serait livré avec son propre logiciel qui est probablement plus facile à utiliser.

  2. Si vous voulez des indices, RVB est vraiment le seul espace colorimétrique utile. Vous avez déjà mentionné l'indice de «divergence verte» (également appelé indice vert excédentaire) - cela et l'algorithme Green Leaf étroitement lié fonctionnent plutôt bien. Si vous souhaitez effectuer une classification des pixels basée sur les couleurs (c.-à-d. Veg contre non-veg), je regarderais de près l' espace colorimétrique L a b * plutôt que HSV / HSI. Il y a en fait une assez bonne démo sur le site Web de Mathworks qui illustre L aanalyse b *. La classification pourrait être combinée avec une analyse spectrale pour répondre aux questions a) combien de pixels verts y a-t-il et b) combien sont-ils verts? Cela pourrait être plus utile qu'un simple indice de verdure, qui serait également influencé par la qualité spectrale de fond (sol, litière, etc.), qui pourrait également changer avec le temps. Vous avez mentionné une récolte de maïs, donc je suppose que vous pointez la caméra vers le bas, pas vers le haut?

  3. Si vous aviez deux caméras, vous pourriez combiner des images regardant vers le bas (mesurant le vert) avec des images regardant vers le haut qui mesurent la couverture végétale. Les images ascendantes ne conviendraient pas à l'analyse spectrale et la classification des pixels serait basée sur le contraste entre ciel / non-ciel, utilisant probablement uniquement le canal bleu de l'image RVB.

  4. Si vous collectez une série temporelle (quotidienne?), Vous pouvez diviser les images descendantes en images de «jour nuageux» et d'images de «journée ensoleillée» et vérifier les biais. Vous pouvez jouer avec l'équilibre des couleurs pendant le traitement brut pour corriger le biais, le cas échéant, ou simplement redimensionner une série pour qu'elle corresponde à l'autre (restez simple) en supposant que les jours ensoleillés et nuageux sont entrecoupés.

S'amuser.


Une tuile de couleur avec des tuiles rouges, vertes et bleues pourrait être encore meilleure qu'une carte grise si vous suivez ce chemin.
fisheye
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.