Beiträge von mkoch im Thema „Rotverschiebung im RGB Farbraum“

    Ich habe jetzt eine brauchbare Lösung für 60° Verschiebung gefunden. Die folgenden Abbildungen sollen gelten:
    0,0,0 --> 0,0,0 (schwarz bleibt schwarz)
    1,0,1 --> 0,0,1 (violett wird blau)
    0,0,1 --> 0,1,1 (blau wird cyan)
    0,1,1 --> 0,1,0 (cyan wird grün)
    0,1,0 --> 1,1,0 (grün wird gelb)
    1,1,0 --> 1,0,0 (gelb wird rot)
    1,0,0 --> 0,0,0 (rot wird schwarz)
    1,1,1 --> 1,1,0 (weiss wird gelb)
    Das kann man das als *.cube Color-Look-Up-Table darstellen, und zwar nimmt man die kleinste mögliche Tabelle die nur die 8 Eckpunkte des RGB-Würfels enthält.
    Die CLUT kann man dann in FFmpeg problemlos auf beliebige Bilder oder Videos anwenden. Ich habe es im Detail hier in Kapitel 2.82 beschrieben:
    http://www.astro-electronic.de/FFmpeg_Book.pdf


    Gruß
    Michael

    <blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">Zitat:<hr height="1" noshade id="quote"><i>Original erstellt von: nemausa</i>
    bei den extremen Farben im Spektrum sieht das Ergebnis nicht so optimal aus. [8)]
    <hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">


    ja, bei schwacher Verschiebung in Richtung rot ist zu wenig gelb und grün im Ergebnis.


    Gruß
    Michael

    Hallo Ronny,


    <blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">Zitat:<hr height="1" noshade id="quote"><i>Original erstellt von: nemausa</i>
    ich hab mir mal ein paar Formeln überlegt und gleich ausprobiert:
    <hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">


    Wie sehen denn deine Formeln aus?


    Gruß
    Michael


    P.S. Wie Konrad schon vorgeschlagen hat, wäre es schön wenn du deinen Algorithmus mal auf ein geeignetes Testbild anwenden könntest, z.B. https://de.wikipedia.org/wiki/…/media/Datei:HSV_cone.png


    P.P.S. oder noch besser dieses hier: http://3dlutcreator.ru/materials/HueSatLuma_Circle_24.png

    Hallo Peter,


    <blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">Zitat:<hr height="1" noshade id="quote"><i>Original erstellt von: PeterSurma</i>
    Dein Hue-Problem liegt daran, dass Hue keine Physik ist (!) sondern eine pure Konvention wie Farben in eine menschliche Systematik gebracht werden (Hue). <hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">


    Ja, das ist mir klar.


    <blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">Zitat:<hr height="1" noshade id="quote"><i>Original erstellt von: PeterSurma</i>
    Du kannst es - wenn Du es wissenschaftlich machen willst (die Frage ist, willst Du das ?) - nicht mit einfacher Hue-Drehung machen.
    <hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">


    Sagen wir mal es soll halbwegs wissenschaftlich sein. Ich bin bereit gewisse Vereinfachungen zuzulassen. Zum Beispiel wäre ich bereit, die Wellenlängen-Abhängigkeit der Rotverschiebung zu vernachlässigen.
    Aber die Variante die Konrad weiter oben vorgeschlagen hat (einfach die grün- und blau Kanäle abschwächen) das ist mir eine zu starke Vereinfachung.


    Ich formuliere das Problem nochmal mit anderen Worten:


    Gegeben ist ein RGB Bild mit beliebigem Inhalt. Das kann ein astronomisches Objekt sein, aber es könnte auch was anderes sein.
    Gesucht ist ein Algorithmus, der dieses Bild in Richtung rot verschiebt. Die Weite der Verschiebung soll einstellbar sein von 0 bis mindestens 120°, bezogen auf den Farbkreis. 120° wäre der Fall, wenn aus grün rot wird.
    Insbesondere soll der Algorithmus folgende Fälle korrekt abbilden:
    0,0,0 --&gt; 0,0,0 (schwarz bleibt schwarz)
    Bei 60° Verschiebung:
    1,0,1 --&gt; 0,0,1 (violett wird blau)
    0,0,1 --&gt; 0,1,1 (blau wird cyan)
    0,1,1 --&gt; 0,1,0 (cyan wird grün)
    0,1,0 --&gt; 1,1,0 (grün wird gelb)
    1,1,0 --&gt; 1,0,0 (gelb wird rot)
    1,0,0 --&gt; 0,0,0 (rot wird schwarz)
    1,1,1 --&gt; 1,1,0 (weiss wird gelb ?)
    Bei 120° Verschiebung:
    1,0,1 --&gt; 0,1,1 (violett wird cyan)
    0,0,1 --&gt; 0,1,0 (blau wird grün)
    0,1,1 --&gt; 1,1,0 (cyan wird gelb)
    0,1,0 --&gt; 1,0,0 (grün wird rot)
    1,1,0 --&gt; 0,0,0 (gelb wird schwarz)
    1,0,0 --&gt; 0,0,0 (rot wird schwarz)
    1,1,1 --&gt; 1,1,0 (weiss wird gelb ?)

    Gruß
    Michael


    P.S. Es würde auch genügen, wenn der Algorithmus nur von 0 bis 60° funktioniert. Für größere Verschiebungen könnte man ihn ja mehrfach anwenden.

    <blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">Zitat:<hr height="1" noshade id="quote"><i>Original erstellt von: fastride</i>
    <br />RGB kann die Summe aus Rot und Grün nicht von Gelb unterscheiden. In der Realität hätten alle 3 eine unterschiedliche Wellenlänge!


    Daher wird sowas immer eine Näherung bleiben.
    <hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">


    Fakt ist aber, dass man mit Hue-Rotation den Farbkreis um beliebige Winkel verdrehen kann. Es ist problemlos möglich, z.B. grün nach gelb zu verschieben. Wenn da nur nicht das blöde Problem wäre, dass bei der Rotation das rote Licht (das eigentlich verschwinden soll) am blauen Ende des Spektrums wieder auftaucht.


    Gruß
    Michael

    Hallo Konrad,


    <blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">Zitat:<hr height="1" noshade id="quote"><i>Original erstellt von: fastride</i>
    Jetzt schaust du dir für jede RGB Farbe, wie intensiv sie im realen Sonnenspektrum liegt und berechnest die gewünschte Verstärkung für Rot und die entsprechende Abschwächung für Grün und Blau.
    <hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">


    Diesen Satz habe ich nicht verstanden. Kannst du das in Form eines Algorithmus ausdrücken?


    Gruß
    Michael

    <blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">Zitat:<hr height="1" noshade id="quote"><i>Original erstellt von: fastride</i>
    Aber weil das zu aufwändig ist würd ich für rein künstlerische Zwecke folgendes machen:


    Rotkanal bleibt identisch


    Dann machtst du das RGB Bild 20% (mehr oder weniger) dunkler und zerlegst es nochmal in die 3 Kanäle. Davon nimmst du den Grün-anteil


    Dann machst du das RGB nochmal 20% dunkler und wieder in 3 Kanäle teilen, und jetzt nur den Blau anteil behalten.


    Jetzt addierst du 100%R 80%G und 60%B wieder zu einem RGB und hast sowas, wie eine Rotverchiebung.
    <hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">


    Mit anderen Worten:
    Rr = R
    Gr = G * 0.8
    Br = B * 0.6


    Da hast du aber keine Verschiebung durchgeführt. Wenn ein Punkt vorher grün war, dann ist er hinterher immer noch grün, nur etwas dunkler.


    Gruß
    Michael

    Hallo Konrad,


    <blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">Zitat:<hr height="1" noshade id="quote"><i>Original erstellt von: fastride</i>
    Entweder du schreibst ein kleines Programm oder du hast MathCad oder Mathematica zur Hand, dort kannst Du Rechenoperationen direkt am RGB Bild machen und sogar als Funktion definieren.
    <hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">


    Ich kann das in FFmpeg berechnen. Mir fehlen nur die passenden Formeln.


    <blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">Zitat:<hr height="1" noshade id="quote"><i>Original erstellt von: fastride</i>
    Also zuerst jeder Punkt nach Wellenlänge, dann um gewünschten Betrag verschieben und dann wieder zurück zu RGB.
    <hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">


    So einfach geht das nicht. Was machst du, wenn der Punkt weiss ist?


    Gruß
    Michael

    Hallo Peter,


    oh, eine Antwort auf die Frage die ich vor 3 Monaten gestellt habe!
    Ich hatte inzwischen schon einige Versuche unternommen, ein RGB Bild ins rote zu verschieben. Aber das Problem ist nach wie vor ungelöst.


    <blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">Zitat:<hr height="1" noshade id="quote"><i>Original erstellt von: PeterSurma</i>
    Streng genommen musst Du die Filterempfindlichkeitsfunktion in Abhängigkeit von der Wellenlänge Deiner Aufnahmefilter kennen (z.B. die Deiner Bayermatrix Pixel in RGB).
    Dann brauchst Du das Spektrum Deiner Objektquellen als Funktion der Wellenlänge.
    <hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">


    Nehmen wir mal den einfachsten Fall an: Die Filterfunktionen sind rechteckig, und das Spektrum der Lichtquellen ist gleichmässig verteilt.
    R,G,B sind die Komponenten des gegebenen Bildes, und daraus möchte man nun die Komponenten Rr,Gr,Br des rotverschobenen Bildes berechnen:
    Rr = R * (1 - a) + G * b
    Gr = G * (1 - b) + B * c
    Br = B * (1 - c)
    Dabei ist a der Anteil der am langwelligen Ende ins infrarot verschoben wird, b ist der Anteil der von grün nach rot verschoben wird, und c ist der Anteil der von blau nach grün verschoben wird.


    Ich habe das ausprobiert (mit FFmpeg) aber das Ergebnis sieht nicht gut aus. Mal angenommen, die ursprüngliche Farbe ist grün, also R=0, G=1, B=0. Egal wie ich die Werte a,b,c wähle, die resultierende Farbe kann niemals gelb werden. Denn gelb wäre R=1, G=1, B=0.


    Das einzige was funktioniert ist der triviale Fall für eine sehr große Verschiebung:
    Rr = G
    Gr = B
    Br = 0


    Das Ergebnis muss nicht wissenschaftlich exakt sein. Es soll nur gut aussehen. Also bei einer bestimmten Rotverschiebung sollte aus grün gelb werden.


    Es gibt in FFmpeg natürlich auch die Möglichkeit, den ganzen Farbkreis zu rotieren (Hue Funktion). Das hat zwar den Vorteil dass aus grün gelb werden kann, aber es hat den Nachteil dass das rote Licht am langwelligen Ende des Spektrums nicht verloren geht, sondern ins blaue rotiert wird. Das ergibt physikalisch keinen Sinn.


    Gruß
    Michael