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
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.
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:
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.
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.
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 pureGreen
sollte 1.0 sein . Eine Rechenformel greenness
könnte dann folgendermaßen aussehen:
sin(scale * hue) } 0 > hue > 240
greenness =
0 } 240 <= hue <= 360 || hue == 0
Das hue
ist der Farbgrad aus Ihrem HSV-Farbwert. Das radius
ist die Hälfte, period
in der Grün bis zu einem gewissen Grad vorhanden ist. Der scale
passt 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 greenness
nur 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 green
könnte vorhanden sein (dh anstelle von 0 bis 240 können Sie 40 > hue > 200
stattdessen 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 green
mehr 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
}
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).
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.
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?
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.
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ß.
PearsonArtPhoto
David LeBauer
Eva Krall
Simon A. Eugen
Jap
mattdm
David LeBauer
Eva Krall
Eva Krall
whuber
David LeBauer
Eva Krall
Simon A. Eugen