Якщо ви можете обробити файли 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 °, в пікселі буде нульова кількість зеленого кольору, незалежно від насиченості або значення.
Рис 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 та лабораторії різко зростає поза тим, що я описав тут.)
Щоб обчислити зеленість фотографії, ви могли обчислити зеленість кожного пікселя, а потім створити середнє значення. Потім ви можете взяти алгоритм звідти і налаштувати його для ваших конкретних потреб.
Ви можете знайти алгоритми перетворення кольорів у 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
}