Если вы можете обрабатывать файлы RAW, у вас будет массив пикселей Байера, состоящий из строк RGRGRG и GBGBGB (или, возможно, строк RGBGRGBG). Вы можете игнорировать все пиксели R и B, суммировать пиксели G, взять квадратный корень (поскольку зеленых пикселей в два раза больше, чем красного или синего), и разделите их на половину числа G пикселей. Это должно дать вам правильное средневзвешенное значение для «зеленого» на вашей фотографии. Затем вы можете взять среднее значение красного и синего и вычислить ваш зеленый процент от всех трех средних.
Чтобы быть более точным, вы, возможно, захотите учесть правильное взвешивание для красного, зеленого и синего пикселей датчика, поскольку датчики CMOS имеют различную чувствительность к каждой длине волны света. Вес будет зависеть от датчика, как правило. Это был бы простой подход.
Чтобы учесть цветовой оттенок в зависимости от времени суток, различных типов искусственного освещения и т. Д., Тогда было бы более целесообразно предварительно обработать каждую фотографию с помощью такого инструмента, как Lightroom, чтобы сначала исправить баланс белого, а затем выполнить вычисления на стандартном RGB. пиксельные изображения. В отличие от обработки данных датчика RAW, вам нужно взвесить ваши расчеты на основе «зеленой чистоты» пикселя, а не усреднить зеленый компонент в целом. Чем более чистый зеленый пиксель, тем больше его вес по сравнению с пикселями, которые являются более красными или синими. Нормализация баланса белого перед обработкой должна исключить необходимость усложнять иное довольно простое вычисление касательными, разработанными для учета множества факторов, таких как облачный покров, время суток, время года и т. Д.
Возможно, вы по-прежнему хотите учитывать большие области неинцидентных пикселей, таких как небо. Я не могу вам сильно помочь в этой области, не зная больше о том, чего именно вы пытаетесь достичь. Зеленый цвет "фотографии" в целом, вероятно, лучше всего будет рассчитывать путем вычисления отношения зеленого, красного и синего, которое будет включать пиксели "неба".
Что касается вашей процедуры, то само собой разумеется, что если вы делаете снимки с одинаковыми настройками камеры при одном и том же источнике света (с одинаковой интенсивностью и цветовой температурой), измеренном по общей базовой линии, такой как 18% серая карта, очевидно, будет иметь большое значение для нормализации ваших результатов. В цифровом формате любые несоответствия можно исправить с помощью программного обеспечения для обработки RAW и базового инструмента для выбора баланса белого, поэтому обязательно снимайте в формате RAW.
Чтобы получить более глубокое представление о расчете "зелености" ваших фотографий. Очевидно, существуют простые способы, такие как вычисление веса пикселей зеленого байера по сравнению с синим и красным или вычисление зеленой чистоты по отношению к красной / синей чистоте пикселей RGB. Возможно, вам повезет больше, если вы преобразуете в более подходящее цветовое пространство, такое как HSV ( Оттенок / Насыщенность / Значение , иногда называемое HSB, заменяя значение на яркость), и вычисляете количество зеленого с использованием кривой в пространстве HUE. (ПРИМЕЧАНИЕ: HSL - это другой тип цветового пространства, и, вероятно, не было бы идеально рассчитывать, сколько "зеленого" на фотографии, поэтому я бы использовал HSV. Вы можете узнать больше об этих цветовых пространствах здесь .) Чистый зеленый (независимо от насыщенности или значения) падает под углом 120 ° и падает оттуда, когда вы двигаетесь в направлении красного (при 0 °) или в сторону синего (при 240 °). Между 240 ° и 360 ° в пикселе может быть нулевое количество зеленого цвета, независимо от насыщенности или значения.
![Hue Plot - Green Purity in Hue Degrees](https://i.stack.imgur.com/cVmgp.jpg)
Рис. 1. График оттенков - зеленая чистота в градусах оттенков
Вы можете настроить фактическую весовую кривую в соответствии с вашими конкретными потребностями, однако простая кривая может быть похожа на следующую:
range = 240
period = range * 2 = 240 * 2 = 480
scale = 360/period = 0.75
pureGreen = sin(scale * 120)
Значение для pureGreen
должно быть 1.0 . Формула для вычисления greenness
может тогда быть сделана следующим образом:
sin(scale * hue) } 0 > hue > 240
greenness =
0 } 240 <= hue <= 360 || hue == 0
hue
- это степень цвета от вашего значения цвета HSV. radius
- это половина period
, в которой зеленый присутствует в некоторой степени. scale
настраивает кривую синуса на наш период, так что sin(scale * hue)
достигает пика (возвращает 1,0) именно там, где вы будете иметь чистый зеленый цвет (игнорируя интенсивность зеленого цвета). Поскольку величина greenness
действительна только в первой половине нашего периода, расчет зеленого цвета действителен только тогда, когда оттенок больше 0 ° и меньше 240 °, и равен нулю для любого другого оттенка.
Вы можете регулировать весовые коэффициенты, регулируя период, в котором может присутствовать диапазон, в котором вы определяете green
(т.е. вместо от 0 до 240, вы можете установить ограничение, например 40 > hue > 200
), и определять что-либо вне из этого диапазона, чтобы иметь зеленоватость 0. Следует отметить, что это будет математически точным, однако это может быть не совсем точно для восприятия. Вы можете, конечно, настроить формулу, чтобы настроить точку на pure green
больше в сторону желтого (что может привести к более точным воспринимаемым результатам), увеличить амплитуду кривой до плато и расширить полосу чистого зеленого до диапазона оттенка, а чем значение одного оттенка и т. д. Для полной точности восприятия человеком может потребоваться более сложный алгоритм, обрабатываемый в CIE XYZ и CIE L a b * пробелах , (ПРИМЕЧАНИЕ. Сложность работы в пространствах XYZ и Lab значительно возрастает по сравнению с тем, что я здесь описал.)
Чтобы вычислить зеленоватость фотографии, вы можете вычислить зеленоватость каждого пикселя, а затем получить среднее значение. Затем вы можете взять алгоритм и настроить его под свои конкретные потребности.
Алгоритмы преобразования цветов можно найти по адресу EasyRGB , например алгоритм для RGB в 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
}