Ich möchte die Farbe eines Pixels in Richtung Weiß ausbleichen lassen, aber natürlich die gleiche Farbe beibehalten. Wenn ich ein Pixel (200,120,40)
habe, wird jedem Wert 10 hinzugefügt, um (210,130,50)
zu der gleichen Farbe zu machen, nur heller, oder ändert er die Farbe vollständig? Zum Beispiel weiß ich, dass (100,100,100)
bis (110,110,110)
ein Graustufen-Fade ist. Ich möchte das gleiche mit RGB-Werten und ich möchte es numerisch tun, wie angegeben. Gibt es dafür eine Gleichung?
Es gibt eine Reihe von Möglichkeiten, dies zu tun. Wie Sie es tun, hängt davon ab, ob Sie Geschwindigkeit und Einfachheit oder Gleichförmigkeit der Wahrnehmung schätzen. Wenn Sie es wirklich uniform benötigen, müssen Sie RGB-Farben mit einem Farbprofil definieren, und Sie benötigen die Primärfarben des Profils, damit Sie in XYZ und dann in LAB konvertieren können, wo Sie den L-Kanal bearbeiten können. p>
Meistens müssen Sie das nicht tun und stattdessen können Sie ein einfaches HSB-Modell wie Photoshop in der Info-Palette verwenden.
Stellen Sie sich dazu einfach eine Linie zwischen Ihrem RGB-Punkt und dem weißen Punkt im 3D-Raum vor und verschieben Sie Ihre Farbe entlang dieser Linie. In der Praxis können Sie einfach eine parametrische Gleichung für diese Linie erstellen und den Parameter verschieben.
%Vor%Ein Prozentsatz von 0.0 wird die gleiche Farbe zurückgeben und 1.0 wird weiß zurückgeben. Alles dazwischen wird ein hellerer Farbton desselben Farbtons sein. Dies sollte zu Ergebnissen führen, die mit der HSB-Implementierung von Photoshop übereinstimmen, aber gerätabhängig sein und möglicherweise nicht vollkommen einheitlich sein.
Wenn Sie RGB [200, 100, 50]
haben und einen Prozentsatz von .50 eingeben, sollte RGB[ 227.5 177.5 152.5]
Photoshop beide als Farbton von 20º zurückgeben.
Es ist nicht schwer, dies ohne Nummer zu machen, aber die elementweisen Operationen sind praktisch.
Bearbeiten basierend auf Kommentar:
Ich schlage nicht vor, dass Sie das tun, wenn Sie nicht wissen, dass Sie es wirklich auf die harte Tour tun müssen. Aber wenn Sie in LAB konvertieren möchten, können Sie ohne große Probleme. Das Wichtigste ist, dass Sie wissen müssen, mit welchem Farbraum Ihre RGB-Zahlen beginnen, oder Sie müssen einige Annahmen über ihre Bedeutung treffen. Da sRGB ziemlich Standard im Internet ist, nehme ich das hier an.
Die Konvertierungen sind nicht so schwierig, aber es ist leicht, Fehler zu machen. Glücklicherweise gibt es ein schönes Colormath-Modul mit guter Dokumentation: Ссылка
Damit können Sie zwischen sRGB und LAB folgendermaßen konvertieren:
%Vor% lab ist jetzt eine Farbe mit einem Luminanzkanal lab.lab_l
, mit dem Sie zwischen Schwarz (0) und Weiß (100) nach oben oder unten gehen können. Dies sollte wahrnehmbar einheitlicher sein als HSB (aber, abhängig von Ihrer Anwendung, vielleicht nicht genug, um die Arbeit zu rechtfertigen).
Sie können einfach lab_l
ändern und dann zurück konvertieren:
new_sRGB
ist jetzt [198, 198, 198]
. colormath kümmerte sich um die Themen Licht und Gamma für Sie.
Ich bevorzuge den HSV-Farbmodus .
Um Ihre Farbe grauer zu machen, müssen Sie den Sättigungsfaktor verringern.
Das Standardmodul colorsys kann in RGB & lt; - & gt; HSV-Konvertierungen, aber bitte beachten Sie: colorsys
arbeitet mit Kanalwerten im Bereich [0, 1), nicht [0, 256].
Es gibt ein vollständiges Codebeispiel:
%Vor%Es ist nicht so einfach, denn auf Ihrem Monitor wird jeder Farbkanal anders gewichtet. Ich würde sagen, die beste Wette ist, dies in scikit image zu tun, indem man in grau umwandelt, verdunkelt oder aufhellt und dann zurück in Farbe konvertiert. Scikit-image sorgt dafür, dass die Farben nicht verändert werden.
%Vor%Wenn Sie direkt mit Farbton, Sättigung und Wert arbeiten möchten, sehen Sie sich dieses Beispiel an:
Wie von MarkM vorgeschlagen, ist HSB (oder HSL) eine einfache Methode, um dies zu tun, ergibt aber keine perfekte Farbtonkonstanz. Wenn das gut genug ist (ich nehme an, Sie wollen Ihre eigene Methode anstelle eines Moduls) dann dies Seite hat Code dafür.
In Python würde es so aussehen:
%Vor%Dann zum Aufhellen:
%Vor%Der Vorteil dieser Methode ist, dass das Inkrement ein Prozentsatz der Gesamt Helligkeit ist. Das zu ändern, um den Prozentsatz als Eingabe zu nehmen, wäre trivial.
Sie können die mathematischen Gleichungen aus diesem Code zurückentwickeln, oder HSL zu RGB .
Die Frage, "um die Farbe eines Pixels in Richtung Weiß zu verblassen" (nicht irgendein Grauton), besteht eigentlich darin, die ursprüngliche Pixelfarbe mit Weiß zu mischen, ausgehend von 100% Originalfarbe und 0% Weiß bis 0%. Originalfarbe und 100% Weiß. Es gibt nicht mehr. Dies würde beispielsweise in 101 Schritten so aussehen:
%Vor%Sie können diese Antwort von denis :
RGB - & gt; ^ Gamma - & gt; Y - & gt; L *
In der Farbwissenschaft die üblichen RGB-Werte, wie in html rgb (10%, 20%, 30% ), werden "nichtlinear" oder Gamma genannt korrigiert "Linear" Werte sind definiert als
%Vor%wo Gamma 2,2 für viele PCs ist. Die üblichen R G B werden manchmal geschrieben als R 'G' B '(R' = Rlin ^ (1 / Gamma)) (Puristen Zunge-Klick) aber hier Ich werde die 'fallen lassen.
Die Helligkeit auf einem CRT-Display ist proportional zu RGBlin = RGB ^ Gamma, 50% Grau auf einer CRT ist ziemlich dunkel: .5 ^ 2,2 = 22% des Maximums Helligkeit. (LCD-Displays sind komplexer; außerdem einige Grafiken Karten kompensieren Gamma.)
Um das Helligkeitsmaß%
%Vor%L*
aus RGB zu erhalten, teile zuerst R G B um 255 und berechnenDies ist
Y
im XYZ-Farbraum; es ist ein Maß für die Farb- "Leuchtdichte". (Die echten Formeln sind nicht genau x ^ gamma, aber nahe; bleib dabei x ^ gamma für einen ersten Durchgang.)Schließlich, L * = 116 * Y ^ 1/3 - 16 "... strebt nach Wahrnehmungsgleichförmigkeit ... entspricht der menschlichen Wahrnehmung von Leichtigkeit." - Wikipedia Lab Farbraum
Tags und Links python image image-processing pixel colors