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.
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 pureGreen
doit être 1,0 . Une formule de calcul greenness
pourrait alors être faite comme suit:
sin(scale * hue) } 0 > hue > 240
greenness =
0 } 240 <= hue <= 360 || hue == 0
Le hue
est le degré de couleur de votre valeur de couleur HSV. C'est radius
la moitié de la zone period
dans laquelle le vert est présent dans une certaine mesure. Le scale
ajuste 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 greenness
n'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 green
peut être présente (c.-à-d. Plutôt que de 0 à 240, vous pouvez définir une contrainte comme à la 40 > hue > 200
place), 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 green
plus 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
}