Jeśli możesz przetwarzać pliki RAW, będziesz mieć szereg pikseli bayera składający się z wierszy RGRGRG i GBGBGB (lub ewentualnie wierszy RGBGRGBG.) Możesz zignorować wszystkie piksele R i B, zsumować piksele G, wziąć pierwiastek kwadratowy ( ponieważ jest dwa razy więcej zielonych pikseli niż czerwonych lub niebieskich) i podziel przez połowę liczby G pikseli. To powinno dać ci właściwą średnią ważoną dla „zielonego” zdjęcia. Następnie możesz wziąć średnią z czerwonego i niebieskiego i obliczyć swój zielony procent ze wszystkich trzech średnich.
Aby być bardziej dokładnym, możesz wziąć pod uwagę właściwe ważenie pikseli czujnika czerwonego, zielonego i niebieskiego, ponieważ czujniki CMOS mają różne czułości dla każdej długości fali światła. Ogólnie ciężary zależą od czujnika. To byłoby proste podejście.
Aby uwzględnić przebarwienia wynikające z pory dnia, różne rodzaje sztucznego oświetlenia itp., Bardziej odpowiednie może być wstępne przetworzenie każdego zdjęcia w narzędziu takim jak Lightroom, aby najpierw poprawić balans bieli, a następnie wykonać obliczenia na standardowych obrazach RGB. W przeciwieństwie do przetwarzania danych z czujników RAW, ważenie obliczeń powinno opierać się na pikselowej „zielonej czystości”, a nie na średniej ogólnej wartości zielonego składnika. Im bardziej czysty jest zielony piksel, tym większa jest jego waga w porównaniu z pikselami, które są bardziej czerwone lub niebieskie. Normalizacja balansu bieli przed przetwarzaniem powinna wyeliminować potrzebę komplikowania dość prostego obliczenia za pomocą stycznych zaprojektowanych w celu uwzględnienia wielu czynników, takich jak zachmurzenie, pora dnia, pora roku itp.
Nadal możesz chcieć uwzględnić duże obszary pikseli niepowodujących zdarzeń, takie jak niebo. Naprawdę nie mogę ci bardzo pomóc w tej dziedzinie, nie wiedząc więcej o tym, co dokładnie próbujesz osiągnąć. Zieloność „fotografii” ogólnie najlepiej byłoby najlepiej obliczyć stosunek zielonego do czerwonego i niebieskiego, który obejmowałby piksele „nieba”.
Jeśli chodzi o twoją procedurę, powinno być oczywiste, że jeśli zrobisz zdjęcia z tymi samymi ustawieniami aparatu, przy tym samym oświetleniu (ta sama intensywność i temperatura kolorów), mierzone względem wspólnej linii bazowej, takiej jak 18% szara karta, oczywiście pójdzie długa droga do normalizacji wyników. Dzięki technologii cyfrowej wszelkie niezgodności można korygować za pomocą oprogramowania do przetwarzania RAW i podstawowego narzędzia do wyboru balansu bieli, więc pamiętaj, aby fotografować w formacie RAW.
Aby uzyskać więcej informacji na temat obliczania „zieleni” zdjęć. Istnieją oczywiście proste sposoby, takie jak obliczenie masy pikseli bayerowskich w porównaniu do niebieskiego i czerwonego lub obliczenie czystości zieleni w stosunku do czystości czerwono / niebieskiej pikseli RGB. Możesz mieć więcej szczęścia, jeśli przekonwertujesz na bardziej odpowiednią przestrzeń kolorów, taką jak HSV ( Barwa / Nasycenie / Wartość , czasami nazywana HSB, zastępując Wartość jasnością) i obliczasz swoją zieloną ilość za pomocą krzywej w przestrzeni HUE. (UWAGA: HSL to inny typ przestrzeni kolorów i prawdopodobnie nie byłby idealny do obliczenia ilości „zieleni” na zdjęciu, więc użyłbym HSV. Możesz dowiedzieć się więcej o tych przestrzeniach kolorów tutaj.) Czysta zieleń (niezależnie od nasycenia lub wartości) spada pod kątem odcienia 120 ° i stamtąd spada w miarę przesuwania się w kierunku czerwonego (przy 0 °) lub w kierunku niebieskiego (przy 240 °). Pomiędzy 240 ° a 360 °, w pikselu byłaby zerowa ilość zieleni, niezależnie od nasycenia lub wartości.
Ryc. 1. Wykres barwy - Zielona czystość w stopniach barwy
Możesz dostosować rzeczywistą krzywą ważenia do własnych potrzeb, jednak prosta krzywa może być podobna do poniższej:
range = 240
period = range * 2 = 240 * 2 = 480
scale = 360/period = 0.75
pureGreen = sin(scale * 120)
Wartość pureGreen
powinna wynosić 1,0 . Wzór na obliczenia greenness
można następnie wykonać w następujący sposób:
sin(scale * hue) } 0 > hue > 240
greenness =
0 } 240 <= hue <= 360 || hue == 0
Jest hue
to stopień koloru na podstawie wartości koloru HSV. Jest radius
to połowa, period
w której do pewnego stopnia występuje zieleń. W scale
dostosowuje krzywa grzech do naszego okresu, takie, że sin(scale * hue)
piki (powraca 1.0) dokładnie tam, gdzie chcesz mieć intensywny zielony (pomijając, że intensywność zielonych). Ponieważ ilość greenness
jest ważna tylko w pierwszej połowie naszego okresu, obliczenie zieloności jest ważne tylko wtedy, gdy odcień jest większy niż 0 ° i mniejszy niż 240 °, a jego zero dla dowolnego innego odcienia.
Możesz dostosować wagę, dopasowując okres, zakres, w którym możesz zdefiniować, green
może być obecny (tzn. Zamiast od 0 do 240, możesz ustawić ograniczenie podobne do 40 > hue > 200
tego) i zdefiniować cokolwiek poza tym zakresem, aby mieć zieloność 0 Należy zauważyć, że będzie to matematycznie dokładne, jednak może nie być całkowicie percepcyjnie dokładne. Możesz oczywiście dostosować formułę, aby dostosować punkt pure green
bardziej do żółtego (co może dać bardziej percepcyjnie dokładne wyniki), zwiększyć amplitudę krzywej do płaskowyżu i rozszerzyć pasmo czystej zieleni do zakresu odcienia, zamiast jednego wartość barwy itp. Dla całkowitej dokładności percepcji człowieka bardziej złożony algorytm przetwarzany w CIE XYZ i CIE L a b *może być wymagane miejsce. (UWAGA: złożoność pracy w przestrzeni XYZ i Lab zwiększa się dramatycznie ponad to, co tutaj opisałem.)
Aby obliczyć zieleń zdjęcia, możesz obliczyć zieleń każdego piksela, a następnie wygenerować średnią. Następnie możesz pobrać algorytm stamtąd i dostosować go do swoich konkretnych potrzeb.
Algorytmy konwersji kolorów można znaleźć w EasyRGB , takie jak ten dla RGB na 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
}