| Autor |
Beitrag |
F34r0fTh3D4rk
      
Beiträge: 5285
Erhaltene Danke: 29
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mi 15.07.09 10:46
Hallo,
Ich habe vor ein Bild nachträglich entweder einen warmen oder kalten Anstrich zu verpassen. Gibt es dazu schon fertige Ansätze?
Die Eigenschaften von warmen/kalten Farben/Bildern habe ich mir zunächst wie folgt überlegt:
Warm
- Mehr Rottöne
- Sattere Farben
- Weiche Kanten
Kalt
- Mehr Blautöne
- Weniger satte Farben
- Harte Kanten
Der Algorithmus sollte möglichst direkt anwendbar sein, sprich also entweder auf Pixelbasis oder als Filter.
Das mit den Kanten muss zwangsläufig über einen Schärfe/Unschärfe Filter gemacht werden.
Das Ganze soll wenn es fertig ist, in Echtzeit auf einem Shader laufen und parametrisierbar sein.
Die Kantenschärfe scheint fast vernachlässigbar.
mfg
Zuletzt bearbeitet von F34r0fTh3D4rk am Fr 15.10.10 15:07, insgesamt 1-mal bearbeitet
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 15.07.09 12:09
Kühle farben sind rot und orange und warme farben sind blau und violett ... Zumindest rein physikalisch
Einen Unschärfe-Filter erhälst Du für einen Filter mit einer positiven Matrix-Summe; eine Schärfung für Matrix-Summe 0.
Für die Farbanpassung bietet sich eine Filter-Anwendung im HLS-Raum an, wobei Du den Sättigungskanal mit einem Sättigungsverstärkungsfaktor multiplizieren könntest.
Für die kühle\wärme der Farben könntest Du den Hue-Kanal bearbeiten (verschieben), wobei Du hier eine Funktion nehmen solltest, die auf den Wertebereich 0..1 oder -1..1 beschränkt. Die Error-Funktion oder der Arcostangenz bietet sich dafür an. Einfach den bestehenden Wert mit der Umkehrfunktion transformieren, eine Verschiebung berechnen und wieder transformieren.
Somit bliebe bei der Bearbeitung ein Pixel-Filter (z.B. Gauss) zu implementieren sowie ein Pixel-Shader, der RGB nach HSL konvertiert, folgendes berechnet und anschließend HLS wieder nach RGB transformiert:
Delphi-Quelltext 1: 2:
| H := 0.5 + 1/Pi * arctan(tan(Pi * (H - 0.5))+Y); S := X * S; |
Ungetestet, könnte aber funktionieren ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
F34r0fTh3D4rk 
      
Beiträge: 5285
Erhaltene Danke: 29
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mi 15.07.09 13:07
Mit deiner Physik hast du leider nicht so ganz Recht. Blau und Violett sind am Energiereichsten, aber nicht am "wärmsten". Das Spektrum der Wärmestrahlung liegt weitestgehend im Infrarotbereich.
B2T: Ja, genau so hab ich das bisher gemacht. Meine Frage war nun, ob es nicht so etwas wie ein standardisiertes Verfahren oder eine Formel gibt. Ich weiß nämlich nicht, in wie fern meine Defintion von "Wärme" der Wirklichkeit entspricht und es nicht vielleicht schönere Verfahren gibt, das realistischer Umzusetzen.
mfg
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 15.07.09 13:16
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
F34r0fTh3D4rk 
      
Beiträge: 5285
Erhaltene Danke: 29
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mi 15.07.09 13:25
Ne richtige Demo hab ich noch nicht, aber was ich mir vorstelle ist eine Art Schieber à la:
Quelltext 1: 2:
| <---------|---------> Kalt Normal Warm |
Wobei Normal <-> Unverändert.
mfg
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Mi 15.07.09 18:59
So einfach ist das leider nicht, weil die Farbtemperatur kein wirklich gutes Maß für den Farbton ist - man gucke nur mal auf die Purpurlinie, deren Farben nicht ins Spektrum passen.
Du könntest natürlich sowas machen: Neu_RGB = R_alt + 0.8 * G_alt + 0.8 * B_alt Das sollte einen Rotstich ergeben.
Im HSB-system isses schwieriger, als es zunächst aussieht: "Einfach den Farbton in Richtung Rot verschieben" ist leichter gesagt als getan: Was passiert mit Grün, Türkis und Pink?
Oder du berechnest zu jedem Pixel den Grauwert, und fügst diese Menge an Rot gewichtet dazu, also
R_neu = Grauwert * x + (1-x) * R_alt
G_neu = (1-x) * G_alt
...
Analog eben mit Blau für kalte Farben.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 15.07.09 19:49
Wenn Du willst, kannst Du auch L*a*b hernehmen; musst dann aber RGB irgendwie dorthin konvertieren, wofür Du die Eigenschaften des Monitors kennen müsstest (z.B. dessen Farbtemperatur und Weißpunkt).
Mein Vorschlag bzgl. HSL war auch deshalb gewählt, weil es L*a*b in gewisser Weise ähnlich ist, auch wenn in HSL keine physikalische, sondern eine logische Abbildung der Farben stattfindet, was dazu führt, dass bei der genannten Methode eine nichtlineare Verzerrung der Farben stattfindet. Bei L*a*b ist diese zwar auch nicht linear, aber zumindest näher am normalen Sehempfinden. Zudem zeigt L*a*b recht gut, dass wenn man alle Farben zu einem blau verschieben will grün über die Stufe türkis und ccyan geht; also im Wesentlichen, was bei meiner Technik auch geschehen würde.
Wo HSL allerdings falsch liegt ist die von dir erwähnte Purpurlinie. Für diese macht mein vorschlag den Fehler, dass über grün statt magenta transformiert wird. Die angegebene Hue-Transformationsformel war allerding auch nur ein Beispiel. Mit etwas arithmetik kann man auch die Farbscheibe von HSL hernehmen und sich via Vektorrechnung die neuen Farbrichtungen ausrechnen - dann kann man aber auch fast schon L*a*b nehmen, weil die Vorhersagen dort genauer wären.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|