Если вы сможете обрабатывать файлы RAW, у вас будет массив пикселей Байера, состоящий из строк RGRGRG и GBGBGB (или, возможно, строк RGBGRGBG). Вы можете игнорировать все пиксели R и B, суммировать пиксели G, взять квадратный корень ( поскольку зеленых пикселей в два раза больше, чем красного или синего), разделите их на половину числа G пикселей. Это должно дать вам правильное средневзвешенное значение для «зеленого» на вашей фотографии. Затем вы можете взять среднее значение красного и синего и вычислить ваш зеленый процент из всех трех средних.
Чтобы быть более точным, вы, возможно, захотите учесть правильное взвешивание для красного, зеленого и синего пикселей датчика, поскольку датчики CMOS имеют различную чувствительность к каждой длине волны света. Вес будет зависеть от датчика, как правило. Это был бы простой подход.
Чтобы учесть цветовой оттенок, обусловленный временем суток, различными типами искусственного освещения и т. Д., Может быть более целесообразным предварительно обработать каждую фотографию в таком инструменте, как Lightroom, чтобы сначала исправить баланс белого, а затем выполнить вычисления на стандартных пиксельных изображениях RGB. В отличие от обработки данных датчика RAW, вам нужно взвесить ваши расчеты на основе «зеленой чистоты» пикселя, а не усреднить зеленый компонент в целом. Чем более чистый зеленый пиксель, тем больше его вес по сравнению с пикселями, которые являются более красными или синими. Нормализация баланса белого перед обработкой должна исключить необходимость усложнять иным образом довольно простые вычисления с касательными, разработанными для учета множества факторов, таких как облачный покров, время суток, время года и т. Д.
Возможно, вы по-прежнему хотите учитывать большие области не падающих пикселей, таких как небо. Я не могу вам сильно помочь в этой области, не зная больше о том, чего именно вы пытаетесь достичь. Зеленый цвет "фотографии" в целом, вероятно, будет лучше всего рассчитываться путем вычисления отношения зеленого, красного и синего, которое будет включать пиксели "неба".
Что касается вашей процедуры, то само собой разумеется, что если вы сделаете снимки с одинаковыми настройками камеры при одном и том же источнике света (с одинаковой интенсивностью и цветовой температурой), измеренном по общей базовой линии, такой как 18% серая карта, очевидно, долгий путь к нормализации ваших результатов. В цифровом формате любые расхождения можно исправить с помощью программного обеспечения для обработки RAW и базового инструмента выбора баланса белого, поэтому обязательно снимайте в формате RAW.
Чтобы получить более глубокое представление о расчете "зелености" ваших фотографий. Очевидно, есть простые способы, такие как вычисление веса пикселей зеленого байера по сравнению с синим и красным или вычисление зеленой чистоты по отношению к красной / синей чистоте пикселей RGB. Вам может повезти больше, если вы преобразуете в более подходящее цветовое пространство, такое как HSV ( Hue / Saturation / Value , иногда называемое HSB, заменяя Value на Brightness), и вычисляете количество зеленого, используя кривую в пространстве HUE. (ПРИМЕЧАНИЕ: HSL - это другой тип цветового пространства, и, вероятно, он не был бы идеальным для вычисления количества «зеленого» на фотографии, поэтому я бы использовал HSV. Подробнее об этих цветовых пространствах можно узнать здесь..) Чистый зеленый (независимо от насыщенности или значения) падает под углом 120 ° и падает оттуда, когда вы двигаетесь в направлении красного (при 0 °) или в сторону синего (при 240 °). Между 240 ° и 360 ° в пикселе будет нулевое количество зеленого цвета, независимо от насыщенности или значения.
Рис. 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
}