Wie Wedge sagte , möchten Sie multiplizieren, um die Dinge heller zu machen, aber das funktioniert nur, bis eine der Farben gesättigt ist (dh Treffer 255 oder höher). An diesem Punkt können Sie die Werte einfach auf 255 klemmen, aber Sie werden den Farbton subtil ändern, wenn Sie heller werden. Um den Farbton beizubehalten, möchten Sie das Verhältnis (Mitte-Niedrigster) / (Höchste-Niedrigste) beibehalten.
Hier sind zwei Funktionen in Python. Der erste implementiert den naiven Ansatz, bei dem die RGB-Werte nur auf 255 begrenzt werden, wenn sie überschritten werden. Der zweite verteilt die überschüssigen Werte neu, um den Farbton intakt zu halten.
def clamp_rgb(r, g, b):
return min(255, int(r)), min(255, int(g)), min(255, int(b))
def redistribute_rgb(r, g, b):
threshold = 255.999
m = max(r, g, b)
if m <= threshold:
return int(r), int(g), int(b)
total = r + g + b
if total >= 3 * threshold:
return int(threshold), int(threshold), int(threshold)
x = (3 * threshold - total) / (3 * m - total)
gray = threshold - x * m
return int(gray + x * r), int(gray + x * g), int(gray + x * b)
Ich habe einen Verlauf erstellt, der mit dem RGB-Wert (224,128,0) beginnt und ihn mit 1,0, 1,1, 1,2 usw. bis 2,0 multipliziert. Die obere Hälfte ist das Ergebnis mit clamp_rgbund die untere Hälfte ist das Ergebnis mit redistribute_rgb. Ich denke, es ist leicht zu erkennen, dass die Umverteilung der Überläufe zu einem viel besseren Ergebnis führt, ohne den RGB-Farbraum verlassen zu müssen.

Zum Vergleich ist hier derselbe Farbverlauf in den HLS- und HSV-Farbräumen, der vom Python- colorsysModul implementiert wurde . Nur die LKomponente wurde modifiziert und die resultierenden RGB-Werte wurden geklemmt. Die Ergebnisse sind ähnlich, erfordern jedoch Farbraumkonvertierungen für jedes Pixel.
