Wie würde ich meine Spiegelreflexkamera verwenden, um die "Grünheit" eines Fotos zu messen?

13

Hintergrund

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

Ich möchte diese Informationen verwenden, um ein objektives Maß für den Grünanteil in einem Foto zu erhalten, da ich versuchen möchte, den Grünanteil mit dem Pflanzenwachstum in Beziehung zu setzen (stellen Sie sich ein Bild pro Tag eines Maisfeldes vor).

Frühere Arbeiten in dieser Richtung hatten einige Erfolge bei der Berechnung eines Index von Grün entweder als

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

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

Beachten Sie, dass ich kein 'absolutes' Maß für die Grünheit suche. Die Größe und Verteilung der Zahl spielt keine Rolle - es muss nur ein konsistentes relatives Maß für die Grünheit angegeben werden.

Frage

Kann ich meine Spiegelreflexkamera verwenden, um ein aussagekräftiges Maß für Grün zu erhalten, das mit einem oder allen der folgenden Faktoren nicht übereinstimmt:

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

Aktueller Status

Ich habe die folgenden Ideen entwickelt, bin mir aber nicht sicher, welche notwendig wären oder welche sich nicht auf das Verhältnis von Grün / (Rot + Blau) auswirken würden.

  1. Machen Sie ein Bild von einem weißen Plastikstück und verwenden Sie dieses Bild, um die anderen Werte zu normalisieren
  2. Blende fixieren
  3. Verschlusszeit festlegen
  4. Stellen Sie den Weißabgleich mit einem weißen Blatt Papier ein
  5. Nehmen Sie alle Fotos aus demselben Winkel auf
  6. Machen Sie alle Fotos um die Mittagszeit
David LeBauer
quelle
1
Sie könnten künstliche Beleuchtung in Betracht ziehen, dies würde das Verfahren vereinfachen. Ein Blitz sollte ausreichend funktionieren, stellen Sie jedoch sicher, dass er sich an der gleichen Stelle befindet und mit der gleichen Leistung ausgestattet ist.
PearsonArtPhoto
@Pearsonarphoto - interessante Idee, ich habe überlegt, die Fotos tagsüber zu machen, aber vielleicht ist es sinnvoller, sie nachts ohne Mond zu machen.
David LeBauer
1
Wenn Sie den Anweisungen von Pearsonartphoto folgen, sollten Sie Verschluss, Blende und ISO manuell einstellen. Stellen Sie die Synchronisationszeit Ihres Blitzes (in der Regel 1/200 bis 1/320) ein und stellen Sie die Blende und die ISO auf niedrig wie sie gehen können, ohne die Blitzleistung ausgehen. Dadurch wird Ihre Umgebung so dunkel wie möglich - ein Vollmond sollte kein Problem sein (Mittagssonne auf der anderen Seite ...). In dieser Situation ist ein Blitz auf der Achse am besten, da er die wenigsten Schatten wirft .
Evan Krall
2
@Evan Ich bin nicht einverstanden mit dem Achsenblitz. Grund dafür ist: photo.stackexchange.com/questions/9531/… —Zuviel 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.
Simon A. Eugster
2
Chlorophyll ist im nahen Infrarot am hellsten: yale.edu/ceo/Documentation/rsvegfaq.html Darauf aufbauend gibt es Standardmaße für die Pflanzen "grün", wie z. B. NDVI. Wenn möglich, besorgen Sie sich also eine Kamera, die das NIR-Band aufzeichnet.
Whuber

Antworten:

12

Wenn Sie die RAW-Dateien verarbeiten können, erhalten Sie ein bayer-Pixel-Array, das aus RGRGRG- und GBGBGB-Zeilen (oder möglicherweise RGBGRGBG-Zeilen) besteht. Sie können alle R- und B-Pixel ignorieren, die G-Pixel summieren und die Quadratwurzel ziehen ( da es doppelt so viele grüne Pixel gibt wie rote oder blaue) und dividiere durch die Hälfte der Anzahl von G Pixeln. 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ünen Prozentsatz aus allen drei Durchschnitten berechnen.

Um genauer zu sein, sollten Sie die richtige Gewichtung für rote, grüne und blaue Sensorpixel berücksichtigen, da CMOS-Sensoren für jede Lichtwellenlänge unterschiedliche Empfindlichkeiten aufweisen. Die Gewichte hängen im Allgemeinen vom Sensor ab. Das wäre der einfache Ansatz.

Um den Farbstich aufgrund der Tageszeit, verschiedener Arten von künstlichem Licht usw. zu berücksichtigen, ist es möglicherweise besser, jedes Foto in einem Tool wie Lightroom vorzuverarbeiten, um zuerst den Weißabgleich zu korrigieren, und dann die Berechnung für Standard-RGB-Pixelbilder durchzuführen. Im Gegensatz zur Verarbeitung von RAW-Sensordaten sollten Sie Ihre Berechnung auf der Grundlage der "grünen Reinheit" der Pixel gewichten, anstatt die grüne Komponente insgesamt zu mitteln. Je reiner ein Pixel grün ist, desto höher ist sein Gewicht im Vergleich zu den Pixeln, die roter oder blauer sind. Durch die Normalisierung des Weißabgleichs vor der Verarbeitung sollte die Notwendigkeit entfallen, eine ansonsten recht einfache Berechnung mit Tangenten zu erschweren, die zahlreiche Faktoren wie Wolkendecke, Tageszeit, Jahreszeit usw. berücksichtigen.

Möglicherweise möchten Sie weiterhin große Bereiche nicht einfallender Pixel berücksichtigen, z. B. den Himmel. Ich kann Ihnen in diesem Bereich nicht wirklich weiterhelfen, ohne genau zu wissen, was Sie erreichen wollen. Das Grün einer "Fotografie" insgesamt würde wahrscheinlich am besten durch Berechnen des Verhältnisses von Grün zu Rot und Blau erreicht, das "Himmel" -Pixel einschließen würde.

Für Ihr Verfahren sollte es selbstverständlich sein, dass, wenn Sie die Bilder mit den gleichen Kameraeinstellungen aufnehmen, diese mit dem gleichen Leuchtmittel (gleiche Intensität und Farbtemperatur), gemessen an einer gemeinsamen Grundlinie wie einer 18% -Graukarte, aufgenommen werden Ein langer Weg zur Normalisierung Ihrer Ergebnisse. Mit der RAW-Verarbeitungssoftware und einem einfachen Weißabgleich-Auswahlwerkzeug können etwaige Diskrepanzen mit Digital korrigiert werden. Stellen Sie also sicher, dass Sie mit RAW aufnehmen.


Um mehr Einblick in die Berechnung des "Grüns" Ihrer Fotos zu erhalten. Es gibt offensichtlich einfache Methoden, wie das Berechnen des Gewichts von Grün-Bayer-Pixeln gegenüber Blau und Rot oder das Berechnen der Grün-Reinheit in Bezug auf die Rot / Blau-Reinheit von RGB-Pixeln. Möglicherweise haben Sie mehr Glück, wenn Sie in einen geeigneteren Farbraum konvertieren, z. B. HSV ( Farbton / Sättigung / Wert , manchmal als HSB bezeichnet, wobei Wert durch Helligkeit ersetzt wird), und Ihren Grünanteil mithilfe einer Kurve im Farbtonbereich 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 enthalten ist. Daher würde ich HSV verwenden. Weitere Informationen zu diesen Farbräumen finden Sie hier.) Reines Grün (unabhängig von Sättigung oder Wert) fällt in 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 ° befindet sich unabhängig von Sättigung oder Wert kein Grün in einem Pixel.

Hue Plot - Grüne Reinheit in Hue Degrees
Abb. 1: Farbtondiagramm - Grüne Reinheit in Farbtönen

Sie können die tatsächliche Gewichtungskurve an Ihre speziellen Bedürfnisse anpassen. Eine einfache Kurve könnte jedoch etwa so 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 Berechnungsformel greennesskönnte dann wie folgt lauten:

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

Dies hueist der Grad der Farbe aus Ihrem HSV-Farbwert. Dies radiusist die Hälfte, periodin der Grün zu einem gewissen Grad vorhanden ist. Das scalepasst die Sinuskurve an unsere Periode an, so dass sin(scale * hue)Spitzenwerte (1,0) genau dort angezeigt werden, wo Sie reines Grün hätten (wobei die Intensität des Grüns ignoriert wird). Da der Betrag von greennessnur in der ersten Hälfte unseres Zeitraums gültig ist, gilt die Grünberechnung nur, wenn der Farbton größer als 0 ° und kleiner als 240 ° ist, und seine Null für jeden anderen Farbton.

Sie können die Gewichtung anpassen, indem Sie den Zeitraum anpassen, den Bereich, in dem Sie greenmöglicherweise angeben (dh statt 0 bis 240 können Sie 40 > hue > 200stattdessen eine Einschränkung festlegen), und alle Elemente außerhalb dieses Bereichs so definieren, dass sie eine Graustufe von 0 aufweisen Es sollte beachtet werden, dass dies mathematisch genau ist, jedoch möglicherweise nicht vollständig 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 kann), die Amplitude der Kurve zu einem Plateau zu erhöhen und den Streifen reinen Grüns auf einen Farbtonbereich anstatt auf einen einzigen zu erweitern Farbtonwert usw. Für eine vollständige Wahrnehmungsgenauigkeit des Menschen ein komplexerer Algorithmus, der in CIE XYZ und CIE L a b * verarbeitet wird.Platz kann erforderlich sein. (HINWEIS: Die Komplexität der Arbeit im XYZ- und Lab-Bereich steigt dramatisch über das hier Beschriebene hinaus.)

Um die Graustufe eines Fotos zu berechnen, können Sie die Graustufe jedes Pixels berechnen und dann einen Durchschnitt erstellen. Sie könnten dann den Algorithmus von dort nehmen und ihn für Ihre spezifischen Bedürfnisse anpassen.

Bei EasyRGB finden Sie Algorithmen für die Farbkonvertierung , z. B. die für RGB in 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
quelle
1
+1 auf die rohe Verarbeitungstechnik. Die dcraw Quelle wäre ein guter Ausgangspunkt sein cybercom.net/~dcoffin/dcraw/dcraw.c
Bitte lesen Profil
1
Die Rohverarbeitung würde die Berechnung des Grünpegels vereinfachen, den Umgang mit Farbstichen jedoch erheblich erschweren.
jrista
3

GLOBE-Projekt ?

Verwenden Sie kein weißes Blatt Papier. Diese enthalten optische Aufheller, die UV-Strahlung in blaues Licht umwandeln und eine falsche Belichtung verursachen. Aus diesem Grund gibt es kommerzielle Graycards (wie von jrista vorgeschlagen).

Das Aufnehmen aller Fotos von genau demselben Ort ist mit Sicherheit die richtige Vorgehensweise. In Bezug auf Verschlusszeit und Blende sollte dies keine Rolle spielen. Die Verschlusszeit ändert die Farbe überhaupt nicht, die Blende verwischt das Bild, aber ich denke, dieser Effekt verschwindet trotzdem, wenn Sie alle Pixelwerte zusammenfassen. Ich würde lieber versuchen, eine konstante Belichtung zu erhalten.

In Bezug auf den Unterschied zwischen bewölkt und nicht bewölkt möchten Sie möglicherweise nur einige Tests durchführen. Wenn sich der wahre Grünanteil nicht schnell ändert (dh von heute bis morgen), sollte dies auch bei der Betrachtung der Bilder nicht der Fall sein. Vielleicht kann ein empirischer Ansatz hier Abhilfe schaffen (z. B. wenn Sie feststellen, dass der Grünanteil bei Bewölkung immer um 10% höher ist, können Sie dies ausgleichen).

Simon A. Eugster
quelle
Es ist kein GLOBE-Projekt, aber es könnte zu einem werden. Vielen Dank für den Hinweis auf diese Website.
David LeBauer
Vielleicht auch für Sie interessant: Ich schreibe gerade ein Programm zur Analyse von Videos, z. B. von Webcams, und zur Ausgabe von Statistiken (grüner Anteil usw.). Sollte in den kommenden Wochen fertig sein. phenocam.granjow.net
Simon A. Eugster
das klingt nützlich. Haben Sie mit Wissenschaftlern zusammengearbeitet?
David LeBauer
Noch nicht zu viel, da die Bewertungsmethoden der letzte Teil sein werden (und auch leicht geändert / hinzugefügt werden können). Es ist aber ein Projekt der ETH Zürich und wird auch dort eingesetzt. (Um genau zu sein, wird es anfangs von Schülern für ihr Globe-Projekt verwendet.)
Simon A. Eugster
1
  1. Ich würde vorschlagen, 'RAW' aufzunehmen und unter Verwendung des automatischen Weißabgleichs der Kamera, aber ohne Gammakorrektur (dh Farbausgleich, aber lineare Ausgabe) in 16-Bit-TIFF umzuwandeln. 16-Bit ermöglicht eine bessere Berechnung von Verhältnissen und Indizes in tiefen Schatten und Lichtern (dh ohne Übersteuerung). DCRAW kann dies, aber Ihre Kamera wird mit einer eigenen Software geliefert, die wahrscheinlich einfacher zu bedienen ist.

  2. Wenn Sie Indizes möchten, ist RGB der einzig nützliche Farbraum. Sie haben bereits den "Green Divergence" -Index (auch als "Excess Green Index" bezeichnet) erwähnt - dieser und der eng damit verbundene Green Leaf-Algorithmus funktionieren ziemlich gut. Wenn Sie eine farbbasierte Pixelklassifizierung durchführen möchten (dh Gemüse im Vergleich zu Nicht-Gemüse), würde ich eher den L a b * -Farbraum als HSV / HSI betrachten. Es gibt tatsächlich eine ziemlich gute Demo auf der Mathworks-Website, die L a veranschaulichtb * Analyse. Eine Klassifizierung könnte möglicherweise mit einer Spektralanalyse kombiniert werden, um die Fragen zu beantworten: a) wie viele grüne Pixel gibt es und b) wie grün sind sie? Dies ist möglicherweise nützlicher als nur ein Grünindex, der auch von der spektralen Hintergrundqualität (Boden, Abfall usw.) beeinflusst wird, die sich ebenfalls mit der Zeit ändern kann. 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 (Messung des Grüns) mit nach oben gerichteten Bildern kombinieren, die die Vegetationsbedeckung messen. Aufwärtsbilder wären für die Spektralanalyse nicht geeignet, und die Pixelklassifizierung würde auf dem Kontrast zwischen Himmel und Nichthimmel basieren, wobei wahrscheinlich nur der blaue Kanal des RGB-Bildes verwendet wird.

  4. Wenn Sie eine (tägliche?) Zeitreihe sammeln, können Sie die Bilder nach unten in Bilder mit bewölktem Tag und Bilder mit sonnigem Tag unterteilen und auf Abweichungen prüfen. Sie können während der Rohverarbeitung mit der Farbbalance spielen, um etwaige Abweichungen zu korrigieren, oder einfach eine Serie neu skalieren, um sie an die andere anzupassen (halten Sie es einfach), vorausgesetzt, sonnige und bewölkte Tage liegen dazwischen.

Habe Spaß.

Fischauge
quelle
Eine Farbkachel mit roten, grünen und blauen Kacheln ist möglicherweise sogar besser als eine Graukarte, wenn Sie diesen Weg gehen.
Fischauge