Como Wedge said, quiere multiplicar para hacer las cosas más brillantes, pero eso solo funciona hasta que uno de los colores se satura (es decir, alcanza 255 o más). En ese punto, puede fijar los valores a 255, pero estará sutilmente cambiando el tono a medida que se aclare. Para mantener el tono, desea mantener la relación de (medio-bajo)/(más alto-más bajo).
Aquí hay dos funciones en Python. El primero implementa el enfoque ingenuo que simplemente fija los valores RGB en 255 si pasan de largo. El segundo redistribuye los valores en exceso para mantener el matiz intacto.
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)
I creó un gradiente empezando con el valor RGB (224,128,0) y multiplicándolo por 1,0, 1,1, 1,2, etc. hasta 2,0. La mitad superior es el resultado utilizando clamp_rgb
y la mitad inferior es el resultado con redistribute_rgb
. Creo que es fácil ver que la redistribución de los desbordamientos da un resultado mucho mejor, sin tener que abandonar el espacio de color RGB.
Para la comparación, aquí es el mismo gradiente en los espacios de color HLS y HSV, tal como se aplica por el módulo de Python colorsys
. Solo se modificó el componente L
y se realizó la fijación en los valores RGB resultantes. Los resultados son similares, pero requieren conversiones de espacio de color para cada píxel.
¿Qué lenguaje de programación? – Horcrux7
El lenguaje de programación no tiene importancia. –