Jak miałbym używać mojej lustrzanki do mierzenia „zieleni” zdjęcia?

13

tło

Moje cyfrowe zdjęcia można odczytać w programie komputerowym takim jak Matlab lub R jako macierz amxnx 3, gdzie mxn to liczba pikseli obserwowana przez każdy z trzech czujników (czerwony, zielony i niebieski), a każda komórka w macierzy ma liczbę od 1-255, która odzwierciedla jasność obserwowaną przez czujnik.

Chciałbym wykorzystać tę informację do uzyskania obiektywnej miary zieleni na zdjęciu, ponieważ chcę spróbować skorelować zieleń ze wzrostem roślin (wyobraź sobie jedno zdjęcie dziennie pola kukurydzy).

Wcześniejsze prace w tym kierunku zakończyły się sukcesem, obliczając wskaźnik zieleni jako

  • zielony% = zielony / (niebieski + czerwony) lub
  • zielona dywergencja = 2 * zielony - czerwony - niebieski

z obrazów z kamery dla każdego z pikseli xxn, ale nie było kontroli nad przysłoną ani promieniowaniem padającym (kąt słoneczny).

zauważ, że nie szukam „absolutnej” miary zieleni, skala i rozkład liczby nie ma znaczenia - wystarczy zapewnić spójną względną miarę zieleni.

Pytanie

Czy mogę użyć mojej lustrzanki, aby uzyskać solidną miarę zieleni, która jest niezmienna z jednym lub wszystkimi z poniższych:

  • zachmurzenie?
  • pora dnia?
  • dzień roku? (jest to jedyny wymóg)
  • proporcja nieba / ziemi w tle?

Aktualny stan

Wymyśliłem następujące pomysły, ale nie jestem pewien, które byłyby konieczne lub które nie miałyby wpływu na stosunek zielony / (czerwony + niebieski)

  1. zrób zdjęcie białego plastiku i użyj tego obrazu, aby znormalizować inne wartości
  2. Napraw otwór
  3. Napraw czas otwarcia migawki
  4. ustaw balans bieli za pomocą białej kartki papieru
  5. Zrób wszystkie zdjęcia pod tym samym kątem
  6. Zrób wszystkie zdjęcia w słoneczne południe
David LeBauer
źródło
1
Możesz rozważyć sztuczne oświetlenie, uprościłoby to procedurę. Lampa błyskowa powinna działać odpowiednio, upewnij się tylko, że jest w tym samym miejscu i ma moc.
PearsonArtPhoto
@Pearsonarphoto - ciekawy pomysł, myślałem o robieniu zdjęć w ciągu dnia, ale być może bardziej sensowne jest robienie ich w nocy bez księżyca.
David LeBauer,
1
Jeśli postępujesz zgodnie z radą Pearsonartphoto, zechcesz ręcznie ustawić czas otwarcia migawki, przysłonę i ISO - ustaw czas migawki na synchronizację z lampą błyskową (zwykle od 1/200 do 1/320), a następnie ustaw przysłonę i czułość ISO na niskim poziomie jak to możliwe, bez wyczerpania się mocy błysku. To sprawi, że twoje otoczenie będzie tak ciemne, jak to możliwe - pełnia księżyca nie powinna być problemem (z drugiej strony słońce w połowie dnia ...) W tej sytuacji najlepszy byłby błysk osiowy, ponieważ rzuca najmniej cieni .
Evan Krall,
2
@Evan Nie zgadzam się co do błysku osiowego. Powód jest taki: photo.stackexchange.com/questions/9531/… - Sposoby zbyt dużego bezpośredniego odbicia. Z wyjątkiem używania polaryzatorów, jak tam opisałem - ale wtedy należy upewnić się, że sprzęt pozostaje taki sam i że balans bieli jest wykonywany poprawnie. Polaryzatory zmieniają balans bieli.
Simon A. Eugster,
2
Chlorofil jest najjaśniejszy w bliskiej podczerwieni: yale.edu/ceo/Documentation/rsvegfaq.html Istnieją oparte na tym standardowe pomiary „zieleni” roślin, takie jak NDVI. Tak więc, jeśli to możliwe, zdobądź kamerę, która może nagrywać pasmo NIR.
whuber

Odpowiedzi:

12

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.

Wykres barwy - Zielona czystość w stopniach barwy
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ść pureGreenpowinna wynosić 1,0 . Wzór na obliczenia greennessmożna następnie wykonać w następujący sposób:

             sin(scale * hue)   } 0 > hue > 240
greenness = 
             0                  } 240 <= hue <= 360 || hue == 0

Jest hueto stopień koloru na podstawie wartości koloru HSV. Jest radiusto połowa, periodw której do pewnego stopnia występuje zieleń. W scaledostosowuje 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ść greennessjest 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ć, greenmoże być obecny (tzn. Zamiast od 0 do 240, możesz ustawić ograniczenie podobne do 40 > hue > 200tego) 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 greenbardziej 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
}
jrista
źródło
1
+1 do techniki przetwarzania surowego. Źródłem dcraw byłby dobry punkt wyjścia cybercom.net/~dcoffin/dcraw/dcraw.c
Proszę przeczytać mój profil
1
Przetwarzanie surowe ułatwiłoby obliczanie poziomu zielonego, jednak znacznie bardziej skomplikowałoby proces rzucania kolorów.
jrista
3

Projekt GLOBE ?

Nie używaj białej kartki papieru. Zawierają one rozjaśniacze optyczne, które przekształcają część promieniowania UV w światło niebieskie, powodując nieprawidłowe naświetlenie. Właśnie dlatego istnieją komercyjne karty do gry (jak sugeruje jrista).

Robienie wszystkich zdjęć dokładnie z tego samego miejsca to z pewnością prawidłowe podejście. Jeśli chodzi o czas otwarcia migawki i przysłonę, nie powinny mieć znaczenia. Czas otwarcia migawki w ogóle nie zmienia koloru, przysłona rozmywa obraz, ale myślę, że ten efekt i tak znika po zsumowaniu wszystkich wartości pikseli. Wolałbym raczej uzyskać stałą ekspozycję.

Jeśli chodzi o różnicę między chmurami a chmurami, możesz po prostu przeprowadzić testy. Jeśli prawdziwa ilość zieleni nie zmienia się szybko (tj. Od dzisiaj do jutra), nie powinna tego robić również podczas przeglądania zdjęć. Być może może pomóc w tym podejście empiryczne (np. Jeśli odkryjesz, że zieleń jest zawsze o 10% wyższa, gdy jest zachmurzona, możesz to zrekompensować).

Simon A. Eugster
źródło
nie jest to projekt GLOBE, ale można go przekształcić w jeden; dzięki za wskazanie tej strony.
David LeBauer,
Być może też cię interesuje: piszę obecnie program do analizy filmów, np. Z kamer internetowych i statystyk wyjściowych (zielone udostępnianie itp.). Powinien zostać ukończony w nadchodzących tygodniach. phenocam.granjow.net
Simon A. Eugster
to brzmi użytecznie. Czy współpracowałeś z naukowcami?
David LeBauer,
Nie za dużo, ponieważ metody oceny będą ostatnią częścią (i mogą być również łatwo zmieniane / dodawane). Ale jest to projekt ETH Zürich i tam też zostanie wykorzystany. (Mówiąc ściślej, początkowo będzie on wykorzystywany przez licealistów do ich projektu Globe.)
Simon A. Eugster
1
  1. Sugerowałbym zrobienie zdjęcia „RAW” i konwersję do 16-bitowego TIFF przy użyciu automatycznego balansu bieli aparatu, ale bez korekcji gamma (tj. Zrównoważony kolor, ale wyjście liniowe). 16 bitów umożliwi lepsze obliczanie współczynników i wskaźników w głębokich cieniach i światłach (tj. Bez obcinania). DCRAW może to zrobić, ale twój aparat byłby wyposażony we własne oprogramowanie, które prawdopodobnie jest łatwiejsze w użyciu.

  2. Jeśli chcesz indeksów, RGB jest naprawdę jedyną użyteczną przestrzenią kolorów. Wspomniałeś już o indeksie „zielonej dywergencji” (zwanym także wskaźnikiem nadmiaru zieleni) - ten i ściśle powiązany algorytm zielonego liścia działają całkiem dobrze. Jeśli chcesz przeprowadzić klasyfikację pikseli na podstawie kolorów (tj. Veg kontra non-veg), przyjrzałbym się bliżej przestrzeni kolorów L a b * zamiast HSV / HSI. Tu jest rzeczywiście bardzo dobre demo na stronie Mathworks który ilustruje L Ab * analiza. Klasyfikacja może być połączona z analizą spektralną, aby odpowiedzieć na pytania a) ile jest zielonych pikseli ib) jak są zielone? Może to być bardziej przydatne niż tylko wskaźnik zieloności, na który miałaby również wpływ jakość spektralna tła (gleba, ściółka itp.), Która może również zmieniać się z czasem. Wspomniałeś o uprawie kukurydzy, więc zakładam, że celujesz aparatem w dół, a nie w górę?

  3. Jeśli posiadasz dwa aparaty, możesz łączyć obrazy skierowane w dół (pomiar zieleni) z obrazami skierowanymi w górę, które mierzą pokrycie roślinności. Obrazy skierowane w górę nie byłyby odpowiednie do analizy widmowej, a klasyfikacja pikseli byłaby oparta na kontraście między niebem a innym niebem, prawdopodobnie wykorzystując tylko niebieski kanał obrazu RGB.

  4. Jeśli gromadzisz serie czasowe (dzienne?), Możesz podzielić obrazy skierowane w dół na obrazy „pochmurny dzień” i obrazy „słoneczny dzień” i sprawdzić, czy nie występują odchylenia. Możesz grać z balansem kolorów podczas przetwarzania surowego, aby skorygować odchylenie, jeśli jest obecne, lub po prostu przeskalować jedną serię, aby dopasować do drugiej (upraszczając), zakładając, że słoneczne i pochmurne dni są przeplatane.

Baw się dobrze.

rybie oko
źródło
Kolorowa płytka z czerwonymi, zielonymi i niebieskimi płytkami może być nawet lepsza niż szara karta, jeśli pójdziesz tą ścieżką.
rybie oko