Was ist der beste Weg, um zwei Farben mitteln, das einen linearen Gradienten definieren?

StackOverflow https://stackoverflow.com/questions/649454

  •  19-08-2019
  •  | 
  •  

Frage

Wenn ich zwei Farben haben durch ihre RGB-Werte definiert sind, können im Durchschnitt ich die Rot, Grün und Blau Werte und dann kombinieren, um eine dritte Farbe zu definieren, wie eine visuelle Durchschnitt der beiden aussieht?

dh NewColor = (R1 + R2) / 2, (G1 + G2) / 2, (B1 + B2) / 2

EDIT1: Danke für alle Antworten. Für meine aktuellen Bedürfnisse, beschäftige ich mich nur mit Farbpaare, die Schattierungen der gleichen Farbe sind so denke ich, dass sie im Durchschnitt arbeiten. Aber ich werde versuchen, Lab Farbraum zu konvertieren, um sicherzustellen, dass Annahme wahr ist und die Technik wird in der Zukunft nützlich sein.

EDIT2: Hier meine Ergebnisse FWIW sind. Color1 und Farbe2 sind meine zwei Farben und die beiden mittleren Spalten sind die Ergebnisse in L durchschnittlich a b Raum und RGB im Durchschnitt sind. In diesem Fall gibt es nicht viel Unterschied zwischen den beiden Farben und so die Unterschiede in der Ausgabe von den Mittelungstechniken subtil ist.

visueller Vergleich der Farbe Mittelungstechniken

War es hilfreich?

Lösung

Werfen Sie einen Blick auf die Antworten auf diese Frage .

Im Grunde wollen Sie die Farben in etwas umwandeln genannt Lab-Raum und finden ihre Durchschnitt in diesem Raum.

Lab-Raum ist eine Art und Weise Farben darstellt, in dem Punkte, die diejenigen, die nahe beieinander sind, die einander auf den Menschen ähnlich aussehen.

Andere Tipps

Mehrere Antworten vorschlagen Lab-Farbraum zu konvertieren -., Die für komplexere Farbmanipulation wahrscheinlich ein guter Ansatz ist

Aber wenn Sie einfach eine schnelle Art und Weise müssen die durchschnittlich zwei Farben zu nehmen, kann dies in dem RGB-Raum durchgeführt werden. Sie müssen nur einen Vorbehalt in den Sinn: Sie müssen die RGB-Werte quadrieren, bevor sie im Durchschnitt, und dann nehmen Sie die Wurzel des Ergebnisses. (Wenn Sie einfach den Durchschnitt nehmen, wird das Ergebnis neigen zu dunkel zu sein.)

Wie folgt aus:

NewColor = sqrt((R1^2+R2^2)/2),sqrt((G1^2+G2^2)/2),sqrt((B1^2+B2^2)/2)

Hier ist eine große vid was erklärt, warum diese Methode effizient ist: https://www.youtube.com/watch?v = LKnqECcg6Gw

Averaging in HSL-Farbraum könnten bessere Ergebnisse erzielen.

Ich weiß nicht, ob ein einfacher Durchschnitt der Komponenten unter die „beste“ ist aus einem Wahrnehmungs Sicht (dh für einen Psychologen wie eine Frage klingt), aber hier sind ein paar Beispiele einfache Komponente Lungs verwenden.

alt text

Die rot-Senf-Grün ist hässlich, aber die Interpolation scheint vernünftig genug.

Ja. Sie können zwei Farben im Durchschnitt zusammen so. Es ist der Ansatz von OpenGL verwendeten Farben zu vermischen (beispielsweise in MIP-Tabellen für die Darstellung von entfernten Objekten zu schaffen, oder ein 50% transparent Textur-Rendering). Es ist schnell, einfach und „gut genug“ für viele Situationen. Es ist nicht ganz realistisch, aber, und würde wahrscheinlich nicht auf Foto-Qualität von Bildern verwendet werden.

Das ist schwer. Erstens wird ein Satz von RGB-Werten nicht eine Farbe definieren. Sie müssen im Licht der Primärfarben interpretiert werden, auf die sie sich beziehen (der Farbraum), wie sRGB, Rec.709, Rec.2020, Adobe RGB (1998), usw.

Ferner RGB-Werte, wie wir normalerweise begegnen sie lineare Licht nicht proportional sind: sie „codiert“ unter Verwendung einer nichtlinearen Funktion (gamma) sind. Und manchmal (in Video-Anwendungen meist) den Wert von „schwarz“ nicht Null ist, aber von Null versetzt, in der Regel 16 für 8-Bit-Werte. Und „weiß“ ist nicht 255, sondern 235. sRGB und Rec.709 Anteil RGB-Primär, aber ihre Gamma-Funktionen sind unterschiedlich.

Die Farbraumkonvertierung beginnt mit Schwarz, so dass schwarze Null ist versetzt zu entfernen. Wenn die Gamma-Funktion einen Haltepunkt in es (wie sRGB und Rec.709 tun) hat, müssen Sie sorgfältig die RGB-Werte so skalieren, dass „weiße“ 1,0 ist.

Dann „decode“ die Gamma durch die Umkehrung der ursprünglichen Gammafunktion zu tun. (Eine Antwort vorgeschlagen, um die Werte quadriert, die eine Annäherung an Gamma-Decodierung ist.) Nun linear-Licht RGB-Werte in einigen Farbraum Sie haben. An dieser Stelle können Sie aus diesem Farbraum Lab Raum zu umwandeln. Die meisten Umwandlungen von RGB nach Lab gehen durch einen Zwischenfarbraum XYZ genannt.

Die Schritte als verschachtelte Funktionsaufrufe:

Lab = XYZ2Lab (RGB2XYZ (gamma_decode (offset_and_scale (RGB), gammaFunction ) RGB-Farbraum ))

(Lab-Raum in 1976 als einen Versuch entwickelt wurde, ein wahrnehmbarer gleichförmiges Verziehen des Standard-CIE XYZ-Raumes zu schaffen. (Luv war ein weiterer Versuch.) Die Idee ist, dass der euklidischen (lineare) Abstand zwischen zwei Farben dass waren gerade deutlich anders (1 „JND“) der gleiche Abstand für zwei beliebige Farben sein würde. der Abstand zwischen zwei Farben im Lab wird als ‚Delta-E‘ bekannt. die einfache Delta euklidische Abstandsformel wird nun dE76 genannt. Siehe https://en.wikipedia.org/wiki/Color_difference )

In Ihrem Fall könnten Sie die beide Lab-Farben im Durchschnitt eine neue Lab Farbe zu erhalten, dann umkehren alle Konvertierungen in RGB, um wieder in dem gewünschten Farbraum.

Dies werden Sie schließen, ist jedoch nicht garantiert, einfach weil „Farbe“ ist eine menschliche Wahrnehmung, nicht eine physikalische Größe, und hat notorisch schwierig zuverlässig zu charakterisieren. Lab eigentlich nicht so gut funktionierte bei einheitlichem Eindruck vermittelt zu sein. Also anstatt Lab zu beheben, schlug sie eine neue, Komplex Delta-E-Funktion mit einer anderen Kette eingebaut: DE94. Das war besser, aber nicht perfekt, so ein weiterer Vorschlag entstand im Jahr 2000: DE2000. Auch besser, aber nicht perfekt. Sehen Sie die Wiki-Seite oben für weitere Informationen.

Wenn DE2000 ist nicht gut genug (oder zu komplex!) Sie vielleicht einen Blick auf eine Alternative zu Lab namens

denke ich, ist die Antwort von arntjw in die richtige Richtung geht, und erkennt die logarithmische Unterlage, wie jedoch von Dan W. erwähnt, ist die richtige geometrische Mittel nicht sqrt ((C1 ^ 2 + C2 ^ 2) / 2) , aber sqrt (C1 * C2). So ist die durchschnittliche Farbe wäre:

NewColor = sqrt(R1*R2),sqrt(G1*G2),sqrt(B1*B2)

Die resultierenden Farben sind näher an, was wir erwarten. Sie können durch Hinzufügen eines Exponenten seiner Komponenten, um mehr Farben mit höherer Ordnung Wurzeln, und das Gewicht jeder Farbe verallgemeinern.

Es gibt tatsächlich eine viel einfachere Art und Weise.

  • Skalieren Sie das Bild nach unten zu 1px von 1px.

    Die Farbe des 1px ist die durchschnittliche Farbe, was auch immer Sie skaliert

scroll top