Wie würde ich mit meiner Spiegelreflexkamera vorgehen, um die „Grünheit“ eines Fotos zu messen?

Hintergrund

Meine digitalen Bilder können in ein Computerprogramm wie Matlab oder R als amxnx 3-Matrix eingelesen werden, wobei mxn die Anzahl der Pixel ist, die von jedem der drei (roten, grünen und blauen) Sensoren beobachtet werden, und jede Zelle in der Matrix eine Nummer hat von 1-255, der die vom Sensor beobachtete Helligkeit widerspiegelt.

Ich möchte diese Informationen verwenden, um ein objektives Maß für die Grünheit in einem Foto zu erhalten, weil ich versuchen möchte, die Grünheit mit dem Pflanzenwachstum in Beziehung zu setzen (stellen Sie sich ein Bild von einem Maisfeld pro Tag vor).

Frühere Arbeiten in dieser Richtung hatten einen gewissen Erfolg durch die Berechnung eines Index für Grün entweder als

  • grün % = grün/(blau + rot) oder
  • grüne Divergenz = 2*grün - rot - blau

aus Webcam-Bildern für jeden der mxn Pixel, aber es gab keine Kontrolle über die Blende oder die einfallende Strahlung (Sonnenwinkel).

Beachten Sie, dass ich nicht nach einem „absoluten“ Maß für die Grünheit suche, die Größenordnung und Verteilung der Zahl spielt keine Rolle – es muss nur ein konsistentes relatives Maß für die Grünheit liefern.

Frage

Kann ich meine SLR verwenden, um ein robustes Maß für die Grünheit zu erhalten, das mit einem oder allen der folgenden Punkte unveränderlich ist:

  • Wolkendecke?
  • Uhrzeit?
  • Tag des Jahres? (Dies ist die einzige Voraussetzung)
  • Anteil Himmel/Boden im Hintergrund?

Aktueller Status

Ich bin auf die folgenden Ideen gekommen, bin mir aber nicht sicher, welche notwendig wären oder welche keinen Einfluss auf das Verhältnis von Grün / (Rot + Blau) hätten.

  1. Machen Sie ein Foto von einem weißen Stück Plastik und verwenden Sie dieses Bild, um die anderen Werte zu normalisieren
  2. Blende fixieren
  3. Verschlusszeit korrigieren
  4. Stellen Sie den Weißabgleich mit einem weißen Blatt Papier ein
  5. Nehmen Sie alle Fotos aus dem gleichen Winkel auf
  6. Nehmen Sie alle Fotos am Sonnenmittag auf
Sie könnten künstliche Beleuchtung in Betracht ziehen, das würde das Verfahren vereinfachen. Ein Blitz sollte ausreichend sein, stellen Sie nur sicher, dass er sich an der gleichen Stelle befindet und mit Strom versorgt wird.
@Pearsonarphoto - interessante Idee, ich habe darüber nachgedacht, die Fotos tagsüber zu machen, aber vielleicht ist es sinnvoller, sie nachts ohne Mond zu machen.
Wenn Sie den Ratschlägen von Pearsonartphoto folgen, sollten Sie Verschluss, Blende und ISO manuell einstellen – stellen Sie Ihren Verschluss auf die Synchronisationszeit Ihres Blitzes ein (normalerweise 1/200 bis 1/320) und stellen Sie Blende und ISO auf niedrig ein wie sie gehen können, ohne dass die Blitzleistung ausgeht. Dadurch wird Ihre Umgebung so dunkel wie möglich - ein Vollmond sollte kein Problem sein (Mittagssonne andererseits ...). Für diese Situation wäre ein Blitz auf der Achse am besten, da er die wenigsten Schatten wirft .
@Evan Ich bin nicht einverstanden mit dem Blitz auf der Achse. Grund dafür: photo.stackexchange.com/questions/9531/… – Viel zu viel direkte Reflexion. Außer bei der Verwendung von Polarisatoren, wie ich dort beschrieben habe - aber dann muss man sicherstellen, dass die Ausrüstung gleich bleibt und der Weißabgleich korrekt durchgeführt wird. Polarisatoren ändern den Weißabgleich.
Ich glaube, die Werte in den Matrixzellen reichen von 0 bis 255, nicht von 1.
Kann eine Graukarte an einem festen Ort in die Aufnahme aufgenommen werden?
@mattdm ja, in jeder Aufnahme könnte eine Graukarte enthalten sein. Funktioniert das besser als eine weiße Karte?
@Simon Reflexionen sind ein berechtigtes Anliegen, aber das von Ihnen angegebene Beispiel ist das Worst-Case-Szenario: Ein flaches Objekt, das direkt auf die Kamera gerichtet ist. Hier ist eine Zimmerpflanze, die ich geschossen habe, beleuchtet von der Achse und von der Achse.
@David Eine Graukarte würde zwei Zwecken dienen: Farbbalance und Belichtungsfeinabstimmung. Eine weiße Karte sieht immer noch weiß aus, wenn Sie die Aufnahme überbelichten.
Chlorophyll ist im nahen Infrarot am hellsten: yale.edu/ceo/Documentation/rsvegfaq.html Darauf basierend gibt es Standardmaße für die "Grünheit" von Pflanzen, wie z. B. NDVI. Besorgen Sie sich daher, wenn möglich, eine Kamera, die das NIR-Band aufzeichnen kann.
@whuber Das ist ein guter Punkt, aber Kameras mit dem NIR-Sensor kosten >> 5.000 US-Dollar. Ich habe Zugang zu einer solchen Kamera und könnte sie zur Validierung verwenden. Wenn die Methode jedoch kostengünstig und an vielen Orten durchgeführt werden könnte, wären größere Datensätze aussagekräftiger als präzisere Messungen. Ich habe daran gedacht, die Tatsache zu nutzen, dass CCD-Sensoren in diesem Bereich empfindlich sind - dazu müsste der IR-Sperrfilter vor dem Sensor entfernt und dann zwei Bilder gemacht werden, eines mit IR-Sperre und eines mit IR-Passfilter .
@Simon Da ich keinen Zugang zu einem Maisfeld habe, habe ich diese beiden Bilder von meiner Zimmerpflanze gemacht. Blendung ist bei weitem nicht so schlimm, wie Sie vielleicht denken. Während ich das Bild rechts ansprechender finde, ist die Hälfte der Pflanze im Schatten verborgen.
@Evan Krall Ich stimme zu - Etwas, an das ich nicht gedacht habe, ist, dass Pflanzen normalerweise nicht flach sind und ihre Oberfläche zur Kamera zeigt. Die Messung sollte also nur robust gegen Schatten/Blendung sein :) Wie es scheint, führt kein Weg daran vorbei.

Antworten (3)

Wenn Sie die RAW-Dateien verarbeiten können, haben Sie ein Bayer-Pixel-Array, das aus RGRGRG- und GBGBGB-Zeilen (oder möglicherweise RGBGRGBG-Zeilen) besteht. Sie könnten alle R- und B-Pixel ignorieren, die G-Pixel summieren, die Quadratwurzel ziehen ( da es doppelt so viele grüne wie rote oder blaue Pixel gibt) und durch die Hälfte der G-Pixel teilen. Das sollte Ihnen den richtigen gewichteten Durchschnitt für "Grün" in Ihrem Foto geben. Sie könnten dann den Durchschnitt von Rot und Blau nehmen und Ihren Grünanteil aus allen drei Durchschnitten berechnen.

Um genauer zu sein, möchten Sie vielleicht die richtige Gewichtung für rote, grüne und blaue Sensorpixel berücksichtigen, da CMOS-Sensoren unterschiedliche Empfindlichkeiten für jede Lichtwellenlänge haben. Die Gewichte würden im Allgemeinen vom Sensor abhängen. Das wäre die einfache Vorgehensweise.

Um den Farbstich aufgrund der Tageszeit, verschiedener Arten von künstlicher Beleuchtung usw. zu berücksichtigen, ist es möglicherweise angemessener, jedes Foto in einem Tool wie Lightroom vorzuverarbeiten, um zuerst den Weißabgleich zu korrigieren, und dann Ihre Berechnung mit Standard-RGB-Pixelbildern durchzuführen. Im Gegensatz zur Verarbeitung von RAW-Sensordaten möchten Sie Ihre Berechnung basierend auf der „grünen Reinheit“ der Pixel gewichten, anstatt die grüne Komponente insgesamt zu mitteln. Je reiner grün ein Pixel ist, desto höher ist sein Gewicht im Vergleich zu Pixeln, die eher rot oder blau sind. Das Normalisieren des Weißabgleichs vor der Verarbeitung sollte die Notwendigkeit beseitigen, eine ansonsten ziemlich einfache Berechnung mit Tangenten zu komplizieren, die darauf ausgelegt sind, zig Faktoren wie Bewölkung, Tageszeit, Jahreszeit usw. zu berücksichtigen.

Möglicherweise möchten Sie dennoch große Bereiche mit nicht einfallenden Pixeln berücksichtigen, z. B. den Himmel. Ich kann Ihnen in diesem Bereich nicht wirklich helfen, ohne mehr darüber zu wissen, was Sie erreichen möchten. Die Grünheit eines "Foto" insgesamt würde wahrscheinlich am besten durch die Berechnung des Verhältnisses von Grün zu Rot und Blau erreicht werden, was "Himmel" -Pixel enthalten würde.

Was Ihre Vorgehensweise betrifft, sollte es selbstverständlich sein, dass wenn Sie die Bilder mit den gleichen Kameraeinstellungen, unter der gleichen Lichtart (gleiche Intensität und Farbtemperatur), gemessen an einer gemeinsamen Basislinie wie einer 18%-Graukarte, aufnehmen, es offensichtlich gehen wird ein langer Weg zur Normalisierung Ihrer Ergebnisse. Bei digitalen Aufnahmen können alle Diskrepanzen mit einer RAW-Verarbeitungssoftware und einem einfachen Tool zur Auswahl des Weißabgleichs korrigiert werden. Stellen Sie also sicher, dass Sie in RAW fotografieren.


Um etwas mehr Einblick in die Berechnung der "Grünheit" Ihrer Fotos zu geben. Es gibt offensichtlich einfache Möglichkeiten, wie die Berechnung der Gewichtung grüner Bayer-Pixel im Vergleich zu Blau und Rot oder die Berechnung der Grünreinheit im Verhältnis zur Rot/Blau-Reinheit von RGB-Pixeln. Möglicherweise haben Sie mehr Glück, wenn Sie in einen besser geeigneten Farbraum konvertieren, z. B. HSV ( Farbton/Sättigung/Wert , manchmal auch HSB genannt, ersetzt Wert durch Helligkeit) und Ihren Grünanteil mithilfe einer Kurve im HUE-Raum berechnen. (HINWEIS: HSL ist eine andere Art von Farbraum und wäre wahrscheinlich nicht ideal, um zu berechnen, wie viel „Grün“ in einem Foto ist, also würde ich HSV verwenden. Sie können hier mehr über diese Farbräume erfahren.) Reines Grün (unabhängig von Sättigung oder Wert) fällt bei einem Farbtonwinkel von 120° ab und fällt von dort ab, wenn Sie sich in Richtung Rot (bei 0°) oder in Richtung Blau (bei 240°) bewegen. Zwischen 240° und 360° wäre null Grün in einem Pixel, unabhängig von Sättigung oder Wert.

Farbtondiagramm - Grünreinheit in Farbtongraden
Abb. 1. Farbtondiagramm – Grüne Reinheit in Farbtongraden

Sie können die tatsächliche Gewichtungskurve an Ihre spezifischen Anforderungen anpassen, eine einfache Kurve könnte jedoch wie folgt aussehen:

range = 240
period = range * 2 = 240 * 2 = 480
scale = 360/period = 0.75
pureGreen = sin(scale * 120)

Der Wert für pureGreensollte 1.0 sein . Eine Rechenformel greennesskönnte dann folgendermaßen aussehen:

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

Das hueist der Farbgrad aus Ihrem HSV-Farbwert. Das radiusist die Hälfte, periodin der Grün bis zu einem gewissen Grad vorhanden ist. Der scalepasst die Sinuskurve an unsere Periode an, so dass der sin(scale * hue)Höhepunkt (ergibt 1,0) genau dort liegt, wo Sie reines Grün hätten (wobei diese Grünintensität ignoriert wird). Da der Betrag von greennessnur in der ersten Hälfte unserer Periode gültig ist, ist die Grünheitsberechnung nur gültig, wenn der Farbton größer als 0° und kleiner als 240° ist, und ist Null für jeden anderen Farbton.

Sie können die Gewichtung anpassen, indem Sie den Zeitraum anpassen, der von Ihnen definierte Bereich greenkönnte vorhanden sein (dh anstelle von 0 bis 240 können Sie 40 > hue > 200stattdessen eine Einschränkung wie festlegen) und alles außerhalb dieses Bereichs so definieren, dass er eine Grünheit von 0 hat Es sollte angemerkt werden, dass dies mathematisch genau sein wird, jedoch möglicherweise nicht ganz wahrnehmungsgenau. Sie können die Formel natürlich anpassen, um den Punkt pure greenmehr in Richtung Gelb zu verschieben (was zu wahrnehmungsgenaueren Ergebnissen führen könnte), die Amplitude der Kurve auf ein Plateau erhöhen und das Band von reinem Grün auf einen Farbtonbereich erweitern, anstatt auf einen einzigen Farbtonwert usw. Für die vollständige menschliche Wahrnehmungsgenauigkeit ein komplexerer Algorithmus, der in CIE XYZ und CIE L a b* verarbeitet wirdmöglicherweise Platzbedarf. (HINWEIS: Die Komplexität der Arbeit im XYZ- und Lab-Raum nimmt dramatisch über das hinaus, was ich hier beschrieben habe.)

Um die Grünheit eines Fotos zu berechnen, könnten Sie die Grünheit jedes Pixels berechnen und dann einen Durchschnitt erzeugen. Sie könnten dann den Algorithmus von dort nehmen und ihn für Ihre spezifischen Bedürfnisse optimieren.

Algorithmen zur Farbkonvertierung finden Sie bei EasyRGB , etwa den für RGB nach 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
}
+1 zur Rohverarbeitungstechnik. Die dcraw-Quelle wäre ein guter Ausgangspunkt cybercom.net/~dcoffin/dcraw/dcraw.c
Raw Processing würde die Berechnung des Grünpegels erleichtern, jedoch den Umgang mit Farbstichen erheblich komplexer machen.

GLOBE-Projekt ?

Verwenden Sie kein weißes Blatt Papier. Diese enthalten optische Aufheller, die einen Teil der UV-Strahlung in blaues Licht umwandeln und so zu Fehlbelichtungen führen. Aus diesem Grund gibt es kommerzielle Graukarten (wie von jrista vorgeschlagen).

Alle Fotos von genau der gleichen Stelle zu machen, ist sicherlich der richtige Ansatz. In Bezug auf Verschlusszeit und Blende sollten diese keine Rolle spielen. Die Verschlusszeit ändert die Farbe überhaupt nicht, die Blende verwischt das Bild, aber ich denke, dieser Effekt verschwindet sowieso, wenn Sie alle Pixelwerte aufsummieren. Ich würde eher versuchen, eine konstante Belichtung zu bekommen.

In Bezug auf den Unterschied zwischen getrübt und nicht getrübt möchten Sie vielleicht nur einige Tests durchführen. Wenn sich der wahre Grünanteil nicht schnell ändert (dh von heute auf morgen), dann sollte er das auch nicht tun, wenn man die Bilder betrachtet. Vielleicht hilft da ein empirischer Ansatz (zB wenn man feststellt, dass die Grünheit immer 10 % höher ist, wenn es bewölkt ist, könnte man das kompensieren).

es ist kein GLOBE-Projekt, aber es könnte in eines umgewandelt werden; danke für den Hinweis auf diese Seite.
Vielleicht auch für Sie interessant: Ich schreibe gerade ein Programm, um Videos zB von Webcams zu analysieren und Statistiken auszugeben (Green Share etc.). Soll in den nächsten Wochen fertig werden. phenocam.granjow.net
das hört sich brauchbar an. Haben Sie mit Wissenschaftlern zusammengearbeitet?
Noch nicht zu viel, da die Bewertungsmethoden der letzte Teil sein werden (und auch leicht geändert/hinzugefügt werden können). Aber es ist ein Projekt der ETH Zürich und soll auch dort zum Einsatz kommen. (Um genau zu sein, wird es zunächst von Gymnasiasten für ihr Globe-Projekt verwendet.)
  1. Ich würde vorschlagen, „RAW“ zu fotografieren und mit dem automatischen Weißabgleich der Kamera, aber ohne Gammakorrektur (dh farbausgeglichen, aber lineare Ausgabe) in 16-Bit-TIFF zu konvertieren. 16-Bit ermöglicht eine bessere Berechnung von Verhältnissen und Indizes in tiefen Schatten und Lichtern (dh kein Clipping). DCRAW kann dies tun, aber Ihre Kamera würde mit einer eigenen Software geliefert, die wahrscheinlich einfacher zu bedienen ist.

  2. Wenn Sie Indizes wollen, dann ist RGB wirklich der einzige nützliche Farbraum. Sie haben bereits den "Green Divergence"-Index (auch Excess Green Index genannt) erwähnt - dieser und der eng verwandte Green Leaf-Algorithmus funktionieren ziemlich gut. Wenn Sie eine farbbasierte Pixelklassifizierung durchführen möchten (dh veg versus nicht-veg), würde ich mir den L a b * -Farbraum eher als HSV / HSI ansehen. Es gibt tatsächlich eine ziemlich gute Demo auf der Mathworks-Website, die L a veranschaulichtb*-Analyse. Denkbar wäre eine Kombination der Klassifikation mit der Spektralanalyse zur Beantwortung der Fragen a) wie viele grüne Pixel gibt es und b) wie grün sind sie? Dies könnte nützlicher sein als nur ein Greenness-Index, der auch durch die spektrale Hintergrundqualität (Boden, Abfall usw.) beeinflusst würde, die sich auch im Laufe der Zeit ändern könnte. Sie haben eine Maisernte erwähnt, also nehme ich an, dass Sie die Kamera nach unten und nicht nach oben richten?

  3. Wenn Sie zwei Kameras hätten, könnten Sie nach unten gerichtete Bilder (zum Messen von Grün) mit nach oben gerichteten Bildern kombinieren, die die Vegetationsbedeckung messen. Aufwärts gerichtete Bilder wären für die Spektralanalyse nicht geeignet, und die Pixelklassifizierung würde auf dem Kontrast zwischen Himmel/Nicht-Himmel basieren, wobei wahrscheinlich nur der blaue Kanal des RGB-Bildes verwendet wird.

  4. Wenn Sie eine (tägliche?) Zeitreihe sammeln, können Sie die nach unten gerichteten Bilder in Bilder von „bewölkten Tagen“ und „sonnigen Tagen“ aufteilen und auf Verzerrungen prüfen. Sie könnten während der Rohverarbeitung mit der Farbbalance spielen, um eventuell vorhandene Verzerrungen zu korrigieren, oder einfach eine Serie neu skalieren, um sie an die andere anzupassen (halten Sie es einfach), vorausgesetzt, dass sich sonnige und bewölkte Tage abwechseln.

Habe Spaß.

Ein Farbplättchen mit roten, grünen und blauen Plättchen könnte sogar besser sein als eine graue Karte, wenn Sie diesen Weg gehen.